写点什么

javaer 徒手撸一个 python 的分布式 rpc

用户头像
awen
关注
发布于: 刚刚

作为 javaer 为什么要撸 python 版本的 rpc?

  1. 虽然 dubbo 那么火,但是公司使用了自研的 rpc 服务,已经有了 java 版本和 go 版本,搞 python 的同学们没办法去直接调用公司的 rpc,作为一名“思想觉悟”比较高的人,心里想那就撸一个吧

  2. 虽然当时大家都在 996 ,但本人依然“忙”的蛋疼。ps:本人对一个内卷环境下 996 加班的看法是“一个工程不加班 15 天完成的话,加班(996)可能 20 天,没准最后还得拖到 25 天”,结果是大家都“很忙,很充实”,老板很开心,hr 也很忙得给大家算倒休。

什么是 RPC


RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求远端另一个节点提供的服务。

RPC 在分布式系统中的应用开发有着广泛的应用,尤其是当今微服务大行其道,“有需要上微服务,没需要制造需要也得上”,比如阿里巴巴的 dubbo,好像大家不会用 dubbo 就不配做 java web 开发一样!

如何实现一个分布式的 RPC 框架呢?


分布式 RPC 需要解决的问题


  1. protocol:传输协议

  2. client-proxy:client 代理

  3. codec:协议编解码压缩

  4. cluster:负载均衡

  5. 服务治理:服务注册与发现、服务降级、服务熔断、服务隔离


我的实现

  1. protocol:传输协议

  2. json

  3. protobuf

  4. client-proxy:client 代理

  5. 构建客户端代理

  6. 从注册中心获取服务列表并本地持久化

  7. codec:协议编解码压缩

  8. length-based:length(4 个字节代表 body 长度)+body(指定长度的数据)

  9. 超过 2M 大小,启用压缩(比如 gzip)。如压缩后体积仍然大于 2M 抛出异常,提醒接口开发优化接口(比如拆分)

  10. cluster:负载均衡

  11. round-robin

  12. random

  13. 服务治理:服务注册与发现、服务容错、服务降级、服务熔断、服务隔离

  14. 服务注册与发现

  15. 注册中心

  16. etcd3

  17. consul

  18. 服务发现

  19. 客户端访问服务中心获取服务列表

  20. 基于语义化版本控制 semver,可以指定版本获取服务列表

  21. 服务容错

  22. failfast 失败后立即返

  23. failtry 失败后重试 n 次

  24. failover 失败后切换节点重试 n 次

  25. 服务降级

  26. 通过默认行为来达到服务降级的目的(未实现)

  27. 服务熔断

  28. 超过最大 default_max_error_count 错误数进行服务熔断

  29. 通过心跳检查,可以将熔断的节点恢复工作

  30. 服务隔离

  31. client 针对独立服务单独维护线程池,基于 gsocketpool 实现

代码示例

配置文件

bee:  application:    name: "bee-rpc-app"  rpc:    registry:      #direct\etcd3\zk .etc      protocol: "etcd3"      address: 127.0.0.1:2379      #心跳频率,单位s      heartbeat_interval: 30    server:      name: "test"      desc: "test service"      version: 2.0      register: True      macher: json      address:        url: "127.0.0.1:9000"      max_conn_size: 1000      max_pool_size: 1024      backlog: 1024      read_timeout: 10      write_timeout: 10
client: test: version: ">=1.0, <2" address: url: "127.0.0.1:9000" # 容错机制failover、failfast、failtry fail: failfast codec: name: json options: max_size: 2 m #random\round-robin balancer: random #connect超时时间,单位秒 connect_timeout: 5 #读超时时间,单位秒 read_timeout: 10 #写超时时间,单位秒 write_timeout: 10
复制代码

结构


github

用户头像

awen

关注

Things happen for a reason. 2019.11.15 加入

还未添加个人简介

评论

发布
暂无评论
javaer 徒手撸一个 python 的分布式 rpc