Golang RPCX 非常值得關注的rpc 框架

rpcx是Go語言實現的一個分佈式的、多插件的、帶有服務治理功能的產品級的RPC框架。類似 Alibaba Dubbo 和 Weibo Motan,但性能遠遠高於 Dubbo、Motan、Thrift等框架,是非常值得關注的一款產品。

Golang RPCX 非常值得關注的rpc 框架

RPCX的特點

基於net/rpc,可以將net/rpc實現的RPC項目輕鬆的轉換為分佈式的RPC

插件式設計,可以配置所需的插件,比如服務發現、日誌、統計分析等

基於TCP長連接,只需很小的額外的消息頭

支持多種編解碼協議,如Gob、Json、MessagePack、gencode、ProtoBuf等

服務發現:服務發佈、訂閱、通知等,支持多種發現方式如ZooKeeper、Etcd等

高可用策略:失敗重試(Failover)、快速失敗(Failfast)

負載均衡:支持隨機請求、輪詢、低併發優先、一致性 Hash等

規模可擴展,可以根據性能的需求增減服務器

其他:調用統計、訪問日誌等

RPCX架構

rpcx中有服務提供者 RPC Server,服務調用者 RPC Client 和服務註冊中心 Registry 三個角色。

Server 向 Registry 註冊服務,並向註冊中心發送心跳彙報狀態(基於不同的registry有不同的實現)。

Client 需要向註冊中心查詢 RPC 服務者列表,Client 根據 Registry 返回的服務者列表,選取其中一個 Sever 進行 RPC 調用。

Golang RPCX 非常值得關注的rpc 框架

RPCX 架構

官網地址:https://github.com/smallnest/rpcx.git

server示例:

package main

import "github.com/smallnest/rpcx"

type Args struct {

A int `msg:"a"`

B int `msg:"b"`

}

type Reply struct {

C int `msg:"c"`

}

type Arith int

func (t *Arith) Mul(args *Args, reply *Reply) error {

reply.C = args.A * args.B

return nil

}

func (t *Arith) Error(args *Args, reply *Reply) error {

panic("ERROR")

}

func main() {

server := rpcx.NewServer()

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

server.Serve("tcp", "127.0.0.1:8972")

}

client 示例:

package main

import (

"fmt"

"time"

"github.com/smallnest/rpcx"

)

type Args struct {

A int `msg:"a"`

B int `msg:"b"`

}

type Reply struct {

C int `msg:"c"`

}

func main() {

s := &rpcx.DirectClientSelector{Network: "tcp", Address: "127.0.0.1:8972", Timeout: 10 * time.Second}

client := rpcx.NewClient(s)

args := &Args{7, 8}

var reply Reply

err := client.Call("Arith.Mul", args, &reply)

if err != nil {

fmt.Printf("error for Arith: %d*%d, %v \n", args.A, args.B, err)

} else {

fmt.Printf("Arith: %d*%d=%d \n", args.A, args.B, reply.C)

}

client.Close()

}

小結:RPCX 簡單易用 、超快 、高效 、功能強大;其中服務治理支持 Failover、 Failfast、 Failtry、Backup等失敗模式,支持 隨機、輪詢、權重、網絡質量, 一致性哈希;源代碼非常值得一讀。

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: