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对象
    /**
     * Loads the class with the specified <a href="#name">binary name</a>.  The
     * default implementation of this method searches for classes in the
     * following order:
     *
     * <ol>
     *
     *   <li><p> Invoke {@link #findLoadedClass(String)} to check if the class
     *   has already been loaded.  </p></li>
     *
     *   <li><p> Invoke the {@link #loadClass(String) <tt>loadClass</tt>} method
     *   on the parent class loader.  If the parent is <tt>null</tt> the class
     *   loader built-in to the virtual machine is used, instead.  </p></li>
     *
     *   <l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值