rpcx是Go語言實現的一個分佈式的、多插件的、帶有服務治理功能的產品級的RPC框架。類似 Alibaba Dubbo 和 Weibo Motan,但性能遠遠高於 Dubbo、Motan、Thrift等框架,是非常值得關注的一款產品。
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 調用。
官網地址: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等失敗模式,支持 隨機、輪詢、權重、網絡質量, 一致性哈希;源代碼非常值得一讀。
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章