高性能、轻量实现、少依赖、跨语言的玩具级RPC实现
- 可替换的底层传输协议
- tcp
- webSocket
- other
- 可替换的序列化/反序列化组件
- json
- other
- 可替换的压缩算法
- gzip
- 调用描述接口
- Sync
- Async
- 负载均衡
- 地址列表解析器
- 轮询
- 一致性Hash(问题很大,需要优化)
- 客户端的实现
- go
- java
- javascript
- 完善的服务治理拓展API
- 熔断
- 限流
- 网关
- 注册中心
- 完善可用的代码生成器
- 生成async api
- 生成sync api
- 完善的示例
基准测试的指标来自rpcx-benchmark,以下结果仅供参考,不同平台的结果可能会不一致,想要清晰的测量结果之前最好自己动手试一试
Platfrom
Server
CPU : AMD EPYC 7T83 16Core
Memory : 16GB * 4 ECC
Network : 7.5G
NumaNode : 0~0
Client
CPU : AMD EPYC 7T83 16Core
Memory : 16GB * 4 ECC
Network : 7.5G
NumaNode : 0~0
在测试中, client
/server
分别在一台机器上运行
go get github.com/nyan233/littlerpc
在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)
在编写每个客户端的代理对象时有很多繁琐的动作需要人工去完成,所以为了减轻这些不必要的工作,我提供了一个简易实现的代码生成器,自动生成代理对象和对应的过程。
代理对象生成器只会识别接收器类型为指针、拥有可导出名字(首字母大写)的过程,其它类型的过程均不会被生成器识别
go install github.com/nyan233/littlerpc/cmd/pxtor
LittleRpc-Example
中也使用了pxtor
,这是其中的一个例子: proxy
这是一个通过使用LittleRpc
默认注册的reflection service
来提供调试和调用测试的工具
go install github.com/nyan233/littlerpc/cmd/lrpcurl
TCP
WebSocket
Codec
Encoder
- Todo
感谢,以下这些项目给本项目的一些设计带来了想法和灵感
The LittleRpc Use Mit licensed. More is See Lisence