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

2022-08-01 17:43:23 +08:00
 ClownFish

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

DMicro源码地址:

背景

DMicro诞生的背景,是因为我写了 10 来年的 PHP ,想在公司内部推广Go,公司内部的组件及 rpc 协议都是基于swoole定制化开发的。调研了市面上的各种框架,包括beego,goframe,gin,go-micro,go-zero,erpc等等,可能是我当时技术能力有限,并不能让这些框架很好的适配我们的业务。

我们业务开发有几个痛点,在当时golang的生态中无法找到一整套解决方案。

在对常用的开源框架做了简单的调研以后,发现并没有一款合适的框架能满足我的所有需求。在认真思考过后,发现erpcgoframe两个框架的结合体能满足我的需求,于是就诞生了自研DMicro.

概述

DMicro中的drpc组件的思想是参考erpc实现,甚至可以说是它的继承者。

drpc组件是DMicro框架的一部分,为了适配DMicro框架,在erpc的基础上做了深入的扩展开发。

整个DMicro大量使用goframe中的组件,如果业务使用goframe框架,可以无缝接入。

DRpc特性列表:

DServer特性列表:

DMicro已经内置组件:

架构

设计理念

DMicro框架的设计,从设计之初就是在追求灵活性,适应性。在保证微服务的稳定性前提下,追求项目的开发效率。

无数个写DMicro的日夜,我都谨记开发三原则:

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

面向接口设计

DMicro秉承着万物皆接口的原则,提供框架无与伦比的扩展性.

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

会话 Session

大多数的Rpc框架并不强调会话(session)的概念,因其应用场景不需要用到会话(session). 那么drpc为什么需要抽象出会话(session)呢?

Session抽象了整个drpc框架的会话,把Socket,Message,Context都融合到一起. 开发者只需要对session进行操作,就能实现大多数需求.

Session接口可以细分为 4 个interface{},分别是EarlySession,BaseSession,CtxSession,Session. 对应的是应用的不同生命阶段会话(Session)拥有的不同属性.

正常情况下,开发者用到的都是Session,CtxSession这两个接口,其他 2 个接口是在插件中使用.

消息 Message

消息Message 包含消息头Header,消息体Body,是客户端与服务端之间通信的实体.

Message interface{} 抽象了对通信实体的操作.

协议 Proto

协议是对消息 Message对象的序列化和反向序列化,框架提供Proto 接口. 只需要实现该接口,开发者就能定制符合业务需求的自定义协议,从而提升了框架的灵活性.

接口的定义如下:

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

目前框架已支持Http,Json,Raw,Protobuf,JsonRpc这 5 个协议.

RAW协议组成如下:

其他协议可以参考代码.

编码 Codec

作为一个通用性的框架,支持的协议可以有多种,消息体的编解码也可以有多少种. drpc使用Codec接口对消息体 Body 进行编解码.

接口的定义如下:

type Codec interface {
	ID() byte
	Name() string
	Marshal(interface{}) ([]byte, error)
	Unmarshal([]byte, interface{}) error
}

目前框架已支持Form,Json,plain,Protobuf,XML这 5 个编解码.

连接 Socket

Socket扩展了net.Conn,并且抽象出接口,方便框架对底层网络协议的集成.

Socket接口实现了一部分Session接口的功能,Session接口调用的一些方法,实际上是转发调用了Socket中的方法.

这样的分层实现,让Socket拥有的集成其他协议的能力.

支持对连接的性能调优.

有机的组合

前面讲到,DMicro框架万物皆接口,分层+接口的设计,让DMicro有了灵活的组成高效且符合业务实际情况的能力.

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

插件 Plugin

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

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

drpc中,钩子贯穿与整个Endpoint的生命周期,是它不可或缺的重要一环。

通过这些钩子 Hook点,赋予了插件无限可能.

组件

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

即将提供:

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

未来展望

如果把DMicro比作人生,现在成长的阶段还处在少年时期,只完成了基础的架构设计和一部分组件的开发.

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

易用性:

可靠性:

希望DMicro能在大家的呵护及鞭策下茁长成长.

开源不易,需要更多小伙伴加入,共创DMicro. 如果你希望使用DMicro,赶快引入代码,搭建你的第一个新项目吧! 如果你也想为DMicro生态添砖加瓦,赶快Fork代码,给我们提交pr吧!

3145 次点击
所在节点    程序员
9 条回复
lian3204321
2022-08-01 19:08:37 +08:00
哇,这个思路可以的
zzhpeng
2022-08-01 19:41:53 +08:00
向大佬学习!!
lesismal
2022-08-01 19:54:33 +08:00
似乎我的 arpc 就能搞定绝大多数了
对于“高效率的开发,支持通过 proto 生成代码“想做也容易,但我觉得这反倒不如我现在支持的方式更简洁省力,反倒限制了自由度所以没做

github.com/lesismal/arpc
RedisMasterNode
2022-08-02 08:49:15 +08:00
挑个小毛病图一 EventBug
fregie
2022-08-02 09:48:29 +08:00
很多好东西,但是既然用的 golang ,何必把这些都东西都攒在一起呢,用什么拿什么不好吗
ClownFish
2022-08-02 11:01:35 +08:00
@lesismal 拜读了你的项目,写的很好哦!
ClownFish
2022-08-02 11:01:54 +08:00
@RedisMasterNode 谢谢,已修正哦
ClownFish
2022-08-02 11:02:34 +08:00
@fregie 结合自身情况吧,需要一个统一的解决方案
useben
2022-08-02 15:02:43 +08:00
别的不说, 这篇文章整理的不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/870021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX