• 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.

  • *
  • *
  • 相关阅读:
    大四软件工程实训 总结 | TMS 物流管理系统 | 我们各自担任了产品经理、项目经理、IT总监、后端、前端和测试
    区块链3.0时代 基于GoMars构建的新概念TravelFi能否注入新力量?
    恶意加密流量检测
    如何在 Kubernetes 集群上设置 Jenkins – 初学者指南
    Mybatis动态SQL
    【css拾遗】粘性布局实现有滚动条的情况下,按钮固定在页面底部展示
    【腾讯云云上实验室-向量数据库】TAI时代的数据枢纽-向量数据库 VectorDB
    动手学深度学习(Pytorch版)代码实践 -深度学习基础-06Softmax回归简洁版
    阿里云4核16G服务器咋收费?26元1个月、149元半年
    Eureka介绍与使用
  • 原文地址:https://blog.csdn.net/u010813622/article/details/127542307