javaer 徒手撸一个 python 的分布式 rpc
作为 javaer 为什么要撸 python 版本的 rpc?
虽然 dubbo 那么火,但是公司使用了自研的 rpc 服务,已经有了 java 版本和 go 版本,搞 python 的同学们没办法去直接调用公司的 rpc,作为一名“思想觉悟”比较高的人,心里想那就撸一个吧
虽然当时大家都在 996 ,但本人依然“忙”的蛋疼。ps:本人对一个内卷环境下 996 加班的看法是“一个工程不加班 15 天完成的话,加班(996)可能 20 天,没准最后还得拖到 25 天”,结果是大家都“很忙,很充实”,老板很开心,hr 也很忙得给大家算倒休。
什么是 RPC
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求远端另一个节点提供的服务。
RPC 在分布式系统中的应用开发有着广泛的应用,尤其是当今微服务大行其道,“有需要上微服务,没需要制造需要也得上”,比如阿里巴巴的 dubbo,好像大家不会用 dubbo 就不配做 java web 开发一样!
如何实现一个分布式的 RPC 框架呢?
分布式 RPC 需要解决的问题
protocol:传输协议
client-proxy:client 代理
codec:协议编解码压缩
cluster:负载均衡
服务治理:服务注册与发现、服务降级、服务熔断、服务隔离
我的实现
protocol:传输协议
json
protobuf
client-proxy:client 代理
构建客户端代理
从注册中心获取服务列表并本地持久化
codec:协议编解码压缩
length-based:length(4 个字节代表 body 长度)+body(指定长度的数据)
超过 2M 大小,启用压缩(比如 gzip)。如压缩后体积仍然大于 2M 抛出异常,提醒接口开发优化接口(比如拆分)
cluster:负载均衡
round-robin
random
服务治理:服务注册与发现、服务容错、服务降级、服务熔断、服务隔离
服务注册与发现
注册中心
etcd3
consul
服务发现
客户端访问服务中心获取服务列表
基于语义化版本控制 semver,可以指定版本获取服务列表
服务容错
failfast 失败后立即返
failtry 失败后重试 n 次
failover 失败后切换节点重试 n 次
服务降级
通过默认行为来达到服务降级的目的(未实现)
服务熔断
超过最大 default_max_error_count 错误数进行服务熔断
通过心跳检查,可以将熔断的节点恢复工作
服务隔离
client 针对独立服务单独维护线程池,基于 gsocketpool 实现
评论