从构思产品到打造 Go 微服务模板:我的实践之路

首页 编程分享 PHP丨JAVA丨OTHER 正文

猪猪拆迁队 转载 编程分享 2025-05-17 21:59:37

简介 时隔近一年,心态和各方面都有一些变化,年初给自己定了下目标,目前进度15%,真是可怜的15%,有点无法前进的感觉, 从去年下半年一直想着自己做个产品,从构思原型,画原型,画UI,投入了巨大精力。


前言

时隔近一年,心态和各方面都有一些变化,年初给自己定了下目标,目前进度15%,真是可怜的15%,有点无法前进的感觉,

从去年下半年一直想着自己做个产品,从构思原型,画原型,画UI,投入了巨大精力,目前处在一个停滞阶段,不是不去继续做,只不过受到了阻力。

软件开发进度不过10%,使用的是flutter,不过停滞的原因不是代码问题,而是用户体验和视觉交互总是不满意,所以停下来思考,不过在停滞期间,也没有停止前进,于是有了这个GoLang开发模版。

说起来为什么会有这个开发模版,一开始是想找着市面上自己的合适的框架使用,看来看去,Gin比较合适,比较像NodeJS中的express,但是基于Gin的开发模版很难找,不像做前端时,那种随处可见的脚手架,后面实在找不到合适的,就想着自己做,于是结合NodeJs相关的开发经验,于是就整了一个go-development-template

当然再此之前也整了一个flutter的开发模版,这里就不细说了,链接在这 flutter_develop_template

不过说起来,golang真的很好学啊,我就看了半个小时语法直接就用起来了,后续又陆续查了文档补充了基础知识,目前我在公司项目内已经使用golang写了很多基建了。

对于IDE来说,客观来说,还是Goland功能最全,试用到期后,我就用回了VScode,但是我最近使用的Zed来开发go也挺好,不得不说,Rust写的IDE性能也是真的强。

说起rust,性能真的顶,不过由于目前没有用到实践中,所以水平也就停留写写小工具,更深入就也没折腾了。

回归主题

因为我一开始不是作为Golang开发人员来做这个开发模版的,可能有些东西考虑不到,更多的思维是站在Node的角度去思考问题,结合Express, 和 NestJs等依赖注入和控制反转等设计思想去整合开发模版,所以如果有些地方考虑不到,请指出,谢谢。

🚀 Go 微服务框架模板(Gin + gRPC + Consul + Gorm + dig)

这是一个现代化、高可维护性的 Go 微服务架构模板,基于 Gin、gRPC、GORM、Consul,并通过 dig 实现依赖注入,提升模块解耦与测试友好性,支持 HTTP 与 gRPC 双协议访问。


🧱 项目结构概览

internal/
├── common/                # 公共工具与通用逻辑(如错误、日志)
│   └── logger/
│   └── jwt/
│   └── error/
├── config/                # 配置文件加载(支持多环境)
├── di/                    # 🚀依赖注入容器封装(基于 dig)
│   └── container.go
├── dto/                   # DTO 数据结构
│   └── config.go
│   └── logger.go
│   └── login.go
│   └── result.go
├── grpc/
│   ├── client/            # gRPC 客户端封装
│   ├── container/         # gRPC 客户端依赖注入
│   ├── handler/           # gRPC 逻辑实现
│   ├── proto/             # proto 文件与生成代码
│   ├── register.go        # gRPC 注册器
│   └── server.go          # gRPC 启动器
├── handler/               # Gin 控制器(HTTP handler)
├── middleware/            # 中间件(日志、认证等)
├── model/                 # 数据模型定义(GORM)
├── repo/                  # 持久层(封装数据库访问)
├── router/                # Gin 路由注册
├── service/               # 业务逻辑层
├── utils/                 # 工具方法
│   └── grpc_factory.go

💡 技术栈与特点

组件 说明
Gin 快速的 HTTP 路由框架
gRPC 高性能服务间通信协议,支持 proto 代码生成
Consul 服务注册与发现,gRPC 服务自动注册
GORM Golang ORM 框架,用于操作 MySQL 数据库
dig 🧩 Uber 出品的依赖注入容器,减少硬编码依赖
zap 高性能结构化日志框架

🚀 启动方式

1. 安装依赖:

go mod tidy

2. 启动服务:

go run main.go

🧬 核心架构说明

🔗 依赖注入(dig 容器)

容器初始化在:

internal/di/container.go

注入了以下依赖:

  • 日志(log.NewProvideLogger)
  • 配置加载(config.ProvideConfig)
  • 数据库连接(repo.ProvideDB)
  • 业务服务(如 service.ProvideUserService)
  • 控制器(handler.ProviderUserHandler)
  • gRPC 客户端(grpc/container.NewProvideClients)

使用方式:

container := di.NewContainer()

// 调用 handler 中的依赖
container.Invoke(func(h *handler.UserHandler) {
    // 使用 handler
})

☁️ 配置系统

  • 配置文件位于 /config/config.{env}.yaml
  • 支持多环境切换:通过 APP_ENV=dev、APP_ENV=prod 控制
  • 使用 viper 自动读取并注入依赖

🧰 数据访问层

  • 封装于 repo.Repo
  • 注入为 *gorm.DB 或自定义结构体
  • 自动迁移模型结构(如 User)

⚙️ gRPC 模块

  • grpc/client/: 客户端封装
  • grpc/handler/: 具体服务逻辑实现
  • grpc/proto/: proto 文件与自动生成代码
  • grpc/server.go: gRPC 启动入口

启动后将自动注册至 Consul,并支持 grpcurl 调用。

🧪 API 示例

REST 接口(HTTP)

GET 示例:

curl http://localhost:8888/user/test

返回:

{
  "greeting": "你好, 用户!"
}

gRPC 接口

使用 grpcurl 测试:

grpcurl -plaintext localhost:50051 app.HelloService.SayHello

⚙️ 环境变量支持

变量名	描述	示例值
APP_ENV	运行环境	dev / prod
SQL_URL	数据库连接字符串	user:pwd@tcp(…)

📌 后续规划(TODO)

•	⏳ 用户鉴权中间件(JWT)
•	⏳ Kafka 消息队列集成

📄 License

MIT License

最后

后续会不断完善该开发模版。

go-development-template

flutter_develop_template

转载链接:https://juejin.cn/post/7504456502507454514


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云