基于go-zero框架由0-1项目微服务应用开发实践

本实践方案是一年前我整理的,当时是Go项目的技术选型方案,经过一年多的沉淀,我们团队基于这套方案成功上线了多个项目,而且基于这套方案团队开发效率大幅提升。
当然正如预计的我们现在的很多项目,上线后也在向微服务架构慢慢拆分一些功能模块
本实践方案算是已经得到了充足的验证,现在分享给大家,喜欢拿走

技术选型

项目由0-1,前期上线时最好是做成单体架构应用,然后上线后,根据业务调整与拆分系统架构,向微服务架构逐步转型演化,当然我的理解这才是一个正常项目的架构演化之路,架构不可能一步到位。
最终决定使用go-zero开发一个单体应用, 选择它的主要原因有两个:

  1. goctl工具
  2. 考虑业务可能快速上升的情况下, 微服务拆分扩展方便

goctl工具是主要原因, 听说它可以大大提高开发效率, 这个也在后面的实践中得到了验证, 向go-zero团队致敬,送出大写的牛.

目前达到的效果

  1. 根据sql文件生成model文件,不做任何更改; sql调整重新生成
  2. 编写API配置,生成handler/logic/router, handler/router里的不做任何更改,支持重新生成; 只编写logic业务逻辑部署的代码和调整svc/servicecontext.go注入model

如何做

步骤如下

  1. goctl模板修改
  2. 全局异常处理
  3. 解决跨域问题
  4. 基于数据模型做模块划分
  5. 前后端接口文件隔离
  6. swagger接口文档生成

goctl的模板修改

模板使用: https://github.com/vmee/goctl-template

模板修改主要有两处:

一是, api的handler.tpl模板, 这个主要是为了统一接口返回数据格式, 具体请参考

  1. 错误处理
  2. 模板修改

二是, model下的模板, 因为官方默认的模板太简单了, 想少写些sql操作相关的代码;

全局错误处理

首先 pkg包的代码我是从这里直接拷贝过来的https://github.com/zhoushuguang/lebron/blob/main/pkg
下面几个我用到的

  • errx: 错误定义
  • tool: md5
  • result: 全局错误处理和统一返回数据格式

如何实现参考了以下:

解决跨域问题

我用的方法, app.go

server := rest.MustNewServer(c.RestConf,
		rest.WithCors(), // 加上它就可以跨域了
		rest.WithUnauthorizedCallback(middleware.NewUnauthorizedMiddleware().Handler()),
)
defer server.Stop()

其他方案

注意:

  1. 为了接口数据返回统一, 我更改了goctl的handler模板; 参考错误处理模板修改
  2. 为了后续让model支持更多更复杂查询场景, 我更改goctl的model模板; 参考

在实际开发中,只会编写以下业务逻辑代码,其他代码全部自动生成

  1. 编写api配置
  2. yaml配置文件和config.go
  3. middware中间件
  4. 通用中间件

基于数据模型分类做模块划分

-- 数据库表前缀说明
-- cms_*:内容管理模块相关表
-- oms_*:订单管理模块相关表
-- pms_*:商品模块相关表
-- sms_*:营销模块相关表
-- ums_*:会员模块相关表
-- sys_*:系统模块相关表

目录结构如下

  • api
    • cms
    • sys
    • ums

生成的handler和logic也都是这个目录结构

前后端接口文件隔离

api文件如结构如下

  • api
    • cms
    • sys
    • ums
      • user
        • user.api
        • back.api
        • front.api

说明

  1. user.api 是定义通用的type块
  2. back.api 是定义后台的api
  3. front.api 是定义h5/app的api

swagger文档生成

生成swagger.json

goctl api plugin -plugin goctl-swagger=“swagger -filename app.json -host localhost:8888/ -basepath /” -api app/api/app.api -dir ./doc/swagger

用docker启动swagger-ui

docker run --rm -p 8083:8080 -e SWAGGER_JSON=/foo/doc/swagger/app.json -v $PWD:/foo swaggerapi/swagger-ui

访问http://localhost:8083就可以查看swagger文档和调试了

另外还有

  1. 开发环境部署 热加载
  2. vscode debug

参考开源

相关资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值