loveqq 框架!真正不停机热部署,支持新增类字段、类方法,不再局限于只能修改方法体!

为什么需要热部署?

    主要是因为大型 java 项目启动耗时长,对于开发阶段来说,增加大量调试成本。对于生产环境来说,则会对客户造成短暂的服务不可用,特别是仅仅修改了少量的情况,确需要重启整个应用,实在是没有必要。

热部署难点?

    java 项目热部署的最大的难点是,class 字节码一旦被 jvm 加载生成 class,就不能再修改。即使使用 agent 也只能修改方法体,而不能新增方法、新增字段。

    其次,是对各个框架的支持,如果新的 class 是个配置类,对应的三方组件能否正确更新。

    还有是否支持远程部署等。

loveqq 如何实现真正的热部署?

    1、如何实现修改方法体的热部署?

          loveqq 框架内置了 HotSwapAgent,通过 Instrumentation#redefineClasses 实现方法体的热更新,这个是 jvm 直接支持的

    2、如何实现新增字段、方法?

         这个功能用到 decevm,这是一个开源项目。支持 jdk8、jdk17,更新的 jdk 版本可以直接使用 JetBrainsRuntime jdk 即可

    3、如何支持第三方框架、插件?

        loveqq 框架实现热部署的方式是自定义 JarIndexClassLoader,直接继承 PlatformClassLoader,摒弃掉了内置的 AppClassLoader。

        因此 JarIndexClassLoader 接管了全部的类加载细节。所以 JarIndexClassLoader 支持直接接受一个 JarFile 对象来更新自己的资源。

        然后利用 loveqq 框架的全量 ioc 容器刷新机制,直接全量刷新容器即可。由于仅仅指定的 JarFile 被卸载,所以全量刷新效率很高,一般在 1s 以内。

     4、全量刷新如何做到不停机?

        有的朋友可能疑问,全量刷新,那么 WebServer 是不是也重建了,这难道不会中断服务吗?

        不会!因为 loveqq 框架具有 ApplicationScope 作用域,可以保证全量刷新也不会重建 WebServer,所以是真正的不停机热部署!

接入示例

    首先创建一个多模块项目,然后添加一个下面的控制器:

package com.kfyty.hot.deploy.controller;

import com.kfyty.loveqq.framework.boot.context.ContextRefresher;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Value;
import com.kfyty.loveqq.framework.core.lang.JarIndexClassLoader;
import com.kfyty.loveqq.framework.core.utils.ClassLoaderUtil;
import com.kfyty.loveqq.framework.core.utils.IOUtil;
import com.kfyty.loveqq.framework.web.core.annotation.RequestMapping;
import com.kfyty.loveqq.framework.web.core.annotation.RestController;
import com.kfyty.loveqq.framework.web.core.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

@RestController
@RequestMapping(value = "/hot", expose = true)
public class HotDeployController {
    /**
     * 这个值是打包后的 boot-lib 文件夹路径,里面是依赖包
     */
    @Value("${bootLibPath:C:\\Users\\admin\\Desktop\\boot-lib}")
    private String bootLibPath;

    /**
     * 热部署,覆盖 boot-lib 文件夹下的依赖包,然后进行热部署
     *
     * @param jars jar 包,命名必须和已有的库名称相同
     */
    public String deploy(List<MultipartFile> jars) throws Exception {
        // 构建的 JarFile
        List<File> jarFiles = new LinkedList<>();

        // 覆盖到依赖 jar 包
        for (MultipartFile jar : jars) {
            File file = new File(this.bootLibPath, jar.getOriginalFilename());
            try (ZipInputStream in = new JarInputStream(jar.getInputStream());
                 ZipOutputStream out = new JarOutputStream(new FileOutputStream(file))) {
                IOUtil.copy(in, out, "");
                jarFiles.add(file);
            }
        }

        // 部署到框架 ClassLoader
        JarIndexClassLoader classLoader = ClassLoaderUtil.getIndexedClassloader();

        classLoader.deploy(jarFiles);

        // 刷新上下文
        ContextRefresher.refresh();

        return "ok";
    }
}

    打包后使用 jar 包启动,然后通过 http://127.0.0.1:8080/hot/deploy 上传修改后的 jar 包即可观察热部署效果。

    感兴趣的同学可以尝试一下。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://www.oschina.net/news/380727

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。