gorpc: 一個簡單,易用,高效能,可插拔的微服務框架

1912672432發表於2020-04-02

安裝

在安裝 gorpc 之前,您需要安裝 go 並配置 go 環境。

gopath 模式下,您只需執行以下命令即可安裝:

go get -u -v github.com/lubanproj/gorpc

go modules 模式下,您只需匯入軟體包 “ github.com/lubanproj/gorpc”,該軟體包在執行 go [build | run | test] 時會自動下載依賴項。

快速開始

git clone https://github.com/lubanproj/gorpc.git
cd gorpc/examples/helloworld
# start server
go run server/server.go
# start client,start another terminal and execute
go run client/client.go

示例

發起一個服務呼叫只需要以下三個步驟:

  1. 定義一個服務
  2. server 釋出服務
  3. 使用一個客戶端發起呼叫

1.定義一個服務

type Service struct {

}

type HelloRequest struct {
    Msg string
}

type HelloReply struct {
    Msg string
}

func (s *Service) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
    rsp := &HelloReply{
        Msg : "world",
    }

    return rsp, nil
}

2. server 釋出服務

func main() {
    opts := []gorpc.ServerOption{
        gorpc.WithAddress("127.0.0.1:8000"),
        gorpc.WithNetwork("tcp"),
        gorpc.WithSerializationType("msgpack"),
        gorpc.WithTimeout(time.Millisecond * 2000),
    }
    s := gorpc.NewServer(opts ...)
    if err := s.RegisterService("/helloworld.Greeter", new(helloworld.Service)); err != nil {
        panic(err)
    }
    s.Serve()
}

3. 使用一個客戶端發起呼叫

func main() {
    opts := []client.Option {
        client.WithTarget("127.0.0.1:8000"),
        client.WithNetwork("tcp"),
        client.WithTimeout(2000 * time.Millisecond),
        client.WithSerializationType("msgpack"),
    }
    c := client.DefaultClient
    req := &helloworld.HelloRequest{
        Msg: "hello",
    }
    rsp := &helloworld.HelloReply{}
    err := c.Call(context.Background(), "/helloworld.Greeter/SayHello", req, rsp, opts ...)
    fmt.Println(rsp.Msg, err)
}

更多細節可以參考 helloworld

文件

特性

  • 高效能,效能遠遠超過 grpc ,詳情可以參考 效能
  • 支援 反射, 程式碼生成 兩種呼叫方式
  • 可插拔 所有外掛都是可插拔、支援業務自定義的
  • 多協議支援,目前支援 tcp、udp、http,後續會支援更多協議
  • 實現了攔截器,支援業務自己定義攔截器
  • 實現了連線池,支援業務自定義連線池
  • 支援服務發現,提供了基於 consul 的預設服務發現實現,支援業務自定義服務發現實現。
  • 支援負載均衡 ,提供了隨機、輪詢、加權輪詢、一致性雜湊等預設負載均衡實現,支援業務自定義負載均衡實現。
  • 支援分散式鏈路追蹤,遵循業界 opentracing 規範,提供了基於 jaeger 的分散式鏈路追蹤預設實現,支援業務自定義。
  • 支援多種序列化方式,框架預設採用 protocolmsgpack 序列化,用程式碼生成方式呼叫會使用 protocol 序列化。用反射方式呼叫會採用 msgpack 序列化,支援業務自定義序列化方式。
  • 更多特性正在陸續支援中 ......

效能

環境 :

  • CPU : Intel(R) Xeon(R) Gold 61xx CPU @2.44GHz
  • CPU cores : 8
  • Memory : 16G
  • Disk : 540G

Result : 使用 gorpc-benchmark 進行測試,測試三次取效能最大值

gorpc :

git clone https://github.com/lubanproj/gorpc-benchmark.git
cd gorpc-benchmark
# start gorpc server
go run server.go
# start gorpc-benchmark client,start another terminal and execute
go run client.go -concurrency=100 -total=1000000

效能測試結果如下:

> go run client.go -concurrency=100 -total=1000000
2020/02/29 15:56:57 client.go:71: [INFO] took 5214 ms for 1000000 requests
2020/02/29 15:56:57 client.go:72: [INFO] sent     requests      : 1000000
2020/02/29 15:56:57 client.go:73: [INFO] received requests      : 1000000
2020/02/29 15:56:57 client.go:74: [INFO] received requests succ : 1000000
2020/02/29 15:56:57 client.go:75: [INFO] received requests fail : 0
2020/02/29 15:56:57 client.go:76: [INFO] throughput  (TPS)      : 191791

grpc :

在相同機器上進行 grpc 效能測試,如下:

git clone https://github.com/lubanproj/gorpc-benchmark.git
cd gorpc-benchmark/grpc
# run gorpc server
go run server.go
# run gorpc-benchmark client, start another terminal and execute 
go run client.go -concurrency=100 -total=1000000

效能測試結果如下:

> go run client.go -concurrency=100 -total=1000000
2020/02/29 15:46:14 client.go:77: [INFO] took 17169 ms for 1000000 requests
2020/02/29 15:46:14 client.go:78: [INFO] sent     requests      : 1000000
2020/02/29 15:46:14 client.go:79: [INFO] received requests      : 1000000
2020/02/29 15:46:14 client.go:80: [INFO] received requests succ : 1000000
2020/02/29 15:46:14 client.go:81: [INFO] received requests fail : 0
2020/02/29 15:46:14 client.go:82: [INFO] throughput  (TPS)      : 58244

貢獻

貢獻者

如何進行貢獻?

可以參考 Contributing

微信群:聯絡 DIU191267432 入群

更多原創文章乾貨分享,請關注公眾號
  • gorpc: 一個簡單,易用,高效能,可插拔的微服務框架
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章