### 项目地址
- [https://github.com/lesismal/arpc](https://github.com/lesismal/arpc)
### Quick start
- start a [server](https://github.com/lesismal/arpc/blob/master/examples/rpc_sync/server/server.go)
```go
package main
import "github.com/lesismal/arpc"
func main() {
server := arpc.NewServer()
// register router
server.Handler.Handle("/echo", func(ctx *arpc.Context) {
str := ""
if err := ctx.Bind(&str); err == nil {
ctx.Write(str)
}
})
server.Run(":8888")
}
```
- start a [client](https://github.com/lesismal/arpc/blob/master/examples/rpc/client/client.go)
```go
package main
import (
"log"
"net"
"time"
"github.com/lesismal/arpc"
)
func main() {
client, err := arpc.NewClient(func() (net.Conn, error) {
return net.DialTimeout("tcp", "localhost:8888", time.Second*3)
})
if err != nil {
panic(err)
}
client.Run()
defer client.Stop()
req := "hello"
rsp := ""
err = client.Call("/echo", &req, &rsp, time.Second*5)
if err != nil {
log.Fatalf("Call failed: %v", err)
} else {
log.Printf("Call Response: \"%v\"", rsp)
}
}
```
### 网络交互的几种模式
| 模式 | 方向 | 流程 |
| ------ | ----- | ---- |
| call | c -> s<br>s -> c | request and response/请求-响应 |
| notify | c -> s<br>s -> c | request without response/通知-无需响应 |
### 传统RPC的缺点
1. 只支持单向 Call: c->s,不支持 s->c,不支持notify
2. 函数调用的写法,函数返回即结束调用,不支持函数体外的同步/异步回包
3. 多数rpc框架绑定了序列化
### ARPC特点
1. 支持c/s双向call、notify
2. 支持自定制协议(tcp,unixsock,kcp,quic...)
3. 支持异步回包,handler函数返回不代表call处理结束,可以handler返回后再回包(同步异步皆可)
4. 支持自定制序列化(pb,msgpack各种,只要你喜欢,随意扩展),为了减少依赖目前默认用的标准库json
5. 提供类似gin的ctx.Bind方法,方便string、[]byte、struct等类型绑定
6. 支持contex,也支持直接使用timeout参数、非多步流程的调用等待写起来更方便
7. 像使用http router一样,不采用函数调用的写法,不依赖反射
8. 支持client pool,因为支持异步并发调用回包,pool实现采用简单的轮询,能够满足性能需要
- 最少依赖,默认使用方式只依赖标准库
- 示例请参考[README](https://github.com/lesismal/arpc)、[examples](https://github.com/lesismal/arpc/tree/master/examples)
- 更多特点请阅读代码,如需扩展,欢迎PR
### ARPC性能
- 简单的echo压测
| rpc | go版本 | 协议/网络 | 数据类型 | 配置 | 连接数 | 每个连接并发协程数 | qps |
| ------ | ------ | ------ | ------ | ------ | ------ | ------ | ------ |
| arpc | 1.13.9 | tcp/localhost | string | os: VMWare Ubuntu 18.04<br>cpu: AMD 3500U 4c8t<br>mem: 2G | 8 | 10 | 13-15万 |
| arpc | 1.13.9 | tcp/localhost | encoding/json | os: VMWare Ubuntu 18.04<br>cpu: AMD 3500U 4c8t<br>mem: 2G | 8 | 10 | 8-10万 |
| grpc | 1.13.9 | http2/localhost | protobuf | os: VMWare Ubuntu 18.04<br>cpu: AMD 3500U 4c8t<br>mem: 2G | 8 | 10 | 2-3万 |
| rpcx | 1.13.9 | tcp/localhost | string | os: VMWare Ubuntu 18.04<br>cpu: AMD 3500U 4c8t<br>mem: 2G | 8 | 10 | 5-6万 |
- arpc性能基本与当前其他第一梯队性能的golang rpc处于同样水平范围、甚至更高
- grpc由于使用了http2,性能浪费是不可避免的,这里对比grpc/rpcx只是为了给出个参考系
- 配置较低,更多配置、协议、序列化测试欢迎各位道友自行进行,arpc压测代码: [server](https://github.com/lesismal/arpc/blob/master/examples/bench/server/server.go), [client](https://github.com/lesismal/arpc/blob/master/examples/bench/client/client.go)
### 示例工程
- 用arpc作为基础设施实现了个发布订阅服务:[achan](https://github.com/lesismal/achan),示例请参考README
有疑问加站长微信联系(非本文作者)