调用约定和命名
远程调用一个函数,命名空间+类名+方法名是一个比较好的选择,简而言之,每个可以远程调用的方法就是一个字符串,本质就是要知道 IP 和端口。
注册和发现
为了方便快速查询远程调用函数的命名以及 IP 和端口,可以根据字符串(命名)去获取 IP 和端口(机器和服务),去建立 hash 对象存储,但需要考虑信息同步和读取性能,可使用 ZooKeeper 订阅,让 RPC 调用者订阅到服务地址的变更,及时更新自己的缓存
关于负载均衡的设计,请求到达 RPC 的网关(或某个路由程序)后,发现组件会提供服务对应的所有实例(IP + 端口),然后负载均衡算法会指定其中一个响应这个请求
可用性和容灾,比如确认一个服务有没有崩溃,可能需要一个心跳程序持续请求这个服务,因此 RPC 的调用者如果调用到一个不存在的服务,或者调用到一个发生崩溃的服务,需要自己重新去发现组件申请新的服务实例(地址 + 端口)。如果遇到临时访问量剧增,需要扩容的场景。这个时候只需要上线更多的容器,并且去注册即可。当然这要求部署模块和注册模块之间有较高的协同,这块可以用自动化脚本衔接
