RPC (Remote Procedure Call Protocol)远程调用协议
1.怎么做到透明化的远程调用协议?---动态代理
怎么封装才能像调用本地程序一样调用服务?对java而言就是使用代理!
java的代理方式有两种:①动态代理 ② 字节码生成
字节码生成 这种方式更为高效和强大,但代码不易维护,所以大部分公司实现RPC框架时选择 动态代理!
有了实现方式以后,就面临对消息的编码和解码处理,以便于传输
2.如何对消息编码和解码?
动态代理需要实现InvotionHandler接口,里面有个invoke方法,该方法封装通信细节,此时需呀确定服务端和客户端互相通讯的消息结构。
客户端的消息结构一般包括以下几种:
- 接口名称
- 方法名
- 参数类型和参数值
- 超时时间
- requestID,标示唯一请求ID
同理,服务端返回的消息结构一般包括以下内容:
- 返回值
- 状态code
- requestID
确定了消息结构下一步就考虑序列化
序列化,就是将数据结构或者对象转换成二进制串的过程,也就是编码过程
反序列化,就是把序列化过程中生成的二进制串转换成数据结构或者对象的过程
目前国内各大互联网公司广泛使用hessian、protobuf、thrift、avro等成熟的序列化解决方案来搭建RPC框架,这些都是久经考验的解决方案。
序列化完之后,就考虑通信
3.通信
该博客参考 https://www.cnblogs.com/panxuejun/p/6094790.html