Code Monkey home page Code Monkey logo

littlerpc's Introduction

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

littlerpc's People

Contributors

zbh255 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

littlerpc's Issues

优化捕捉到panic时输出的信息

主要优化使用到goroutine pool代码的client&server
优雅地打印堆栈信息以确定panic的原因, 最好还能像gin那样判断panic是携带的error类型, 不同类型做不同的处理

Rpc错误的新定义

旧的关于error定义和解析的API相当不友好, 也只能使用Json Codec, 不是一个好的设计
新的错误应该符合以下几个条件

  • 清晰明了的API
  • 易于扩展和自定义的
  • 可以兼容不同的Codec

目前的实现的缺点

  • 通过返回0来定义Nil错误
  • 只能使用Json Codec (在数据量大时效率低下)
  • 简易的API (难以使用)

完善client的负载均衡的功能

  • 提供选择器Selector来接入各种负载均衡算法,主要兼容一致性hash,
  • 提供重试选项配合选择器来让重新选择需要发送数据的节点

提供异步调用API

LittleRpc目前的提供的API是同步模式的,虽然性能上也能满足需求,但是其后续请求响应时间可能受限于一次响应比较慢的调用,响应比较慢可能是因为传输的数据量比较大等原因,所以提供异步调用的API以用来减少这种情况,让其不会阻塞后续比较小数据量的调用。

目前设计的API原型

AsyncCall(processName string,args ...interface{}) (rep []interface{},err error)
RegisterCallBack(processName string,fn func(rep []interface{},err err error))

生成器也必须生成一套支持异步调用语义的接口与实现

type TestHybridInter interface {
    Say(str sting) (string,error)
    SayAsync(str string) error
    RegisterSayCallBack(fn func(_ string,_ error))
}

go test 覆盖率的问题

LittleRpc/impl中存放的是具体的client&server的具体实现,而其测试代码因为要同时用到client&server的API,不能将测试代码安排在client&server包中,所以被安排在了主目录下,但是在go test -v -cover ./...执行完毕后,test包中每个测试项都被执行了,impl中显示的覆盖率为%5.1
这显然是不正常的,在初步了解到了go test覆盖率计算的-coverpkg,也即测试的代码和被测试的代码不在同一个包中,我意识到要想保证正确的覆盖率,我需要一种新的测试方法。

v0.30 Release Plain

  • 支持自定义的Codec
  • Codec接口中新增新的API,来让Codec自己来处理littlerpc自动注入的error
UnmarshalError(data []byte,i interface{}) error
MarshalError(i interface{}) ([]byte,error)
  • 更改Client.Call的API约定,将所有远程过程的返回值都存放在Rep([]interface{})
  • 生成器pxtor能够生成符合新的API规范的代码
  • 完善一部分文档
  • 实现可以替换通信协议的接口

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.