自己动手实现RPC框架

前言


RPC的文章看了不少,但是始终感觉似懂非懂,古人说的”纸上得来终觉浅,绝知此事要躬行”还是很有道理的。
所以我希望通过一个真正的项目,来加深对RPC的认识。

这应该会是一个系列文章,至少在我动笔的这一刻是有非常强烈的意愿完成它的。

主要参考CSDN博客一起写RPC框架开篇说明

2018-09-03续,果不其然,还是因为诸多事情耽搁了。

今天又看了一些RPC的文章,发现黄勇老师的轻量级分布式 RPC 框架
写的非常清晰易懂。于是整理出一些关键点出来,方便自己实现。

编写RPC框架的步骤如下:

  1. 编写服务接口
  2. 编写服务接口的实现类
  3. 配置服务端
  4. 启动服务器并发布服务
  5. 实现服务注册
  6. 实现 RPC 服务器
  7. 配置客户端
  8. 实现服务发现
  9. 实现 RPC 代理
  10. 发送 RPC 请求

注册中心的职责

核心的职责如下:

  • 服务提供者向其发送它提供的服务的一些基本信息,并完成注册
  • 服务消费者订阅服务
  • 服务提供者下线的时候,实时通知服务消费者某个服务下线

除此之外,还有一些锦上添花但在真实的业务中必须得有的功能,比如:

  • 服务审核,这是服务治理最最简单的操作了,因为某个服务提供者上线之后,都是需要审核的,如果不审核,可能会造成很多不必要的麻烦,有可能有些开发小新,不小心把开发环境的服务向线上服务注册,如果不审核,直接通过的话,就会造成线上接口调用线下服务的尴尬局面
  • 负载策略的记录,比如默认是随机加权策略,如果管理者希望改成加权轮询的策略,需要通知服务消费者,访问策略的改变
  • 手动改变某个服务的访问权重,比如某个服务默认负重是50,(最大100)的时候,但是此时这个服务实例所在的机器压力不大的时候,而其他该服务实例压力很大的时候,可以适当的增加该服务的访问权重,所以我们可以在注册中心修改它的负重,然后通知服务消费者,这样就可以动态的修改负重了
  • 一些持久化的操作,因为注册中心是无状态的,假如某个注册中心实例重启之后,以前的一些审核信息,修改的访问策略信息就会消失,这样就会需要用户重新一一审核,这是很麻烦的,所以需要将这些信息落地,持久化到硬盘,然后每次重启注册中心实例的时候,去读取这些信息

基于ZooKeeper的注册中心节点树结构如下:

服务注册中心ZK节点树

计划(暂定)

  • 2018-07-08 架构设计,功能(细节)设计
  • 2018-07-15 网络传输模型,序列化部分
  • 2018-07-22 服务端框架
  • 2018-07-29 客户端框架
  • 2018-08-06 负载均衡
  • 2018-08-13 服务降级
  • 2018-08-20 测试与优化