Go 語言開源 RPC 服務治理框架

介紹

RPCX 是當前最流行的 Go 生態圈的微服務框架之一,很多大廠和創業公司都在使用,並且服務端無需額外配置,RPCX 也同時支持 HTTP 調用,這樣其它編程語言都可以調用 RPCX 服務, 是目前性能最好的 RPC 框架之一。

功能特性

快速起步

安裝

安裝 rpcx:

go get -u -v github.com/smallnest/rpcx/...

這一步只會安裝 rpcx 的基礎功能。如果想要使用 etcd 作爲註冊中心,需要加上 etcd 這個標籤。

go get -u -v -tags "etcd" github.com/smallnest/rpcx/...

如果想要使用 quic ,也需要加上 quic 這個標籤。

go get -u -v -tags "quic etcd" github.com/smallnest/rpcx/...

推薦安裝所有的 tags:

go get -u -v -tags "reuseport quic kcp zookeeper etcd consul ping" github.com/smallnest/rpcx/...

Tags 對應

定義 Service

定義一個 Sevice 就像寫一個單純的 Go 結構體:

import "context"

type Args struct {
    A int
    B int
}

type Reply struct {
    C int
}

type Arith int

func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error {
    reply.C = args.A * args.B
    return nil
}

以上已經定義了一個叫做 Arith 的 service, 並且爲它實現了 Mul 方法。下一步驟中將會繼續介紹如何把這個服務註冊給服務器,並且如何用 client 調用它。

實現 Server

三行代碼就可以註冊一個服務:

s := server.NewServer()

s.RegisterName("Arith", new(Arith)"")

s.Serve("tcp"":8972")

這裏把服務命名 Arith,你可以按照如下的代碼註冊服務。

s.Register(new(example.Arith)"")

實現 Client

// #1
    d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
    // #2
    xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
    defer xclient.Close()

    // #3
    args := &example.Args{
        A: 10,
        B: 20,
    }

    // #4
    reply := &example.Reply{}

    // #5
    err := xclient.Call(context.Background()"Mul", args, reply)
    if err != nil {
        log.Fatalf("failed to call: %v", err)
    }

    log.Printf("%d * %d = %d", args.A, args.B, reply.C)

異步調用 Service

以下的代碼可以異步調用服務:

 d := client.NewPeer2PeerDiscovery("tcp@"+*addr2, "")
    xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
    defer xclient.Close()

    args := &example.Args{
        A: 10,
        B: 20,
    }

    reply := &example.Reply{}
    call, err := xclient.Go(context.Background()"Mul", args, reply, nil)
    if err != nil {
        log.Fatalf("failed to call: %v", err)
    }

    replyCall := <-call.Done
    if replyCall.Error != nil {
        log.Fatalf("failed to call: %v", replyCall.Error)
    } else {
        log.Printf("%d * %d = %d", args.A, args.B, reply.C)
    }

性能測試

測試環境

採用

測試結果

模擬 0ms 處理時間:

模擬 10ms 處理時間:

模擬 30ms 處理時間:

傳送門

開源協議:Apache 2.0

開源地址:https://github.com/smallnest/rpcx

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/7xZszeKi5fNC-Ndcm51sjA