
业务中台开发指南
业务中台开发指南
一、准备环境
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
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 参数校验
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分支
参考图2:
9、开发要求
- 数据库设计评审
- 技术方案评审
- 接口文档
- 代码评审
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果