v1.9.1 稳定版 Apache 2.0

rpcx

一个高性能、跨平台的 Go 语言分布式 RPC 框架

类似阿里巴巴 Dubbo 和微博 Motan,专为 Go 语言设计。无需定义 proto 文件, 支持多种协议、多种序列化方式、服务发现和服务治理。

-
GitHub Stars
-
Forks
v1.9.1
稳定版本
package main

type Arith struct{}

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

// 服务端
s := server.NewServer()
s.RegisterName("Arith", new(Arith), "")
s.Serve("tcp", ":8972")

被以下企业信赖使用

核心特性

简单易用,性能卓越,功能全面

简单易用

无需定义 proto 文件,直接使用 Go 函数即可。学习曲线平缓,上手快速。

高性能

性能优于或等于 grpc-go,支持连接池、工作池等优化,高并发下表现卓越。

跨平台

支持多种序列化格式,可与 Java、Python、C++、Node.js 等语言互通。

多协议支持

支持 TCP、HTTP、QUIC、KCP、WebSocket、RDMA 等多种传输协议。

服务治理

支持服务发现、负载均衡、故障转移、熔断降级等企业级服务治理功能。

安全可靠

支持 TLS 加密、Token 认证、IP 黑名单等安全特性,生产环境稳定运行。

无需 Proto 文件

直接使用 Go 语言的原生类型定义服务接口,无需学习额外的 IDL(接口定义语言)。代码即文档,开发效率大幅提升。

// 定义服务方法,签名简单直观
func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error {
    reply.C = args.A * args.B
    return nil
}

插件化架构

通过插件机制轻松扩展功能。服务发现、链路追踪、限流熔断等功能都可以通过插件实现,核心框架保持轻量。

// 添加插件只需一行代码
s.Plugins.Add(&serverplugin.EtcdV3RegisterPlugin{...})
s.Plugins.Add(&serverplugin.MetricsPlugin{...})
s.Plugins.Add(&CustomPlugin{})

丰富的服务发现

支持多种服务注册中心,包括 etcd、ZooKeeper、Consul、Redis、Nacos、mDNS、DNS 等,适应不同的部署环境。

// etcd 服务发现
d := client.NewEtcdV3Discovery("/rpcx", "Arith",
    []string{"localhost:2379"}, nil)

// Consul 服务发现
d := client.NewConsulDiscovery("rpcx", "Arith",
    []string{"localhost:8500"}, nil)

多种调用模式

支持同步调用、异步调用、单向调用、广播调用、分支调用等多种模式,满足各种业务场景需求。

// 同步调用
xclient.Call(ctx, "Method", args, reply)

// 异步调用
xclient.Go(ctx, "Method", args, reply, done)

// 广播调用所有服务
xclient.Broadcast(ctx, "Method", args, reply)

快速开始

5 分钟上手 rpcx

1

安装

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

定义服务

type Args struct {
    A int
    B int
}

type Reply struct {
    C int
}

type Arith struct{}

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

创建服务端

s := server.NewServer()
s.RegisterName("Arith", new(Arith), "")
s.Serve("tcp", ":8972")
4

创建客户端

d, _ := client.NewPeer2PeerDiscovery("tcp@localhost:8972", "")
xclient := client.NewXClient("Arith", client.Failtry,
    client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()

args := &Args{A: 10, B: 20}
reply := &Reply{}
xclient.Call(context.Background(), "Mul", args, reply)

服务发现与注册中心

支持主流注册中心,灵活选择

etcd

etcd

分布式键值存储,强一致性

查看插件 →
ZooKeeper

ZooKeeper

成熟的分布式协调服务

查看插件 →
Consul

Consul

服务网格和 服务发现

查看插件 →
Redis

Redis

基于 Redis 的服务发现

查看插件 →
Nacos

Nacos

阿里巴巴开源的注册中心

查看插件 →
mDNS

mDNS

本地网络服务发现

内置支持

负载均衡

多种策略,按需选择

RandomSelect

默认

随机选择一个服务实例,适合各实例性能相近的场景

RoundRobin

依次轮询所有服务实例,请求均匀分配

WeightedRoundRobin

推荐

按权重分配请求,可根据实例性能设置不同权重

ConsistentHash

一致性哈希,相同参数的请求路由到同一实例

WeightedICMP

基于 Ping 延迟的加权选择,自动选择响应最快的实例

GeoSelector

按地理位置就近选择,降低网络延迟

容错机制

确保服务高可用

Failfast

快速失败

调用失败立即返回错误,不进行重试

适用于非关键操作或需要快速响应的场景
Failover

故障转移

调用失败时自动选择其他服务实例重试

适用于有多个服务副本的场景
Failtry

失败重试

调用失败时重试当前服务实例

适用于网络抖动的场景
Failbackup

备份请求

同时向多个实例发送请求,取最快响应

适用于对延迟敏感的场景

传输协议

适应不同场景需求

HTTP

方便调试,支持跨语言调用

QUIC

基于 UDP 的高性能协议

KCP

可靠 UDP,低延迟传输

WebSocket

浏览器友好,实时通信

Unix Domain

本机高性能通信

序列化方式

支持多种编码格式

默认二进制
性能最高

rpcx 自定义二进制协议,序列化和反序列化性能最佳

JSON
易于调试

标准 JSON 格式,可读性强,方便调试和跨语言调用

Protobuf
高性能

Google Protocol Buffers,高性能且向后兼容

MessagePack
高效紧凑

二进制 JSON 格式,比 JSON 更小更快

Thrift
跨语言

Apache Thrift 序列化格式

性能表现

rpcx 在性能测试中表现优异

根据官方测试(Intel Xeon E5-2630 v3 @ 2.40GHz, 32 cores),rpcx 在吞吐量和延迟方面都表现出色。

测试环境

  • CPU: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, 32 cores
  • 内存: 32GB
  • 操作系统: CentOS 7
  • 数据大小: 581 bytes
  • 并发客户端: 500/2000/5000
🚀
吞吐量优于大多数 RPC 框架
P99 延迟表现优异
📈
高并发下性能稳定
查看完整性能测试报告 →

生态系统

丰富的工具和插件

跨语言支持
服务注册插件
工具
相关项目

示例代码

丰富的示例帮助你快速上手

基础调用

最简单的 RPC 调用示例

查看代码 →

服务发现

使用 etcd 进行服务注册与发现

查看代码 →

负载均衡

各种负载均衡策略示例

查看代码 →

熔断器

服务熔断与降级示例

查看代码 →

认证授权

Token 认证和 TLS 加密

查看代码 →

流式传输

大文件和流数据传输

查看代码 →
查看所有示例

文档

详细的使用文档和 API 参考

📖

框架文档

完整的框架使用指南

📚

GoDoc API

完整的 API 参考文档

📝

Wiki

常见问题和最佳实践

💻

示例代码

丰富的示例帮助你理解

开始使用 rpcx

立即体验高性能的 Go 语言 RPC 框架