RPC框架:
一般情况下,RPC框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这样的RPC框架才算真正合格的。
从上图可以看出:服务提供端Server 向注册中心注册服务,消费者Client通过注册中心拿到服务相关信息,然后再通过网络请求服务端Server。
1. 注册中心
注册中心是先要有的。 负责服务地址的注册与查找,相当于目录服务。服务端启动的时候将服务名称及其对应地址(ip+port)注册到注册中心,服务消费端根据服务名称找到对应的服务地址。有了服务地址之后,服务消费端就可以通过网络请求服务端了。
2. 网络传输
既然我们要调用远程的方法,就要发送网络请求来传递目标类和方法的信息以及方法的参数等数据到服务提供端。(Netty)
3. 序列化和反序列化
因为网络传输数据必须是二进制的。 java对象在网络中传输我们需要将其序列化为二进制的数据。
4. 动态代理
RPC主要目的就是让我们调用远程方法像调用本地方法一样简单,我们不需要关心远程方法调用细节比如网络传输
如何屏蔽呢? 动态代理。
5. 负载均衡
我们将服务部署在了多台服务器上,当客户端发起请求时候,多台服务器都可以处理这个请求。
那么如何正确选择处理该请求的服务器就很关键。 负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机
崩溃等问题。
6. 传输协议
我们还需要设计一个私有的RPC协议,这个协议是客户端和服务端交流的基础。
需要通过设计协议,定义需要传输哪些类型的数据,并且还会规定每一种类型的数据应该占多少字节。这样我们在接收到二进制数据之后,就可以正确解析出我们需要的数据。
指定传输协议: 主要包括这些内容:
1. 魔数:4个字节
2. 序列化器编号:是json还是啥
3. 消息体长度: 看看多长啥的。