编写本规范的目的在于,让开发者更方便快捷地搭建项目框架,同时让团队内部的技术栈达到统一。
指导思想
框架搭建需要适应项目的变化,为项目选择最合适的架构,没有什么是一成不变的。技术架构应该是不断完善的,在满足当前需求的前提下做最大程度的设计,但不要过度设计。
项目重要程度
按照项目的重要程度,选择不同的技术栈。
核心项目
核心项目需要采用最稳妥的技术栈,搭建最完善的代码开发框架。
Golang版本
新开项目推荐golang-1.19以及上(2023.05.09推荐)
分层架构:DDD
使用DDD的思想对代码进行服务治理。
服务框架:Kratos
服务初始选择单体架构,服务框架选择Kratos,保留后期扩展为微服务的可能性。
流量控制:限流器
在创建时应该设定全局流程控制。
接口定义:Protocol Buffer
对外接口统一使用RestFul风格的HTTP协议,内部服务远程调用采用GRPC协议。通过编写Protocol Buffer文件定义接口文档,自动生成golang代码和swagger文件,将swagger文件导入apifox或者postman生成接口文档。
依赖注入:Wire
使用wire实现依赖注入。
数据库
操作数据库时,涉及多个增删改查操作,需要使用数据库事务。
关系型数据库:MySQL+Ent
当业务逻辑复杂,业务之间的关系联系较为紧密时,数据库用关系型数据库,关系型数据库首选MySQL。使用Ent作为ORM框架与MySQL数据库进行数据交互。
非关系型数据库:MongoDB
当业务的主要对象是文档对象时,业务之间的联系比较简单时,数据库用非关系型数据库,非关系型数据库首选MongoDB。
缓存:Redis
缓存数据库首选Redis。
搜索引擎:Elasticsearch
搜索引擎使用ElasticSearch,使用自动定时同步和手动同步结合的方式更新ES中的数据。
代码检查:GIt-Hooks+golangci-lint
在git commit之前,通过git hooks触发代码检查。代码检查使用golangci-lint工具。
gitignore
需要定义好gitignore,将程序能够自动生成的以及本地调试文件加入ignore列表。
makefile
使用makefile构建项目。
项目部署
项目必须包含用于构建镜像的Dockerfile。如果使用docker部署,应该有docker-compose文件。如果使用K8s部署,则需要包含ConfigMap、Deployment、Secret、Service等yaml文件。
重要项目
重要项目的搭建原则与核心项目几乎一致。
一般项目
可以使用Gin框架快速开发,略过DDD,略过代码自动检查,可以省去限流器,数据库与ORM的选择可以更加自由。
实验性项目
可以自由选择开发框架,有更多的创新性和自由度。