ego-go简单的 Go 微服务框架

联合创作 · 2023-09-28 04:57

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  

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 serveregin是组件名称,server.http是配置名称
egin.Load("server.http").Build()
  • 友好的debug 通过开启debug配置和命令行的export EGO_DEBUG=true, 我们可以在测试环境里看到所有组件的请求里的行号、配置名、请求地址、耗时、请求数据、响应数据

   

并且使用Goland同学,可以直接通过行号点击到对应的代码路径(gRPC、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 更新日志

Releases

Contributors

Thanks for these wonderful people:


askuy

Wei Zheng

shaoyuan

Panda

刘文哲

zhangjunjun

devincd

Ming Deng

Angelia

Wbofeng

clannadxr

Link Duan

Costa

MEX7

LincolnZhou
浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报