文章目录
一、什么是RPC框架?
RPC | 描述 |
---|---|
概念 | ① RPC处于网络通信模型中会话层,它是建立在TCP/IP协议上的一个通信会话协议。它定义了网络通信中不同服务之间的交互模式,使得我们可以直接通过RPC调用其它服务的方法,而不需要关注网络上具体的通信细节。 ② RPC其本质就是一个请求响应模式。客户端发起请求,服务器返回响应 (类似于Http)。 |
组成部分 | (1)Service:暴露方法的服务提供方。 主动将IP地址、端口以及暴露的方法等信息,注册到注册中心,并且在通信层监听RPC请求,收到消费方的RPC请求后,调用本地方法并返回执行结果,序列化成请求报文,在通信层响应Http请求。 (2)Client:调用远程服务的消费方。 通过接口调用,底层通过动态代理生成代理对象,序列化参数为请求报文,并通过RPC框架向服务方发送Http请求。 (3)Registy:服务注册与发现的注册中心(Nacos、Zookeeper等),可以提供负载均衡、动态配置等功能。 |
RPC调用过程 | (1)消费方开始调用RPC方法,底层是通过【动态代理】生成了接口的代理对象,代理对象将方法参数进行序列化操作,通信层调用RPC向服务方发送Http请求。 (2)服务方的通信层监听到Http请求后,调用本地方法得到返回值后,序列化成请求报文,在通信层响应Http请求。 (3)消费方的通信层收到响应请求后,将参数进行反序列化,得到结果对象,然后结束RPC调用。 |
RPC涉及技术 | (1)动态代理: 消费方实现了一个加 @FeignClient 注解的远程调用接口,然后进行接口方法调用时,RPC底层会通过Jdk动态代理生成代理对象,在invoke方法内部进行Http请求的封装(序列化),以及发送Http 请求,处理Http响应结果,进行反序列化封装结果。 (2)序列化: RPC本质上是Http调用,因此为了能在网络通信中传输Java对象并接收,需要对其进行序列化与反序列化操作,我们可以导入java.io包,实现Serializable接口,对于不想序列化的属性,我们可以用transient关键字修饰。 (3)通信层基于netty这一IO通信框架。 (4)服务的注册与发现中心: 常用的包括Nacos、Zookeeper、Redis等。 |