![线上解决方案](http://oss.yeas.fun/halo-yeas/big-bg2_1635645694223.jpg)
线上解决方案
![像本服一样调用远程代码(优化版)](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202003%2F31%2F20200331142628_ulung.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1653918042&t=67265db0af90a6fc3a89687f22826161)
在上一篇 像本服一样调用远程代码(跨进程远程方法直调)中,我们已经详细讲解了跨服方法调用的原理。但示例代码里有一些实现方式是自己实现的方式,相对比较原始。这里对其中2点的实现进行优化优化1:本地方法直调改为reflectam
![Arthas原理:Arthas的命令分类及原理](https://img2.huashi6.com/images/resource/2020/11/26/859h15323p0.jpg?imageMogr2/quality/100/interlace/1/thumbnail/2000x%3E)
在[Arthas原理:理解ClassLoader](//yeas.fun/archives/arthas-classloader)一文中,我们首先介绍了代码隔离的概念,并讲解了代码隔离的基础:ClassLoader; 在[Arthas原理:如何做到与应用代码隔离?](//yeas.fun/archives/arthas-isolation)一文中,我们介绍了利用ClassLoader实现代码隔离的原理,并讲解了Arthas与应用之间的代码在代码隔离的基础上如何进行代码互调的。
代码隔离,也就是arthas所保证的:对业务代码无侵入,目标应用无需重启也无需感知arthas的存在。 那首先我们来讲下:arthas为什么要进行代码隔离? 我们都知道arthas是一个开源框架,它是在应用正在运行的时候,打通应用与arthas的连接通路。这就对arthas提出一个需求:arthas不能影响应用运行的代码,不能因为arthas的连接而导致业务逻辑的运行不正常。 同样的,应用里面的代码也不能影响arthas的正常工作。即:arthas的代码要和应用代码进行隔离,从机制上保证双方的互不干扰。
![Arthas原理:理解ClassLoader](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201506%2F07%2F20150607212017_HNhmE.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1645431837&t=7e7c96e92c1b029957563f7105af45b7)
阿里的arthas一经推出就大受好评,主要原因就是它提供了一套线上问题的解决方案,比如可以在线查看服务器状态;可以支持热更新,原理类似我们之前所讲的[JAVA热更新1:Agent方式热更](//yeas.fun/archives/hotswap-agent) ; 它还可以支持对线上的代码跟踪执行情况,打印执行参数和返回参数等功能。功能那是异常强大,关键的一点是它对应用是无侵入的,也就是不影响到目标应用的业务逻辑。
![像本服一样调用远程代码(跨进程远程RPC方法直调)](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13436084638%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1642426648&t=3cb236f82a4cc30f5dc224f63e627de7)
想要调用远程方法,传统的方式需要以下几个步骤: 需要先判断是否是本服请求。如果是本服,则执行本服逻辑;如果是跨服,则需要把请求发到对应服务器上; 跨服务之间的消息通信; 消息发送到跨服之后,如何根据参数来调用对应的代码?
![JAVA不停服执行代码(动态代码执行)](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Ffe41128305c5b898083bdde95d5ba3fca6f6f8e6.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639976374&t=cb77a75c2667f3a38a38a8e6e5133af3)
在项目上线之后,不可避免的会遇到出BUG的情况。之前的做法可能是提前写好一段代码,然后通过后台接口来进行调用。但这种方式必须得提前写好规整逻辑,但不能覆盖所有情况。因此我们就期望直接在线上执行一段代码,来进行我们业务数据的规整。这就是JAVA不停服在线上执行代码。
![Java线上解决方案系列目录](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fd.zdqx.com%2Ffuli_20190509%2F001.jpg&refer=http%3A%2F%2Fd.zdqx.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1670327216&t=355faee927f9af864b2a164a38972df7)
从事游戏行业多年,一直使用Java做开发,不可避免的就经历了许多,其中也踩过不少坑。最早的游戏是不支持热更的,导致出了BUG就必须停服;后续项目引入热更,但也不是特别完美,再往后热更升级,引入第二版:动态加载子类热更;受第二版热更方式启发,后来又加入了线上动态代码执行,主要用于规整数据
![JAVA热更新2:动态加载子类热更](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F8e1c3554dadccaa1b11085fc36a92efc8730b22f.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639059079&t=cd5de443063b0c1f18ed5642f7ad7230)
上一篇《JAVA热更新1:Agent热更》我们讲解了JDK提供的Agent方式来实现代码不停服更新,受限于JDK的Agent一些限制,这种方式无法实现以下功能:只能修改方法体,不能变更方法签名、不能增加和删除方法/类的成员属性。对于Instrumentation和JVM的agent...