项目连接:yu-rpc: 从 0 到 1,带你开发自己的 RPC 框架
RPC框架理论
什么是RPC
RPC(remote procedure call) 远程过程调用,是一种计算机通信协议,允许程序在不同计算机之间进行通信和交互,像本地调用一样。(很轻松的完成我在向其它系统发请求的过程)
url = "http://yupi.icu"
req = new Req(参数1,参数2,参数3)
res = httpclient.post(url).body(req).execute()
orderId = res.data.orderId
而有了RPC框架,项目B可以通过一行代码完成调用!
orderId =orderService.order(参数1,参数2,参数3)
基础的RPC框架有哪些模块
服务消费者要调用服务提供者的方法,提供者把方法通过一个接口提供出来(通过web服务器编程接口,yupi.icu/order)
如果提供者提供了多个服务和方法,每个接口和方法都要单独写一个接口?消费者要每个接口写一段HTTP调用的逻辑吗?
提供一个统一的服务调用接口,通过请求处理器根据客户端的请求参数来进行不同的处理,调用不同的服务和方法。
在服务提供者程序维护一个本地服务注册器,记录服务和对应的实现类的映射。
现在,不论需要调用哪个方法,都访问同一个web服务器的接口,由接口连接请求处理器,请求处理器做转发去找对应的实现类。
Java对象无法直接在网络中传输,要对传输的对象进行序列化和反序列化
RPC框架就是代理服务,消费者说明要调用哪个service,RPC代理服务帮助你发请求,去调用这个提供者,提供者完成相应后,RPC把这个响应处理完再给你。(下图是最简单的RPC框架,虚线部分为RPC)
RPC框架可以怎么扩展
1. 服务注册发现
问题1:消费者如何知道提供者的调用地址呢?
解决:建立一个注册中心,来保存服务提供者的地址。消费者要调用服务时,只需从注册中心获取对应服
务的提供者地址即可。架构图如下:
一般用现成的第三方注册中心,比如Redis、Zookeeper、ETCD即可。
2. 负载均衡
问题2:如果有多个服务提供者,消费者应该调用哪个服务提供者呢?
解决:给服务调用方增加负载均衡能力,先从注册中心获取到可用的ip结点(是一个列表),通过指定不同的算法来决定调用哪一个服务提供者,比如轮询、随机、根据性能动态调用等。架构图如下:
3. 容错机制
问题3:如果服务调用失败,应该如何处理呢?
为了保证分布式系统的高可用,我们通常会给服务的调用增加一定的容错机制,比如失败后自动重试、降级调用其他接口等等。架构图如下:
4. 其他问题
问题4:服务提供者下线了怎么办?
解决:需要失效节点剔除机制。
问题5:服务消费者每次都从注册中心拉取信息,性能会不会很差?
解决:直接把消费者拉取到的信息缓存到本地,不用每次都从注册中心拉取,使用缓存来优化性能。
问题6:如何优化RPC框架的传输通讯性能?
解决:选择合适的网络框架、自定义协议头、节约传输体积等。
问题7:如何让整个框架更利于扩展?
解决:使用Java的SPI机制、动态配置、动态代理、配置化等等。