LittleRpc
高性能、轻量实现、少依赖、跨语言的玩具级RPC实现
Features
- 可替换的底层传输协议
- 可替换的序列化/反序列化组件
- 可替换的压缩算法
- 调用描述接口
- 负载均衡
- 地址列表解析器
- 轮询
- 一致性Hash(问题很大,需要优化)
- 客户端的实现
- 完善的服务治理拓展API
- 完善可用的代码生成器
- 完善的示例
Benchmark
基准测试的指标来自rpcx-benchmark,以下结果仅供参考,不同平台的结果可能会不一致,想要清晰的测量结果之前最好自己动手试一试
设置的Client
&Server
的参数
Call Goroutine |
Sharring Client |
Request Number |
Server Delay |
5000 |
500 |
1000000 |
100ns |
基准测试使用的平台的详细信息
CPU |
Runtime |
System |
Go Runtime |
R7 4700U 8c/16t |
Vmware15-pro |
Centos7-3.10kernal |
Go 1.17 |
参考结果
Name |
Min |
Max |
P99 |
Qps |
LittleRpc |
51285 ns |
427180294 ns |
205480247 ns |
137287 |
Std-Rpc |
55503 ns |
352554016 ns |
208655742 ns |
140686 |
Rpcx |
null |
null |
null |
null |
Kitex |
null |
null |
null |
null |
Rpcx |
null |
null |
null |
null |
Arpc |
null |
null |
null |
null |
Grpc-go |
173594 ns |
463660659 ns |
317374210 ns |
73959 |
Install
go get github.com/nyan233/littlerpc
Process-Defined
在littlerpc
中一个合法的过程是如下那样,必须有一个接收器,参数可以是指针类型或者非指针类型,返回结果集允许指针/非指针类型,返回值列表中最后的值类型必须是error
Type
的约束, 如上所说, 参数的类型可以是指针/非指针类型, 但是指针只不允许多重指针的出现, 另外参数不能为接口类型, 不管它是空接口还是非空接口, 除了LittleRpc
能够理解的context.Context
&stream.Stream
&error
type Type interface {
Pointer(NoInterface) | NoPointer(NoInterface)
}
func(receiver) FuncName(...Type) (...Type,error)
littlerpc
并不规定合法的过程必须要传递参数,以下的声明也是合法的
func(receiver) FuncName() (...Type,error)
littlerpc
也不规定,一定要返回一个值,但是error必须在返回值列表中被声明,以下的声明也是合法的
func(receiver) FuncName() error
关于context.Context
&stream.Stream
, 输入参数可以有context.Context
也可以没有stream.Stream
同理, 如果有的话context.Context
必须被放置在第一个参数的位置, 当它们同时存在时, stream.Stream
必须被放置在第二个位置, 以下列出了参数的几种排列情况, ...
表示参数列表的长度为0...N
-
func(receiver Type) FuncName(context.Context,...Type) (...result,error)
-
func(receiver Type) FuncName(context.Context,stream.Stream,...Type) (...Type,error)
-
func(receiver Type) FuncName(stream.Stream,...Type) (...Type,error)
-
func(receiver Type) FuncName(...Type) (...Type,error)
LittleRpc-Utils
Code-Generator
在编写每个客户端的代理对象时有很多繁琐的动作需要人工去完成,所以为了减轻这些不必要的工作,我提供了一个简易实现的代码生成器,自动生成代理对象和对应的过程。
代理对象生成器只会识别接收器类型为指针、拥有可导出名字(首字母大写)的过程,其它类型的过程均不会被生成器识别
Install(安装)
go install github.com/nyan233/littlerpc/cmd/pxtor
LittleRpc-Example
中也使用了pxtor
,这是其中的一个例子: proxy
LittleRpc-Curl
这是一个通过使用LittleRpc
默认注册的reflection service
来提供调试和调用测试的工具
Install(安装)
go install github.com/nyan233/littlerpc/cmd/lrpcurl
Example
Quick-Start
Transport
Custom
Balancer & Resolver
Thanks
感谢,以下这些项目给本项目的一些设计带来了想法和灵感
Lisence
The LittleRpc Use Mit licensed. More is See Lisence