Go 微服务开发框架的设计思路
DMicro

背景

DMicroGoswoolebeegogoframegingo-microgo-zeroerpc
golang
tcpwebsocketquicunixsocket
erpcgoframeDMicro

概述

DMicrodrpcerpc
drpcDMicroDMicroerpc
DMicrogoframegoframe
DRpc
对等通信对等Api高性能非阻塞异步IO自定义Proto兼容http协议自定义CodecHook点插件系统Push消息session管理Socket抽象断线重连过载保护负载均衡心跳机制平滑重启...
DServer
快速构建平滑重启多进程支持单/多进程一致预定义命令行ctrl命令管理服务可观测可控制应用沙盒
DMicro
RegistrySelectorEventbusSupervisorCode genTracingMetricsBrokerOpenAPI

架构

dmicro架构图.png

设计理念

DMicro
  • 面向接口设计,保证代码稳定,提供灵活定制。
  • 抽象各组件的接口,高内聚,低耦合。
  • 分层设计,自上而下逐层封装,利于稳定和维护。
  • 高性能,高可用,低消耗。
  • 对开发友好,封装复杂度。
  • 提供丰富的组件及功能,让开发专注业务。
DMicro
Clarity(清晰)Simplicity(简单)Productivity(生产力)

无论工作,还是做开源项目,都应该保持这三个原则,养成良好的习惯。

面向接口设计

DMicro

下图展示的是消息的发送的流转流程,可以看到,所有的功能点都被抽象成了接口,每个功能点都提供了不同的实现.

消息流转图.png

会话 Session

Rpcsessionsessiondrpcsession
EndpointClientServerApi服务端客户端服务端多个客户端一个多个文件描述符数据/属性
SessiondrpcSocketMessageContextsession
  • 获取连接信息
  • 控制连接的生命周期(超时时间)
  • 控制单次请求的生命周期(超时时间)
  • 接收消息
  • 发送消息
  • 创建消息的上下文
  • 绑定会话的相关信息(如用户信息)
  • 断线重连
  • 主动断开会话.
  • 健康检查
  • 获取连接关闭事件
  • 为会话设置单独的id
Sessioninterface{}EarlySessionBaseSessionCtxSessionSessionSession
EarlySessionBaseSessionCtxSessionSession
SessionCtxSession
Message
MessageHeaderBody
Message interface{}
SizeTransfer-Filter-PipelineSeqMTypeServiceMethodMetaBodyCodecBody

消息结构组成.png

协议 Proto

消息MessageProto

接口的定义如下:

Version()PackMessageUnpackMessage
HttpJsonRawProtobufJsonRpc
RAW

raw协议的组成.png

其他协议可以参考代码.

编码 Codec

drpcCodec

接口的定义如下:

IDNameMarshalUnmarshal
FormJsonplainProtobufXML

连接 Socket

Socketnet.Conn
SocketSessionSessionSocket
Socket
TCP V4TCP V6Unix SocketKCPQUIC

支持对连接的性能调优.

SetKeepAliveSetKeepAlivePeriodSetReadBufferSetWriteBufferSetNoDelayControlFD

有机的组合

DMicroDMicro

接下来我们要讲到实现这些能力的基础.插件系统.

插件 Plugin

插件系统给框架带来了极大的扩展性和灵活性,是整个框架的一个灵魂模块,有了它,框架就有了无限可能。

什么样的插件系统才能算是优雅呢?我能想到的有以下几点:

hookhookhookhook
drpcEndpoint

接收call请求的服务端和发送call请求的客户端.png

钩子 Hook

组件

有了插件,就能通过插件的组合,编写综合功能的组件,目前框架提供一些内置的组件,

服务端 Rpc Server客户端 Rpc Client服务注册 Registry服务发现 Selector事件总线 EventBus进程管理 Supervisor

即将提供:

链路追踪 Tracing统计告警 Metrics限流熔断 Broker

限于篇幅的原因,具体组件的实现,这里就不深入讲解,请关注后续的文章.

未来展望

DMicro

接下来的方向主要是往易用性和可靠性方向发展.

易用性:

dmctl

可靠性:

  • 可观测性
    • 链路追踪
    • 指标信息
    • 日志流
  • 生产可用
    • 测试用例的完善
    • 代码覆盖率
    • 性能调优
DMicro
DMicroDMicroDMicroForkpr