littlerpc

package module
v0.4.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 4, 2023 License: MIT Imports: 1 Imported by: 0

README

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,以下结果仅供参考,不同平台的结果可能会不一致,想要清晰的测量结果之前最好自己动手试一试

设置的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
  • TCP
  • WebSocket
Custom
  • Codec
  • Encoder
Balancer & Resolver
  • Todo

Thanks

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

Lisence

The LittleRpc Use Mit licensed. More is See Lisence

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL