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

接口的定义如下:

type Proto interface {
	Version() (byte, string)
	Pack(Message) error
	Unpack(Message) error
}
Version()PackMessageUnpackMessage
HttpJsonRawProtobufJsonRpc
RAW

raw 协议的组成.png

其他协议可以参考代码.

编码 Codec

drpcCodec

接口的定义如下:

type Codec interface {
	ID() byte
	Name() string
	Marshal(interface{}) ([]byte, error)
	Unmarshal([]byte, interface{}) error
}
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