EGO是一个集成里各种工程实践的框架。通过组件化的设计模式,保证了业务方能够统一的调用方式启动各种组件
使用EGO的优势
- 配置化驱动组件
- 屏蔽底层组件启动细节
- 微服务组件的可观测、可治理
- 可插拔的Ego-Component组件
- Fail Fast理念和错误友好提示
我们工程师要想提升组件熟练度,首先要大量看开源组件文档和代码,然后坚持长时间使用,才能形成肌肉记忆,提升我们做业务的速度。而这一切所投入的时间和精力是非常大的。
要减少这个投入成本,让更多开发者使用好优秀的开源组件,EGO的做法是标准化所有开源组件,对其做一层封装,统一各种行为。
- 统一组件文件名
- 统一组件配置参数
- 统一组件调用API
- 统一组件错误行为
- 统一组件监控行为
让人掌握了一种组件,就可以举一反三使用其他组件。
- 统一错误码
- 组件错误、慢响应、链路、常规请求拦截器埋点(服务端、客户端均会拦截)
- 收敛错误字段
- 注入组件关键信息:代码行号、配置名、目标地址、耗时、请求数据、响应数据
- 调试阶段,错误高亮、格式化友好提示
- 调试阶段,组件内置debug拦截器
- 生成代码,配置、数据解析、模版分离
- 不依赖于语言,构建项目代码
- 利用Go1.16特性embed,启动web,生成代码
- 项目地址: https://github.com/gotomicro/egoctl
我们框架分为三个层次
- 核心层提供配置、日志、监控和链路,是其他组件的基石
- 组件层提供客户端、服务端、任务端里的各种组件
- 胶水层控制了各种组件的生命周期,错误处理
我们认为一切均是组件,我们将组件分为四个部分:
- Container 处理组件类型、组件配置、组件启动
- Config 配置参数
- Component 组件的调用方法
- Options 配置和组件可选项
组件名称 | 代码 | 例子 | 文档 |
---|---|---|---|
HTTP服务 | 代码 | 例子 | 文档 |
gRPC服务 | 代码 | 例子 | 文档 |
治理服务 | 代码 | 例子 | 文档 |
短时任务 | 代码 | 例子 | 文档 |
常规定时任务 | 代码 | 例子 | 文档 |
分布式定时任务 | 文档 | ||
调用HTTP | 代码 | 例子 | 文档 |
直连调用gRPC | 代码 | 例子 | 文档 |
通过etcd调用gRPC | 例子 | 文档 | |
通过k8s调用gRPC | 例子 | 文档 | |
调用MySQL | 代码 | 例子 | 文档 |
调用Redis | 代码 | 例子 | 文档 |
调用Redis分布式锁 | 代码 | ||
调用Mongo | 代码 | ||
调用Kafka | 代码 | ||
调用ETCD | 代码 | ||
调用K8S | 代码 | ||
调用Oauth2 | 代码 | ||
调用Wechat | 代码 | ||
调用Dingtalk | 代码 | ||
调用Jira | 代码 |
- 配置驱动
所有组件启动方式为
组件名称.Load("配置名称").Build()
,可以创建一个组件实例。如以下http server
,egin
是组件名称,server.http
是配置名称
egin.Load("server.http").Build()
- 友好的debug
通过开启
debug
配置和命令行的export EGO_DEBUG=true
, 我们可以在测试环境里看到所有组件的请求里的行号、配置名、请求地址、耗时、请求数据、响应数据
并且使用Goland
同学,可以直接通过行号点击到对应的代码路径(gRPC、HTTP客户端支持行号)
-
链路 使用opentrace协议,自动将链路加入到日志里
-
gRPC链路
- 测试代码 gRPC直连查看链路id
- 服务端链路信息
- 客户端链路信息
-
HTTP链路
-
-
统一的监控信息
import (
"github.com/gin-gonic/gin"
"github.com/gotomicro/ego"
"github.com/gotomicro/ego/core/elog"
"github.com/gotomicro/ego/server"
"github.com/gotomicro/ego/server/egin"
)
// export EGO_DEBUG=true && go run main.go --config=config.toml
func main() {
if err := ego.New().Serve(func() *egin.Component {
server := egin.Load("server.http").Build()
server.GET("/hello", func(ctx *gin.Context) {
ctx.JSON(200, "Hello EGO")
return
})
return server
}()).Run(); err != nil {
elog.Panic("startup", elog.FieldErr(err))
}
}
export EGO_DEBUG=true # 默认日志输出到logs目录,开启dev后日志输出到终端
go run main.go --config=config.toml
这个时候我们可以发送一个指令,得到如下结果
➜ helloworld git:(master) ✗ curl http://127.0.0.1:9001/hello
"Hello Ego"%
使用scripts文件夹里的包编译,可以看到优雅的version提示
加入我们,请在验证信息里添加ego
关键字
Thanks for these wonderful people:
askuy |
Wei Zheng |
shaoyuan |
Panda |
刘文哲 |
zhangjunjun |
devincd |
Ming Deng |
Angelia |
Wbofeng |
clannadxr |
Link Duan |
Costa |