Skip to content

高性能/跨语言/轻量的玩具级RPC实现,致力提供高扩展性的API,您可以打造属于自己的RPC-Framework!

License

Notifications You must be signed in to change notification settings

nyan233/littlerpc

Repository files navigation

LittleRpc Go Report Card Ci codecov Go Version GitHub

高性能、轻量实现、少依赖、跨语言的玩具级RPC实现

Features

  • 可替换的底层传输协议
    • tcp
    • webSocket
    • other
  • 可替换的序列化/反序列化组件
    • json
    • other
  • 可替换的压缩算法
    • gzip
  • 调用描述接口
    • Sync
    • Async
  • 负载均衡
    • 地址列表解析器
    • 轮询
    • 一致性Hash(问题很大,需要优化)
  • 客户端的实现
    • go
    • java
    • javascript
  • 完善的服务治理拓展API
    • 熔断
    • 限流
    • 网关
    • 注册中心
  • 完善可用的代码生成器
    • 生成async api
    • 生成sync api
  • 完善的示例

Benchmark

基准测试的指标来自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分别在一台机器上运行

Mock 10us result

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

  • TCP
  • WebSocket

Custom

  • Codec
  • Encoder

Balancer & Resolver

  • Todo

Thanks

感谢,以下这些项目给本项目的一些设计带来了想法和灵感

Lisence

The LittleRpc Use Mit licensed. More is See Lisence

About

高性能/跨语言/轻量的玩具级RPC实现,致力提供高扩展性的API,您可以打造属于自己的RPC-Framework!

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages