• Solr plugin热部署原理


    个人站点原文:程军高的个人博客 | 详情

    一、热部署原理

            众所周知ava是静态的强类型语言,一旦编译好Class文件后,那程序就会按照编译好的Class文件执行,变量、 类型、逻辑将都无法更改。如果需要进行逻辑修改,我们必须要重新编码、编译、替换原始Class,并重新启动程序,这对于我们一般无状态服务是没有问题的,但是对于基础数据服务却是非常的麻烦。
            以Solr Cloud为例,如果我们需要更新自定义的Solr分词器,在没有热部署的情况下,我们必须替换Solr集群的依赖Solr plugin jar,并重启整个集群。这样的话,就会非常的耗时,也存在风险。目前热部署里面比较成熟的框架ASM,我们今天暂时不讨论这个方向,为了研究Solr的热部署原理,我们从比较简单的ClassLoader出发。


    1.1 分析问题的实质

            所谓热部署就是要在程序运行的时候,我们需要替换其在内存里的Class文件(或者说Class对象),阅读java.lang.Classloader源码可以知道,Class对象由加载此Class文件的ClassLoader持有。如果想要替换内存中的Class对象,我们就必须知道Class是如何从磁盘加载至内存中的。

    从loadClass方法可以知道,获取Class对象的过程:

    1. 从本ClassLoad分配的元空间内存中获取Class对象
    2. 如果没有load过,则分配父的ClassLoader进行加载class
    3. 如果没有父ClassLoader,则说明此ClassLoader是顶层的BootstrapClassLoader,则使用findBootstrapClass(native方法)查找Class对象。
    4. 如果经过2或者3步骤class仍然为null,则执行本ClassLoader的findClass方法(native方法),一般从磁盘的jar中查找。
    5. 如果找到class,jvm则负责注册至元空间,并返回此Class对象
    1. /**
    2. * Loads the class with the specified binary name. The
    3. * default implementation of this method searches for classes in the
    4. * following order:
    5. *
    6. *
      1. *
      2. *
      3. Invoke {@link #findLoadedClass(String)} to check if the class

    7. * has already been loaded.

  • *
  • *
  • Invoke the {@link #loadClass(String) loadClass} method

  • * on the parent class loader. If the parent is null the class
  • * loader built-in to the virtual machine is used, instead.

  • *
  • *
  • 相关阅读:
    莱佛士学生服装设计作品登知名时尚杂志NÜYOU
    现在加入3D游戏建模有没有前景,次世代全流程来啦
    数组更新检测
    【电路笔记】-诺顿定理(Norton‘s Theorem)
    第三章:高精度算法(加、减、乘、除)
    [Azure - VM] 解决办法:无法通过SSH连接VM,解决错误:This service allows sftp connections only.
    【校招VIP】java专业课之分页、分段
    Springboot老年人社区服务平台设计与实现x45mt计算机毕业设计-课程设计-期末作业-毕设程序代做
    单例模式~
    【Pytorch with fastai】第 13 章 :卷积神经网络
  • 原文地址:https://blog.csdn.net/u010813622/article/details/127542307