darjun / go-daily-lib

Go 每日一库
5.08k stars 603 forks source link

每日一库推荐-arpc #14

Open lesismal opened 4 years ago

lesismal commented 4 years ago

一个简单易用、高性能、支持更多姿势的RPC库

网络交互的几种模式

交互方式 方向 完整流程
call c -> s
s -> c
request and response
notify c -> s
s -> c
request without response

传统RPC的缺点

  1. call 只支持 c->s,不支持 s->c,不支持notify
  2. 函数调用的写法,函数返回即结束调用,不支持函数体外的同步/异步回包
  3. 多数rpc框架绑定了序列化

ARPC特点

  1. 支持c/s双向call、notify
  2. 像使用http router一样,不采用函数调用的写法,不依赖反射
  3. 提供类似gin的ctx.Bind方法,方便string、[]byte、struct等类型绑定
  4. 支持异步回包,handler函数返回不代表call处理结束,可以handler返回后再回包(同步异步皆可)
  5. 支持自定制序列化反序列化(pb,msgpack各种,只要你喜欢,随意扩展),为了减少依赖目前默认用的标准库json
  6. 支持自定制协议(tcp,unixsock,kcp,quic...)
  7. 支持应用层定制logger
  8. 支持自定制新连接、连接断开、发送队列满的handler
  9. 支持contex,也支持直接使用timeout参数、非多步流程的调用等待写起来更方便
  10. 支持client pool,因为支持异步并发调用回包,pool实现采用简单的轮询,能够满足性能需要
  11. 支持用户自己定制rpc协议
  12. 支持中间件
  13. 支持发布订阅

ARPC性能

rpc 协议/网络 序列化 配置 连接数 每个连接并发协程数 qps
arpc tcp/localhost encoding/json os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 8-10万
grpc http2/localhost protobuf os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 2-3万

示例工程

darjun commented 4 years ago

👍👍👍

lesismal commented 4 years ago

已加入 awesome-go

lesismal commented 4 years ago

https://github.com/rpcx-ecosystem/rpcx-benchmark 上的go的rpc对比了下,我这里测arpc应该是性能最好的

lesismal commented 4 years ago

新增支持发布订阅 pubsub-examples

lesismal commented 4 years ago

新增支持中间件 middleware 也增加了message扩展的中间件机制,方便应用层扩展诸如压缩、链路追踪等

darjun commented 4 years ago

todo-list前面堆积了很多,最近也比较忙,要晚点来学习哦

lesismal commented 4 years ago

todo-list前面堆积了很多,最近也比较忙,要晚点来学习哦

谢谢,我逐渐增加一些功能支持更新过来

lesismal commented 4 years ago

新增了 websocket js 的支持,web/h5 上面普通的推送服务、游戏等长连接业务都能很方便实现了