暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

热部署和热加载的区别?怎么设计一个热部署可落地的方案?

Lord Lean Notes 2020-01-15
612

Tomcat容器是我们一直都在接触的容器,我们在工作中修改了jsp文件之后往往不用重启启动容器,jsp修改后的内容就会显示出来,这就是基于类加载来实现的。下面我们就对热加载和热部署来进行分析和学习。

热加载

什么是热加载,热加载的场景我们在上面已经告知,他不用重启容器,而直接可以显示修改后的内容。那么他是如何实现的呢,下面我们来进行分析。
热加载的机制实现是基于破坏双亲委派机制,我们先来看下tomcat中采用到的类加载:

上图是tomcat的类加载器,下面来对图中的几种类加载器功能进行学习:
  • common类加载器:是应用类加载器的父类加载器,是tomcat最顶层的共用类加载器。其默认加载的jar包路径是${catalina.home}/lib下的。catalina.home是由catalina.properties中的common.loader指定的

  • catalina类加载器:是common类加载器的子类加载器,用于加载tomcat应用服务器的类加载器,加载路径是由server.loader指定,默认为空,说明交由common类加载器加载

  • shared类加载器:是common类加载器的子类加载器,用于加载web应用服务器的类加载器,加载路径是由shared.loader指定,默认为空,说明交由common类加载器加载

  • webApp类加载器:是shared类加载器的子类,加载/WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib目录下的jar包,该类加载器只对当前Web应用可见,对其他Web应用均不可见。

  • jsp类加载器:是webApp类加载器的子类,加载每个web应用中的jsp文件


当我们修改jsp文件之后,当这个文件的最后的修改时间发生了变化,就新建一个jsp类加载加载这个jsp文件,在把加载后的文件置入到JVM内存中后,就把原先的jsp文件利用gc回收掉。

热部署

上面我们对热加载进行了学习,现在我们来对热部署进行学习。最初在学习时对热加载和热部署的理解是这两个东西的原理都是一样的,最终经过讨论之后,发现这两个虽说实现方式都是基于破坏了双亲委派机制来实现的,但是他们的用途是不相同的。热加载适用于当我们修改jsp文件和修改java文件少量内容时[这里不包括静态变量、类名等属性],是不需要重新启动容器的。

而热部署针对的是每个web应用,当我们修改了java文件中的静态变量和类名等属性之后,和JVM内存中对应的属性不相同时,这时就需要采用热部署的方式。下面是小编我自己思考出来的一种可落地的大致方案:

1.在启动tomcat容器时就初始化一个定时任务,并且在加载类时区分开进行加载。为何要分开进行加载,怎么分开加载?让父类加载器加载公共的类文件,让我们自己实现的子类加载器加载我们自己写的java文件。这样做的目的是一些公共的类文件不会一直做变化,我们交由父类加载可以一次加载多次使用,而不用担心发生改变的情况发生。而我们自己写的java文件交由我们自己实现的类加载器来加载,并且把我们自己实现的类加载器文件的路径记录下来,方便检测。
这个定时任务的作用是定时检测我们自己实现的java文件最后的修改时间是否发生变化,并且检测出来我们修改了java文件的内容,这时就需要新初始化一个classLoader,让这个classLoader来加载我们我们自己写的类文件,并重新替换掉原先类加载器加载的文件,并置入到JVM内存中,把原先类加载器加载的文件设为可回收对象,让其被gc




文章转载自Lord Lean Notes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论