一个最简单的RPC服务流程

191 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

什么是PRC

RPC是远程过程调用(Remote Procedure Call)的缩写形式。用户可以在不知道底层的调用细节情况下,提供象在本地调用服务的体验。

优点

可以提供微服务;可提供分布式部署;提高系统扩展性;效率高;低延时。

缺点

  1. 不能跨语言,例如java的不能给go调用;
  2. 如果想要实现可以用http封装一层
  3. 效率依赖于网络环境

实现一个简单的RPC服务

image.png

序列化传输协议

  1. hessian 二进制传输协议效率高
  2. protostuff 二进制传输协议效率高
  3. JSON 字符串,协议可读性高

协议组装

协议组装大概是反射调用的一些必备信息,注意协议的类需要可以序列化处理

  1. 请求协议
	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+端口

  1. 可以把地址暴露在zookeeper的临时节点上。
  2. 可以把服务暴露在ngnix(socket)上进行服务转发

远程请求

  1. http的客户端
  2. socket客户端

我们可以把请求的过程给屏蔽掉,走客户端调用服务器,然后解析返回的数据,返回给用户,让用户的调用感觉是在本地调用一样。

屏蔽的方式这里用到了动态代理模式、基本就是jdk自带的和cglib库。

可参考 java动态代理的两种demo

返回数据解析

返回数据是序列化的直接进行强转对象了

2.数据返回协议

    private String requestId;
    private int code;//-1失败  0成功
    private String errorMsg;
    private Object data;

客户端得到返回的数据

数据传输对客户端是无感的,接收到返回数据后可以进行其他处理了。