ego-go簡單的 Go 微服務(wù)框架
EGO是一個集成里各種工程實踐的框架。通過組件化的設(shè)計模式,保證了業(yè)務(wù)方能夠統(tǒng)一的調(diào)用方式啟動各種組件
使用EGO的優(yōu)勢
- 配置化驅(qū)動組件
- 屏蔽底層組件啟動細節(jié)
- 微服務(wù)組件的可觀測、可治理
- 可插拔的Ego-Component組件
- Fail Fast理念和錯誤友好提示
2.1 提升組件熟練度
我們工程師要想提升組件熟練度,首先要大量看開源組件文檔和代碼,然后堅持長時間使用,才能形成肌肉記憶,提升我們做業(yè)務(wù)的速度。而這一切所投入的時間和精力是非常大的。
要減少這個投入成本,讓更多開發(fā)者使用好優(yōu)秀的開源組件,EGO的做法是標(biāo)準(zhǔn)化所有開源組件,對其做一層封裝,統(tǒng)一各種行為。
- 統(tǒng)一組件文件名
- 統(tǒng)一組件配置參數(shù)
- 統(tǒng)一組件調(diào)用API
- 統(tǒng)一組件錯誤行為
- 統(tǒng)一組件監(jiān)控行為
讓人掌握了一種組件,就可以舉一反三使用其他組件。
2.2 提升故障排查效率
- 統(tǒng)一錯誤碼
- 組件錯誤、慢響應(yīng)、鏈路、常規(guī)請求攔截器埋點(服務(wù)端、客戶端均會攔截)
- 收斂錯誤字段
- 注入組件關(guān)鍵信息:代碼行號、配置名、目標(biāo)地址、耗時、請求數(shù)據(jù)、響應(yīng)數(shù)據(jù)
- 調(diào)試階段,錯誤高亮、格式化友好提示
- 調(diào)試階段,組件內(nèi)置debug攔截器
2.3 自動生成重復(fù)代碼
- 生成代碼,配置、數(shù)據(jù)解析、模版分離
- 不依賴于語言,構(gòu)建項目代碼
- 利用Go1.16特性embed,啟動web,生成代碼
- 項目地址: https://github.com/gotomicro/egoctl
3 Ego的組件
我們支持多種EGO組件,加快你的開發(fā)速度
| 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 框架分層
我們框架分為三個層次
- 核心層提供配置、日志、監(jiān)控和鏈路,是其他組件的基石
- 組件層提供客戶端、服務(wù)端、任務(wù)端里的各種組件
- 膠水層控制了各種組件的生命周期,錯誤處理
4.2 架構(gòu)圖
4.3 生命周期
4.4 組件分層
我們認為一切均是組件,我們將組件分為四個部分:
- Container 處理組件類型、組件配置、組件啟動
- Config 配置參數(shù)
- Component 組件的調(diào)用方法
- 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 特性介紹
- 配置驅(qū)動 所有組件啟動方式為
組件名稱.Load("配置名稱").Build(),可以創(chuàng)建一個組件實例。如以下http server,egin是組件名稱,server.http是配置名稱
egin.Load("server.http").Build()
- 友好的debug 通過開啟
debug配置和命令行的export EGO_DEBUG=true, 我們可以在測試環(huán)境里看到所有組件的請求里的行號、配置名、請求地址、耗時、請求數(shù)據(jù)、響應(yīng)數(shù)據(jù)
并且使用Goland同學(xué),可以直接通過行號點擊到對應(yīng)的代碼路徑(gRPC、HTTP客戶端支持行號)
-
鏈路 使用opentrace協(xié)議,自動將鏈路加入到日志里
-
gRPC鏈路
- 測試代碼 gRPC直連查看鏈路id
- 服務(wù)端鏈路信息
- 客戶端鏈路信息
-
HTTP鏈路
-
-
統(tǒng)一的監(jiān)控信息
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 如下所示
這個時候我們可以發(fā)送一個指令,得到如下結(jié)果
? helloworld git:(master) ? curl http://127.0.0.1:9001/hello
"Hello Ego"%
8.4 更加友好的包編譯
使用scripts文件夾里的包編譯,可以看到優(yōu)雅的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 |
評論
圖片
表情
