什么是PRC
RPC是远程过程调用(Remote Procedure Call)的缩写形式。用户可以在不知道底层的调用细节情况下,提供象在本地调用服务的体验。
优点
可以提供微服务;可提供分布式部署;提高系统扩展性;效率高;低延时。
缺点
- 不能跨语言,例如java的不能给go调用;
- 如果想要实现可以用http封装一层
- 效率依赖于网络环境
实现一个简单的RPC服务
网络异常,图片无法展示
|
序列化传输协议
- hessian 二进制传输协议效率高
- protostuff 二进制传输协议效率高
- JSON 字符串,协议可读性高
协议组装
协议组装大概是反射调用的一些必备信息,注意协议的类需要可以序列化处理
- 请求协议
private String id; private String version; private String className;// 类名 private String methodName;// 函数名称 private Class<?>[] parameterTypes;// 参数类型 private Object[] parameters;// 参数列表 private String ip;//IP private int port;//端口 复制代码
远程请求的服务地址如何获取
服务端对外暴露一个ip+端口
- 可以把地址暴露在zookeeper的临时节点上。
- 可以把服务暴露在ngnix(socket)上进行服务转发
远程请求
- http的客户端
- socket客户端
我们可以把请求的过程给屏蔽掉,走客户端调用服务器,然后解析返回的数据,返回给用户,让用户的调用感觉是在本地调用一样。
屏蔽的方式这里用到了动态代理模式、基本就是jdk自带的和cglib库。
可参考 java动态代理的两种demo
返回数据解析
返回数据是序列化的直接进行强转对象了
2.数据返回协议
private String requestId; private int code;//-1失败 0成功 private String errorMsg; private Object data; 复制代码
客户端得到返回的数据
数据传输对客户端是无感的,接收到返回数据后可以进行其他处理了。