ego-go简单的 Go 微服务框架
EGO是一个集成里各种工程实践的框架。通过组件化的设计模式,保证了业务方能够统一的调用方式启动各种组件
使用EGO的优势
- 配置化驱动组件
 - 屏蔽底层组件启动细节
 - 微服务组件的可观测、可治理
 - 可插拔的Ego-Component组件
 - Fail Fast理念和错误友好提示
 
2.1 提升组件熟练度
我们工程师要想提升组件熟练度,首先要大量看开源组件文档和代码,然后坚持长时间使用,才能形成肌肉记忆,提升我们做业务的速度。而这一切所投入的时间和精力是非常大的。
要减少这个投入成本,让更多开发者使用好优秀的开源组件,EGO的做法是标准化所有开源组件,对其做一层封装,统一各种行为。
- 统一组件文件名
 - 统一组件配置参数
 - 统一组件调用API
 - 统一组件错误行为
 - 统一组件监控行为
 
让人掌握了一种组件,就可以举一反三使用其他组件。
2.2 提升故障排查效率
- 统一错误码
 - 组件错误、慢响应、链路、常规请求拦截器埋点(服务端、客户端均会拦截)
 - 收敛错误字段
 - 注入组件关键信息:代码行号、配置名、目标地址、耗时、请求数据、响应数据
 - 调试阶段,错误高亮、格式化友好提示
 - 调试阶段,组件内置debug拦截器
 
2.3 自动生成重复代码
- 生成代码,配置、数据解析、模版分离
 - 不依赖于语言,构建项目代码
 - 利用Go1.16特性embed,启动web,生成代码
 - 项目地址: https://github.com/gotomicro/egoctl
 
3 Ego的组件
我们支持多种EGO组件,加快你的开发速度
| Component Name | Code | Example | Doc | 
|---|---|---|---|
| HTTP Server | Code | Example | Doc | 
| gRPC Server | Code | Example | Doc | 
| Governance Service | Code | Example | Doc | 
| Job | Code | Example | Doc | 
| Corn job | Code | Example | Doc | 
| Distributed Scheduled Job | Code | Example | Doc | 
| HTTP Client | Code | Example | Doc | 
| gRPC Client | Code | Example | Doc | 
| gRPC Client using ETCD | Code | Example | Doc | 
| gRPC Client using k8s | Code | Example | Doc | 
| Sentinel | Code | Example | Doc | 
| MySQL | Code | Example | Doc | 
| Redis | Code | Example | Doc | 
| Redis Distributed lock | Code | Example | Doc | 
| Mongo | Code | Example | Doc | 
| Kafka | Code | Example | Doc | 
| ETCD | Code | Example | Doc | 
| K8S | Code | Example | Doc | 
| Oauth2 | Code | Example | 
- 更多组件请查看:https://github.com/ego-component
 
4 EGO的定义
4.1 框架分层
我们框架分为三个层次
- 核心层提供配置、日志、监控和链路,是其他组件的基石
 - 组件层提供客户端、服务端、任务端里的各种组件
 - 胶水层控制了各种组件的生命周期,错误处理
 
4.2 架构图
4.3 生命周期
4.4 组件分层
我们认为一切均是组件,我们将组件分为四个部分:
- Container 处理组件类型、组件配置、组件启动
 - Config 配置参数
 - Component 组件的调用方法
 - Options 配置和组件可选项
 
5 版本要求
- v0.8.2以下 需要 go大于go1.13
 - v0.8.3后 需要 go大于go1.16
 - v1.0.0后 需要 go大于go1.17
 
6 下载工具
bash <(curl -L https://raw.githubusercontent.com/gotomicro/egoctl/main/getlatest.sh) 
通过以上脚本,可以下载protoc工具全家桶,以及ego的protoc插件和egoctl
- /usr/local/bin/egoctl EGO工具
 - /usr/local/bin/protoc 生成Pb工具
 - /usr/local/bin/protoc-gen-go 生成Pb工具
 - /usr/local/bin/protoc-gen-go-grpc 生成gRPC工具
 - /usr/local/bin/protoc-gen-go-errors 生成错误码工具
 - /usr/local/bin/protoc-gen-openapiv2 生成HTTP工具
 - /usr/local/bin/protoc-gen-go-http 生成HTTP工具
 
7 特性介绍
- 配置驱动 所有组件启动方式为
组件名称.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链路
 
 -  
 -  
统一的监控信息
 
8 Quick Start
8.1 HelloWorld
配置
[server.http] port = 9001 host = "0.0.0.0"
代码
package main 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)) } }
8.2 使用命令行运行
export EGO_DEBUG=true # 默认日志输出到logs目录,开启dev后日志输出到终端
go run main.go --config=config.toml
 
8.3 如下所示
这个时候我们可以发送一个指令,得到如下结果
➜  helloworld git:(master) ✗ curl http://127.0.0.1:9001/hello
"Hello Ego"%  
 
8.4 更加友好的包编译
使用scripts文件夹里的包编译,可以看到优雅的version提示
9 更新日志
Contributors
Thanks for these wonderful people:
askuy  |  
   Wei Zheng  |  
   shaoyuan  |  
   Panda  |  
   刘文哲  |  
   zhangjunjun  |  
   devincd  |  
  
Ming Deng  |  
   Angelia  |  
   Wbofeng  |  
   clannadxr  |  
   Link Duan  |  
   Costa  |  
   MEX7  |  
  
LincolnZhou  |  
   
评论
