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