github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/README.md (about) 1 # LittleRpc [![Go Report Card](https://goreportcard.com/badge/github.com/nyan233/littlerpc)](https://goreportcard.com/report/github.com/nyan233/littlerpc) [![Ci](https://github.com/nyan233/littlerpc/actions/workflows/ci.yml/badge.svg)](https://github.com/nyan233/littlerpc/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/nyan233/littlerpc/branch/main/graph/badge.svg?token=9S2QN667YY)](https://codecov.io/gh/nyan233/littlerpc) ![Go Version](https://img.shields.io/github/go-mod/go-version/nyan233/littlerpc) ![GitHub](https://img.shields.io/github/license/nyan233/littlerpc?color=fef&label=License&logo=fe&logoColor=blue) 2 3 高性能、轻量实现、少依赖、跨语言的玩具级RPC实现 4 5 ## Features 6 7 - [x] 可替换的底层传输协议 8 - [x] tcp 9 - [x] webSocket 10 - [x] other 11 - [x] 可替换的序列化/反序列化组件 12 - [x] json 13 - [x] other 14 - [x] 可替换的压缩算法 15 - [x] gzip 16 - [x] 调用描述接口 17 - [x] Sync 18 - [x] Async 19 - [x] 负载均衡 20 - [x] 地址列表解析器 21 - [x] 轮询 22 - [ ] 一致性Hash(问题很大,需要优化) 23 - [ ] 客户端的实现 24 - [x] go 25 - [ ] java 26 - [ ] javascript 27 - [ ] 完善的服务治理拓展API 28 - [ ] 熔断 29 - [ ] 限流 30 - [ ] 网关 31 - [ ] 注册中心 32 - [x] 完善可用的代码生成器 33 - [x] 生成async api 34 - [x] 生成sync api 35 - [ ] 完善的示例 36 37 ## Benchmark 38 39 基准测试的指标来自[rpcx-benchmark](https://github.com/rpcxio/rpcx-benchmark),以下结果仅供参考,不同平台的结果可能会不一致,想要清晰的测量结果之前最好自己动手试一试 40 41 `Platfrom` 42 ```shell 43 Server 44 CPU : AMD EPYC 7T83 16Core 45 Memory : 16GB * 4 ECC 46 Network : 7.5G 47 NumaNode : 0~0 48 49 Client 50 CPU : AMD EPYC 7T83 16Core 51 Memory : 16GB * 4 ECC 52 Network : 7.5G 53 NumaNode : 0~0 54 ``` 55 在测试中, `client`/`server`分别在一台机器上运行 56 57 `Mock 10us` 58 ![result](https://raw.githubusercontent.com/zbh255/source/main/rpc-bench1.svg) 59 ## Install 60 61 ```go 62 go get github.com/nyan233/littlerpc 63 ``` 64 65 ## Process-Defined 66 67 在`littlerpc`中一个合法的过程是如下那样,必须有一个接收器,参数可以是指针类型或者非指针类型,返回结果集允许指针/非指针类型,返回值列表中最后的值类型必须是error 68 69 `Type`的约束, 如上所说, 参数的类型可以是指针/非指针类型, 但是指针只不允许多重指针的出现, 另外参数不能为接口类型, 不管它是空接口还是非空接口, 除了`LittleRpc`能够理解的`context.Context`&`stream.Stream`&`error` 70 71 ```go 72 type Type interface { 73 Pointer(NoInterface) | NoPointer(NoInterface) 74 } 75 ``` 76 77 ```go 78 func(receiver) FuncName(...Type) (...Type,error) 79 ``` 80 81 `littlerpc`并不规定合法的过程必须要传递参数,以下的声明也是合法的 82 83 ```go 84 func(receiver) FuncName() (...Type,error) 85 ``` 86 87 `littlerpc`也不规定,一定要返回一个值,但是error必须在返回值列表中被声明,以下的声明也是合法的 88 89 ```go 90 func(receiver) FuncName() error 91 ``` 92 93 关于`context.Context`&`stream.Stream`, 输入参数可以有`context.Context`也可以没有`stream.Stream`同理, 如果有的话`context.Context`必须被放置在第一个参数的位置, 当它们同时存在时, `stream.Stream`必须被放置在第二个位置, 以下列出了参数的几种排列情况, `...`表示参数列表的长度为`0...N` 94 95 - ```go 96 func(receiver Type) FuncName(context.Context,...Type) (...result,error) 97 ``` 98 99 - ```go 100 func(receiver Type) FuncName(context.Context,stream.Stream,...Type) (...Type,error) 101 ``` 102 103 - ```go 104 func(receiver Type) FuncName(stream.Stream,...Type) (...Type,error) 105 ``` 106 107 - ```go 108 func(receiver Type) FuncName(...Type) (...Type,error) 109 ``` 110 111 ## LittleRpc-Utils 112 113 ### Code-Generator 114 115 在编写每个客户端的代理对象时有很多繁琐的动作需要人工去完成,所以为了减轻这些不必要的工作,我提供了一个简易实现的代码生成器,自动生成代理对象和对应的过程。 116 117 > 代理对象生成器只会识别接收器类型为指针、拥有可导出名字(首字母大写)的过程,其它类型的过程均不会被生成器识别 118 119 #### Install(安装) 120 121 ```shell 122 go install github.com/nyan233/littlerpc/cmd/pxtor 123 ``` 124 125 `LittleRpc-Example`中也使用了`pxtor`,这是其中的一个例子: [proxy](./example/proxy) 126 127 ### LittleRpc-Curl 128 129 这是一个通过使用`LittleRpc`默认注册的`reflection service`来提供调试和调用测试的工具 130 131 #### Install(安装) 132 133 ```sh 134 go install github.com/nyan233/littlerpc/cmd/lrpcurl 135 ``` 136 137 ## Example 138 139 ### Quick-Start 140 141 - [quick-start](./example/quick_start) 142 - [hello-world](./example/hello_world) 143 144 ### Transport 145 146 - `TCP` 147 - `WebSocket` 148 149 ### Custom 150 151 - `Codec` 152 - `Encoder` 153 154 ### Balancer & Resolver 155 156 - Todo 157 158 ## Thanks 159 160 感谢,以下这些项目给本项目的一些设计带来了想法和灵感 161 162 - [rpcx](https://github.com/smallnest/rpcx) 163 - [grpc-go](https://github.com/grpc/grpc-go) 164 - [std-rpc](https://github.com/golang/go/tree/master/src/net/rpc) 165 166 ## Lisence 167 168 The LittleRpc Use Mit licensed. More is See [Lisence](https://github.com/nyan233/littlerpc/blob/main/LICENSE) 169