网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

来源 | OSCHINA 社区

作者 | ClownFish

原文链接:https://my.oschina.net/clownfish/blog/5560923

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

DMicro源码地址:

  • GitHub: https://github.com/osgochina/dmicro

  • Gitee: https://gitee.com/osgochina/dmicro

背景

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

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

  • 微服务应用和单体应用同时开发。

  • 高性能,高可用的网络通讯。

  • 需要自定义应用层的协议 (重点)。

  • 需要灵活的插件扩展机制,方便适配现有系统 (重点)。

  • 服务端与客户端的概念模糊,互相都能使用相同的 api 调用对方。

  • 支持 Push 消息。

  • 连接 / 会话管理。

  • 高效率的开发,支持通过 proto 生成代码。

  • 支持多种网络协议,tcp,websocket,quic,unixsocket.

  • 兼容 http 协议。

  • 能够更快速的定位问题。

  • 更便捷的增加新特性。

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

概述

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

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

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

DRpc特性列表:

  • 对等通信,对等Api

  • 高性能,非阻塞异步IO

  • 自定义Proto,,兼容http协议,自定义Codec

  • Hook点,插件系统,

  • Push消息,session管理Socket抽象,

  • 断线重连,过载保护,负载均衡,心跳机制,

  • 平滑重启...

DServer特性列表:

  • 快速构建,平滑重启,多进程支持,单/多进程一致

  • 预定义命令行,ctrl命令管理服务

  • 可观测,可控制,应用沙盒

DMicro已经内置组件:

  • [x]Registry服务注册

  • [x]Selector服务发现

  • [x]Eventbus事件总线

  • [x]Supervisor进程管理

  • [ ]Code gen代码生成

  • [ ]Tracing链路追踪

  • [ ]Metrics统计告警

  • [ ]Broker限流熔断

  • [ ]OpenAPI文档自动生成

架构

设计理念

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

  • 面向接口设计,保证代码稳定,提供灵活定制。

  • 抽象各组件的接口,高内聚,低耦合。

  • 分层设计,自上而下逐层封装,利于稳定和维护。

  • 高性能,高可用,低消耗。

  • 对开发友好,封装复杂度。

  • 提供丰富的组件及功能,让开发专注业务。

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

  • Clarity(清晰)

  • Simplicity(简单)

  • Productivity(生产力)

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

面向接口设计

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

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

会话 Session

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

  • Endpoint融合了ClientServer, 需要提供相同的Api.

  • 服务端需要主动向客户端发送消息,并且获取客户端的响应.

  • 服务端支持对多个客户端批量发送消息.

  • 异步主动断开一个多个会话.

  • 获取会话底层的文件描述符, 对其进行性能调优.

  • 可以为每个会话绑定特殊的数据/属性.

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

  • 获取连接信息

  • 控制连接的生命周期 (超时时间)

  • 控制单次请求的生命周期 (超时时间)

  • 接收消息

  • 发送消息

  • 创建消息的上下文

  • 绑定会话的相关信息 (如用户信息)

  • 断线重连

  • 主动断开会话.

  • 健康检查

  • 获取连接关闭事件

  • 为会话设置单独的 id

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

  • EarlySession表示刚生成会话,尚未启动 goroutine 读取数据的阶段.

  • BaseSession只有最基础的方法,用于关闭连接时候的插件参数.

  • CtxSession在处理程序上下文中传递的会话对象.

  • Session全功能的会话对象.

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

Message

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

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

  • Size消息的长度

  • Transfer-Filter-Pipeline报文数据过滤处理管道

  • Seq序列号

  • MType消息类型

  • ServiceMethod资源标识符

  • Meta消息的元数据

  • BodyCodec消息体编码格式

  • Body消息体

协议 Proto

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

接口的定义如下:

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

  • Version()返回该协议的 id 和名字,两个组成唯一的版本号.

  • Pack对消息Message对象进行序列化.

  • Unpack对字节流反序列化,生成一个消息Message对象.

目前框架已支持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

  • ID返回编 Codec 的 id

  • Name返回编 Codec 的名字,名字是为了开发者更容易识别.

  • Marshal对消息内容进行编码

  • Unmarshal对消息内容进行解码

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

连接 Socket

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

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

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

  • TCP V4,TCP V6

  • Unix Socket

  • KCP

  • QUIC

支持对连接的性能调优.

  • SetKeepAlive开启链接保活

  • SetKeepAlivePeriod链接保活间隔时间

  • SetReadBuffer设置链接读缓冲区 size

  • SetWriteBuffer获取链接写缓冲区 size

  • SetNoDelay开启关闭 no delay 算法

  • ControlFD支持操作链接的原始句柄

有机的组合

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

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

插件 Plugin

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

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

  • 合理且丰富的hook位置,能够覆盖整个框架的生命周期,贯穿通讯的各个环节。

  • 每个hook位置的入参和出参都是经过精心设计。

  • 每个插件都能够使用多个hook位置,每个hook位置都能被多个插件使用。

  • 设计的足够简洁,优雅。能方便的进行二次开发定制。

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

组件

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

  • 服务端 Rpc Server

  • 客户端 Rpc Client

  • 服务注册 Registry

  • 服务发现 Selector

  • 事件总线 EventBus

  • 进程管理 Supervisor

即将提供:

  • 链路追踪 Tracing

  • 统计告警 Metrics

  • 限流熔断 Broker.

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

未来展望

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

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

易用性:

  • 项目效能工具dmctl工具的开发,包括代码生成,项目结构生成,打包,编译等等功能.

  • 符合 openapi 定义的文档组件的开发.

  • 更加完善的文档和使用示例.

可靠性:

  • 可观测性

    • 链路追踪

    • 指标信息

    • 日志流

  • 生产可用

    • 测试用例的完善

    • 代码覆盖率

    • 性能调优

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

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

最穷的时候公司账上只剩700块

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
女大学生当收纳师一单赚16万,整理了300平米衣帽间

女大学生当收纳师一单赚16万,整理了300平米衣帽间

大象新闻
2024-12-22 12:52:59
靖国神社涂鸦男子称是为抗议核污水排海,检方:你们行动前一天还在东京吃海鲜

靖国神社涂鸦男子称是为抗议核污水排海,检方:你们行动前一天还在东京吃海鲜

火锅局
2024-12-22 20:36:48
乌军高层当场“打脸”,盛赞中国产无人机,一旁美军脸色十分难看

乌军高层当场“打脸”,盛赞中国产无人机,一旁美军脸色十分难看

空天力量
2024-12-22 11:51:51
大脑为什么要删除你 2 岁前的记忆?原因竟然是……

大脑为什么要删除你 2 岁前的记忆?原因竟然是……

上观新闻
2024-12-21 13:57:13
太惨了!网传南通一业主在自家6楼阳台晒被褥时,一不小心坠亡…

太惨了!网传南通一业主在自家6楼阳台晒被褥时,一不小心坠亡…

火山诗话
2024-12-22 12:12:51
一周人事观察|“70后”中央候补委员晋升正部;卸任市委书记的她有新职

一周人事观察|“70后”中央候补委员晋升正部;卸任市委书记的她有新职

大众日报
2024-12-22 15:47:44
美国教授泰勒.考恩:我去过100多国家,印度的食物是世界上最好的

美国教授泰勒.考恩:我去过100多国家,印度的食物是世界上最好的

蜉蝣说
2024-12-22 15:20:22
恶心坏了!贵阳一女子家中被扔进一颗“炸弹”,残羹剩饭炸开花

恶心坏了!贵阳一女子家中被扔进一颗“炸弹”,残羹剩饭炸开花

极目新闻
2024-12-22 20:11:32
公务员双休取消或将提上日程,山东率先试点!

公务员双休取消或将提上日程,山东率先试点!

黯泉
2024-12-22 23:51:04
惊险!列车被塔吊击中,上海地铁紧急道歉,网友:还好不是工作日

惊险!列车被塔吊击中,上海地铁紧急道歉,网友:还好不是工作日

娱官儿
2024-12-22 16:15:52
一内地游客香港买花胶,店员切片后单价由斤变两,被宰2.64万港元

一内地游客香港买花胶,店员切片后单价由斤变两,被宰2.64万港元

风语励志情
2024-12-21 20:00:32
叙利亚新当局任命外长和防长

叙利亚新当局任命外长和防长

新京报
2024-12-22 15:48:06
​预售破6200万,甄子丹加陈思诚都压不住,2024年度大黑马来了?

​预售破6200万,甄子丹加陈思诚都压不住,2024年度大黑马来了?

靠谱电影君
2024-12-22 12:24:12
硬碰硬!计划加920%关税!美国抄中国打法是吧?有本事就硬到底…

硬碰硬!计划加920%关税!美国抄中国打法是吧?有本事就硬到底…

魏家东
2024-12-22 10:03:23
中国最有可能成为世界级巨头的十家公司!1、比亚迪,2、大疆…

中国最有可能成为世界级巨头的十家公司!1、比亚迪,2、大疆…

魏家东
2024-12-21 09:49:17
3艘094同时上浮,西方卫星拍下,令美国人压力倍增的一幕

3艘094同时上浮,西方卫星拍下,令美国人压力倍增的一幕

空天力量
2024-12-22 10:47:43
广西南宁青秀区区长曾鹏鑫已辞去自治区人大代表职务

广西南宁青秀区区长曾鹏鑫已辞去自治区人大代表职务

澎湃新闻
2024-12-22 22:12:26
进口药消失了,中药注射剂来了

进口药消失了,中药注射剂来了

常识传播局
2024-12-22 17:33:12
“第三次世界大战是否正在进行”?普京回应

“第三次世界大战是否正在进行”?普京回应

环球网资讯
2024-12-22 16:27:17
外媒:特朗普上任首日拟退出世卫组织

外媒:特朗普上任首日拟退出世卫组织

参考消息
2024-12-22 21:24:50
2024-12-23 03:32:49
开源中国 incentive-icons
开源中国
每天为开发者推送最新技术资讯
6680文章数 34327关注度
往期回顾 全部

科技要闻

售价78.80万元起,蔚来高端行政车ET9上市

头条要闻

上海女子忍无可忍报警:家里被灌进70斤胶水 要价2万

头条要闻

上海女子忍无可忍报警:家里被灌进70斤胶水 要价2万

体育要闻

逆潮流而行!灰熊已成NBA最另类球队

娱乐要闻

赵丽颖化淡妆、唐嫣戴帽子,相差4岁状态不一样

财经要闻

山姆,又出事!网友:太吓人

汽车要闻

直面78S挑战 蔚来ET9售价66万元起

态度原创

亲子
本地
艺术
数码
公开课

亲子要闻

我以为胡图图是来捣蛋的,没想到他真的帮上了忙,我终于终于终于拼好了! 杨雪呀

本地新闻

好吃潮州|潮州腐乳饼,咸甜党都沦陷了

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

数码要闻

苹果将于2028年推出OLED MacBook Air 屏幕刘海依然难以避免

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版