Skip to content

merenguessss/dracarys

Repository files navigation

Dracarys

Dracarys是一个轻量级💨、高性能🚀、开源🌟、可插拔🐲的RPC框架。

证书

Dracarys的源码允许用户在遵循MIT 开源证书 规则的前提下使用。

安装

在安装Dracarys之前,需要先部署Go环境(Go 1.16+)。

在Go module支持下,你只需要简单执行以下命令进行导入:

import "github.com/merenguessss/dracarys"

在你的代码中执行执行 go [build | run | test] 时会自动下载依赖项。

否则,请执行以下命令进行安装:

go get -u github.com/merenguessss/dracarys

快速开始

下面展示一个最简单的例子:

git clone https://github.com/merenguessss/dracarys.git
#server
cd example/reflection/server
go run main.go
#client
cd example/reflection/client
go run main.go

具体调用文档请参考Dracarys使用手册

功能特性

服务发现

Dracarys目前默认使用consul作为服务发现插件。

调用consul的api实现服务发现、服务注册、心跳检测等。

如需自定义服务中心,请参考Dracarys服务中心手册

Dracarys自有的服务中心正在开发中😉)

负载均衡

Dracarys目前默认使用加权轮询的负载均衡方式。

支持的负载均衡器有:加权轮询、轮询、随机、一致性hash(在写了😬)

详细使用及自定义负载均衡器请参考Dracarys负载均衡手册

可以通过client端配置插件配置进行使用:

pluginOpts := []plugin.Option{
	WithBalancerName(balancerName),
}
opts := []client.Option{
	WithPluginFactoryOptions(pluginOpts),
}
client := dracarys.NewClient(opts...)

也可以通过全局配置进行配置。

如需自定义负载均衡器

日志系统

Dracarys支持多样化日志系统。

目前默认使用自带的日志系统。

如需自定义日志系统请参考Dracarys日志系统手册

序列化

Dracarys支持多样化的序列化方式。

目前默认使用json进行代码反射调用序列化。如果使用代码生成,将会使用protocol序列化。

除此之外还支持gencode(序列化速度更快)、msgpack作为反射序列化。

如需自定义序列化方式,请参考Dracarys序列化手册

全局配置

Dracarys支持通过yml进行全局配置。

详细配置内容请参考Dracarys全局配置手册

协议

协议格式如图:

protocol

Header

header中包括以下几个部分:

header

Magic

Magic为魔数,用于判断是否为Dracarys协议。魔数为常量0x12。

Version

Version为版本号,表示当前服务号。用于在某个服务更新后依旧需要提供旧版的服务所用。

MsgType

MsgType为消息类型,分为普通消息和心跳消息。

ReqType

ReqType为请求类型,分为发送并接收、只发送不接收、客户端流请求、服务端流请求、双向流请求。

CompressType

CompressType为压缩类型,用于接收方识别该消息的压缩类型(待扩展)。

StreamID

StreamID在使用流请求时使用(待扩展)。

PackageType

PackageType为包头类型,即编解码协议中Message内容时使用。

Length

Length为协议总长度。

Reserved

Reserved为保留位,待后续使用。

Message

Message为协议报文头部,主要分为请求报文和响应报文。

请求报文头

message Request{
  uint32            request_id    // 一次请求的唯一ID
  string            service_name  // 服务名
  string            method_name   // 方法名
  map<string,bytes> metadata      // 传递的数据
  bytes             payload       // body
}

响应报文头

message Response{
  uint32            ret_code    // 错误码   成功请求为 0
  uint32            request_id  // 一次请求的唯一ID
  string            ret_msg     // 错误消息
  map<string,bytes> metadata    // 传递的数据
  bytes             payload     // body
}

Body

序列化后的请求或响应内容。

性能

这里取grpcDracarys进行性能对比。

对两个框架进行三次测试,进行100w次请求,对三次测试结果取最大值。

Dracarys:

[DRACARYS]2021/06/27 12:10:51 proc.go:225: [INFO] total req  : 1000000
[DRACARYS]2021/06/27 12:10:51 proc.go:225: [INFO] success num: 1000000
[DRACARYS]2021/06/27 12:10:51 proc.go:225: [INFO] fail  num  : 0
[DRACARYS]2021/06/27 12:10:51 proc.go:225: [INFO] total time : 25733
[DRACARYS]2021/06/27 12:10:51 proc.go:225: [INFO] tps        : 38860

在同样的环境下,对grpc进行测试

grpc:

[DRACARYS]2021/06/27 12:17:04 proc.go:225: [INFO] total req  : 1000000
[DRACARYS]2021/06/27 12:17:04 proc.go:225: [INFO] success num: 1000000
[DRACARYS]2021/06/27 12:17:04 proc.go:225: [INFO] fail  num  : 0
[DRACARYS]2021/06/27 12:17:04 proc.go:225: [INFO] total time : 57381
[DRACARYS]2021/06/27 12:17:04 proc.go:225: [INFO] tps        : 17427

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages