业务中台开发指南

一、准备环境

1、直接下载

  • 直接下载 跳过下面环境安装,将下载的文件放到项目bin目录下面即可

注:golang 版本大于1.19

2、配置环境

  • 需要能访问GitHub
  • 安装phanes
go install github.com/phanes-o/phanes@latest
  • 安装依赖
Git — 最新版本(必需)
Golang — 大于1.19(必需)
protoc — 最新版本(非必需)
protoc-gen-go — 最新版本(非必需)
protoc-gen-go-grpc — 最新版本(非必需)
protoc-gen-micro — 最新版本(非必需)

二、快速开始

1、工作目录

|-- middle		      // workspace 工作目录
|	|-- proto	     // protobuf 协议指定都在这里,定义好了其他项目可以直接引用
|	|-- middle-sdk	     // 业务中台sdk,开发人员需要维护相应的版本;提供业务后台使用
|   |-- go-common	     // 通用包,工具包
|   |-- xxjob		     // 分布式任务
|	|-- xxx-service	     // 只需要扩展和新增服务就可以了
|	|-- go.work	     // go work use xxx-service

cfa8f33ca0226fd2b6a4294fe8d03fdf.image.webp

2、项目源码结构

|-- Dockerfile
|-- License
|-- README.md
|-- assistant
|   `-- init.go
|-- bll			        // service 层,所有业务写在这里,可以自由建文件夹
|   |-- event_handle.go
|   `-- init.go
|-- client		        // 业务客户端、kafka、rabbitmq客户端、rpc客户端、http客户端等业务
|   |-- broker
|   |   |-- init.go
|   |   |-- nats.go
|   |   `-- rabbit.go
|   |-- grpc
|   |   `-- init.go
|   |-- httpc
|   |   `-- init.go
|   |-- init.go
|   `-- websocket
|       `-- init.go
|-- config												                   // 配置
|   |-- conf.go
|   |-- init.go
|   `-- traefik.go
|-- errors												                   // 错误处理
|   |-- error.go
|   `-- error_type.go
|-- event													           // 事件引擎,内部模块之间通信使用,支持同步和异步
|   |-- data.go
|   |-- event.go
|   `-- init.go
|-- lib														           // 依赖的第三方包或者第三方sdk都可以放这里
|   |-- example_server
|   |   `-- init.go
|   |-- trace
|   |   `-- trace.go
|   |-- traefik	                   // 网关自动注册
|   |   |-- etcd.go
|   |   |-- traefik.go
|   |   `-- traefik_test.go
|   `-- translation
|       `-- validator_translation.go
|-- main.go												                  // 主函数
|-- makefile
|-- model                         // model层、model、entity、mapping
|   |-- mapping
|   |   `-- mapping.go
|   `-- model.go
|-- script												                 // 配置文件,支持json、toml、yaml
|   |-- config.json
|   |-- config.toml
|   |-- config.yaml
|   |-- down.sql
|   |-- index.sql
|   `-- up.sql
|-- server			// view 层,对外提供服务,rpc能力、http能力
|   |-- grpc	                // 对外提供rpc能力
|   |-- web			// 对外提供http能力
|-- store			// 存储层、dao层,支持mysql、pg数据以及redis相关持久化
|   |-- mysql
|   |-- postgres
|   |-- redis
`-- utils			// 通用包工具包
    |-- http.go
    `-- utils.go

重点关注:

  • server:view 层,提供http、grpc能力
  • bll:service 层,提供所有业务能力,可自由进行业务分层以及复杂业务逻辑处理
  • store:dao 层,存储层,关系型数据库、非关系型数据库数据存储
  • model: model,entity 数据库结构、model请求或者自定义结构、mapping结构体转换映射
  • client:第三方client全写在这里,rpc客户端、http客户端、kafka和rabbitmq等中间件客户端
  • lib: 依赖的第三方包或者第三方sdk都可以放这里

3、快速开始

  • 新建项目:phanes new project_name
  • 加入到工作空间:go work use project_name
  • 定义自动生成的结构:generator.go (这里名称可以随便改,执行和存放目录在gowork同一个目录下)
  • 自动生成增删改查业务代码:phanes gen -c generator.go (注意目录位置在项目外层执行命令)
  • go mod tidy
  • 运行代码 go run main.go 即可提供http服务
--registry_address="192.168.246.128:5379" --config=./script/config.json

注:如果需要提供grpc能力,需要用户定义proto,然后前往server目录下grpc 下新增相关接口和业务,然后调用bll层业务代码即可。具体可以参考pay-service
自动生成增删改查

  • 新建 gen.go 文件

如下:

//generate:bll;model;entity;api.http;store.mysql
//project:order-service
type Order struct {
    Id            int64                            `rule:"Parameter"`
    OrderNo       string                           `rule:"Parameter"`
    AppId         int                              `rule:"Parameter"`
    UserId        int64                            `rule:"Parameter"`
    GoodsList     po.Array[*orderProto.OrderGoods] `rule:"Parameter"`
    TotalAmount   float64                          `rule:"Parameter"`
    RealAmount    float64                          `rule:"Parameter"`
    PayStatus     int                              `rule:"Parameter"`
    OrderStatus   int                              `rule:"Parameter"`
    DeliverStatus int                              `rule:"Parameter"`
    Source        string                           `rule:"Parameter"`
    ItemInfo      string                           `rule:"Parameter"`
    ClientIp      string                           `rule:"Parameter"`
    ParentId      int64                            `rule:"Parameter"`
    PayAt         int64                            `rule:"Parameter"`
    NotifyAt      int64                            `rule:"Parameter"`
    CreatedAt     int64
    UpdatedAt     int64 `rule:"Parameter"`
}
  • 执行:phanes gen -c gen.go

4、参数校验

a. http 参数校验

参考 validator

参考博客

b. grpc 参数校验

参考go-proto-validator

5、go-common 业务中台通用包

a. 业务开发中需要用的通用组件和工具都可以写在这个包里
b. go-common业务介绍

|-- README.md
|-- asynq						// go 分布式任务队列
|-- ffjson							
|-- goroutine_pool					// 协程池
|   |-- global_pool.go
|   |-- pool.go
|   `-- pool_test.go
|-- kafka						// kafka
|   |-- client.go
|   |-- config.go
|   |-- kafka_test.go
|   `-- receiver.go
|-- sentinel						// sentinel 限流熔断降级器
|	|-- sentinel.go					
|-- snowflake						// 雪花id生成器
|   |-- go.mod
|   |-- go.sum
|   |-- snowflake.go
|   `-- snowflake_test.go
|-- xxjob-executor					// 分布式任务执行器
|-- utiltools						// 工具包
|   |-- encryptoutil.go
|   |-- ip.go
|   |-- jsonutil.go
|   |-- pprof.go
|   |-- snowflake.go
|   `-- timeutil.go
`-- work_queue						// 工作队列
    |-- work_queue.go
    `-- workqueue_test.go

6、middle-sdk 维护

|-- README.md
|-- example
|   `-- client.go
|-- go.mod
|-- go.sum
|-- proto						// proto 文件,需要业务中台开发同步到这里
|   |-- deliver						// 发货
|   |   |-- deliver.pb.go
|   |   |-- deliver.pb.micro.go
|   |   `-- deliver.proto
|   |-- gen.sh
|   |-- item					        // 商品
|   |   |-- item.pb.go
|   |   |-- item.pb.micro.go
|   |   `-- item.proto
|   |-- makefile
|   |-- order					       // 订单
|   |   |-- order.pb.go
|   |   |-- order.pb.micro.go
|   |   `-- order.proto
|   |-- pay					       // 支付
|   |   |-- pay.pb.go
|   |   |-- pay.pb.micro.go
|   |   `-- pay.proto
|   `-- promotion				       // 促销
|       |-- promotion.pb.go
|       |-- promotion.pb.micro.go
|       `-- promotion.proto
`-- sdk						       // 业务后台接入使用sdk
    |-- constant.go
    |-- deliver_client.go
    |-- env.go
    |-- item_client.go
    |-- sdk.go					      // 参考sdk这个文件				
    |-- module_interface.go					
    |-- order_client.go
    |-- pay_client.go
    `-- promotion_client.go

注:业务中台开发,需要同步proto协议到sdk,并且注册相应的服务到sdk中

7、业务后台接入

  • 安装环境
# 配置使用私有仓库
go env -w GOPRIVATE=cp.wjaiot.net
go env -w GONOPROXY=cp.wjaiot.net
# 配置https请求拉取,存储相应代码
git config --global credential.helper store
git config --system http.sslverify false
  • 引入middle-sdk包,注意需要关闭代理,私有仓库在局域网无法在外网拉取
  • 样例:
// 初始化的时候设置环境
err := sdk.RprMgr.SetEnv(sdk.Dev).InitSdk() // 或者设置etcd地址 sdk.RprMgr.SetEtcd("127.0.0.1:5379").InitSdk()
if err != nil {
    return
}

// 在使用的地方像如下调用即可
rpcClient := sdk.RprMgr.GetRcpClient(sdk.EnPayService).(pay.PayService)
rsp, err := rpcClient.RegisterCallback(context.Background(), &pay.RegisterCallbackRequest{
    ServiceName: "test",
    Url:         "test_url",
    ApiKey:      "test",
    UrlType:     2,
})

fmt.Println("rsp:", rsp, " err:", err)

8、开发规范

  • 代码分支管理:git flow
  • 分支:feature、hotfix、dev、test、prod
  • 发布流程,dev -> test -> prod
  • 增加jenkins 打包编译镜像提交镜像,无需自动部署

注意:正式服发版全走tag
参考图1:release相当于test分支

6bc0cff35062071381d14dd3e20caa51.image.webp

参考图2:
a62ad6074c53d861351d07ab6455554b.image.webp

9、开发要求

  • 数据库设计评审
  • 技术方案评审
  • 接口文档
  • 代码评审