Arpc - 不止于Rpc,高性能,易扩展,多姿势(支持双向Call/Notify/Broadcastdeng)

lesismal · 2020-07-06 00:15:07 · 2430 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-07-06 00:15:07 的主题,其中的信息可能已经有所发展或是发生改变。

项目地址

Quick start

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")
}
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
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. 支持自定制协议(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实现采用简单的轮询,能够满足性能需要
  • 最少依赖,默认使用方式只依赖标准库
  • 示例请参考READMEexamples
  • 更多特点请阅读代码,如需扩展,欢迎PR

ARPC性能

  • 简单的echo压测
rpc go版本 协议/网络 数据类型 配置 连接数 每个连接并发协程数 qps
arpc 1.13.9 tcp/localhost string os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 13-15万
arpc 1.13.9 tcp/localhost encoding/json os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 8-10万
grpc 1.13.9 http2/localhost protobuf os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 2-3万
rpcx 1.13.9 tcp/localhost string os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 5-6万
  • arpc性能基本与当前其他第一梯队性能的golang rpc处于同样水平范围、甚至更高
  • grpc由于使用了http2,性能浪费是不可避免的,这里对比grpc/rpcx只是为了给出个参考系
  • 配置较低,更多配置、协议、序列化测试欢迎各位道友自行进行,arpc压测代码: server, client

示例工程

  • 用arpc作为基础设施实现了个发布订阅服务:achan,示例请参考README

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2430 次点击  
加入收藏 微博
9 回复  |  直到 2020-10-14 23:40:53
lesismal
lesismal · #1 · 5年之前

less is more

lesismal
lesismal · #2 · 5年之前

upup

lesismal
lesismal · #3 · 5年之前

lesismal
lesismal · #4 · 5年之前

已加入 awesome-go

lesismal
lesismal · #5 · 5年之前

新增websocket支持

zzustu
zzustu · #6 · 4年之前

nice, 支持

focusonline
focusonline · #7 · 4年之前

nice, 支持

lesismal
lesismal · #8 · 4年之前
zzustuzzustu #6 回复

# nice, 支持

感谢!^_^

lesismal
lesismal · #9 · 4年之前
focusonlinefocusonline #7 回复

nice, 支持

感谢!^_^

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传