# 像本服一样调用远程代码(优化版)
## 系列介绍目录:
[Java线上解决方案系列目录](//yeas.fun/archives/solution-contents)
## 背景
在上一篇 [像本服一样调用远程代码(跨进程远程方法直调)](//yeas.fun/archives/remoting-invoke)中,我们已经详细讲解了跨服方法调用的原理。
但示例代码里有一些实现方式是自己实现的方式,相对比较原始。这里对其中2点的实现进行优化
## 优化1:本地方法直调改为reflectasm框架
上一篇中调用本地方法因为性能原因,并不是利用反射,而是通过cglib框架对原有类生成字节码来进行调用,这样基本和直接调用本地方法没有区别。
对于这个功能是有成熟框架的:reflectasm,它的原理和我们的实现是一样的,也是基于asm框架来生成字节码。
源码也很简单,就5个类,有兴趣的同学可自行研究。它号称是性能更高的反射框架,这里有一篇文章是介绍其用法的:https://houbb.github.io/2018/07/20/asm-14-reflectasm
## 优化2:参数序列化方式调整为protostuff
前一篇我们对于参数的序列化和反序列化也是自实现的,代码相对比较丑陋,这里可利用protostuff去实现。我们都知道protobuf在传输前是需要先生成proto类的,但在远程方法调用时我们根本不知道传的参数是什么,而protostuff就是为了解决这个痛点。它在发送Object[]
数组时,会把参数的类型同时传过去, 而且对于一些已知类型,它会把类型映射为特定字符,这样可以极大的压缩数据量。
## 示例代码github:
因为2个优化相对比较简单,这里我就不贴源码了,大家有兴趣可以直接到示例代码去查看
[https://github.com/cm4j/cm4j-all](https://github.com/cm4j/cm4j-all)
## --- END ---
像本服一样调用远程代码(优化版)