Go微服务框架Kratos(Bilibili开源)最佳实践。封装常用工具,以满足实际开发工作中的需求,提升开发效率。
彦祖,给个Star
- 官方的示例比较简单,实际开发工作中,需要更完善的功能。
- 官方的示例仅仅是针对某一个功能的示例,实际工作中,往往需要自己整合。
- backup-db: 定时任务示例,根据cron表达式定时执行。
- user-manage: 微服务示例,基本的CRUD,参数校验,分页查询,数据库变更自管理。
- kratos框架的基本使用,常用功能的封装
- 封装配置读取、校验
- 日志组件初始化
- 配置链路追踪,将 trace_id 写入响应头里,可用于返回 trace_id 给前端,方便定位日志
- http返回错误信息处理,隐藏500以上的错误,避免底层错误暴露给调用者
- 重新实现kratos的log.Fatal(),log.Fatal()内部调用os.Exit(),会造成defer函数无法执行,改为调用panic
- 响应枚举值配置,请求响应枚举值的数字
- 通过protoc-gen-validate实现参数校验
- 利用反射,高效处理响应值里的time类型字段,转换为Protocol Buffer的timestamp类型
- 基于Google API规范定义API接口
- 使用FieldMask,解决golang更新零值问题
- 使用FieldMask,解决接口响应字段超出客户端所需,造成带宽浪费,还可避免执行不必要的业务逻辑
- 使用golang-migrate ,在服务启动时维护数据库变更,自动执行初始化SQL,详细介绍
- 通过grom操作postgres数据库
- BaseRepo: 封装gorm的辅助工具类,提供了基础的CRUD方法,通过泛型实现。 命名参照mybatisplus的mapper
- 使用BeforeCreate钩子函数,自动生成id
- 封装分页查询操作
- 使用可选函数封装数据库连接初始化
- CacheRepo: 封装 cache 操作,使用 redis 作为缓存
- 参考 go-zero https://go-zero.dev/cn/docs/blog/cache/redis-cache
- 采用 Cache Aside 缓存模式
- 使用延迟双删来减小缓存不一致的窗口
- gitlab ci/cd 流水线脚本包含以下功能,
详细介绍见Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置
- 单元测试
- 代码检查
- 构建镜像
- 推送镜像到镜像私仓
- 部署应用到k8s
- logrus日志库
- cron定时任务
- protobuf定义配置文件
- 通过protoc-gen-validate实现配置文件校验
- wire依赖注入
- 常用脚本封装到Makefile
- k8s存活探针接口,日志过滤
- bytedance的协程池
- golangci-lint代码检查
- 打包镜像