RPC x是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 调用。

RPCX 架构
官网地址 :
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等失败模式,支持 随机、轮询、权重、网络质量, 一致性哈希 ;源代码非常值得一读。
更多内容请关注每日编程,每天进步一点。