kratos开源和工程化实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. ❭❭❭
Kratos开源与工程化最佳实践
By longxia
2. ❭❭❭
• Kratos开源最佳实践
• 配置实践
• Error实践
• Project Layout
• Protobuf管理
• 以前的Makefile & third_party
• 为何使用Buf
• Buf的定义和使用
• 事物管理
• 事物脚本
• 贫血模型
• 新的模式
• 底层实现
3. ❭❭❭ Kratos开源实践 - 配置规范的思考
开源实践
在 Kratos 项目中,配置源可以指定多个,并且 config 会进行合并成 key/value 。
然后用户通过 Scan 或者 Value 获取对应键值内容;
主要功能特性:
• 默认实现了本地文件数据源。
• 用户可以自定义数据源实现。
• 支持配置热更新,通过 Atomic 方式变更已有 Value。
• 支持自定义数据源解码实现。
配置填充:
• 增加对 flags、环境变量 占位符替换。
• 通过铺平的 key/value,进行二次赋值替换。
• 例如,a.b.c = {{ xx.xxx }}
proto管理
事物模式
4. ❭❭❭ Kratos开源实践 - 配置规范的思考
在 Kratos 项目中,我们默认通过 proto 进行定义配置文件。
主要的以下几点好处:
• 可以定义统一的模板配置
• 添加对应的配置校验
• 更好地管理配置
• 跨语言、跨平台支持
开源实践
proto管理
事物模式
5. ❭❭❭ Kratos开源实践 - Error Handling
错误传播
如果您的 API 服务依赖于其他服务,则不应盲目
地将这些服务的错误传播到您的客户端。在翻译
错误时,我们建议执行以下操作:
• 隐藏实现详细信息和敏感信息
• 调整负责该错误的一方
例如,从另一个服务接收 INVALID_ARGUMENT 错误
的服务器应该将 INTERNAL 传播给它自己的调用者。
开源实践
proto管理
事物模式
6. ❭❭❭ Kratos开源实践 - IDL&Project Layout
开源实践
proto管理
在统一仓库中管理 Proto ,以仓库目录作为统一包名:
目录结构和 package 对齐;
• /<业务域>.<业务>.<应用服务>.<版本>
• /account.passport.login.v1/<resource>
• bapis
• -account
// DCDN 转发到数据中心
https://github.com/googleapis/googleapis
• --passport // ELB 转发到 APIGW
• ---login
• ----v1 // 服务发现筛选instance的版本
// APIGW 转发到 Service
事物模式
7. ❭❭❭ Protobuf管理 - Makefile&third_party
开源实践
proto管理
• windows平台支持不友好,语法不统一
• protoc\protoc-gen-xxx二进制版本不统一
• proto文件依赖难以管理
事物模式
8. ❭❭❭ Protobuf管理 - Why Buf
1. 可配置的lint和break change检查 - 40 lint checkers and 54
breaking checkers
2. proto依赖管理 - 中心化的Buf Schema Registry提供了
protobuf的存储和版本记录,类似cargo、go mod
3. 编译速度 - 内置的protobuf编译器速度更快,大约是protoc的
4倍
4. Plugin中心化管理 - 统一了protoc-gen-xxx的版本
5. 跨平台 - 支持Linux、Mac、Windows
开源实践
proto管理
事物模式
9. ❭❭❭ Protobuf管理 - Buf目录文件结构
开源实践
proto管理
buf.yaml: 定义在存放proto api文件的根目录下,管理api的proto依赖、lint、breakchange等规则
buf.lock: buf build后根据buf.yam自动生成的文件,用来记录和锁定依赖的版本
buf.work.yaml: 构建工作目录下,定义了当前工作目录下需要编译的proto api文件目录
buf.gen.yaml: 构建工作目录下,定义了编译proto文件时的具体规则和插件信息
事物模式
10. ❭❭❭ Protobuf管理 - 工作空间&编译规则
开源实践
proto管理
https://github.com/go-kratos/examples/tree/main/blog
• 可以使用远程plugin来统一编译环境
• 自定义插件输入和输出参数
事物模式
11. ❭❭❭ Protobuf管理 - 完整CI流程
开源实践
buf lint
buf break
buf build
buf generate
proto管理
事物模式
12. ❭❭❭ 事务管理 - 事务脚本
开源实践
proto管理
事物管理
和事物相关的业务逻辑都放在了dao层
里面,有点类似于旧时代的存储过程
•
事物方法中不可避免的将上层业务逻辑携带到了dao层
• dao层抽象程度低,粒度太粗无法复用
• 无法跨业务域
13. ❭❭❭ 事务管理 - 贫血模型
开源实践
proto管理
Service层直接开启Tx对象,并将Tx对
象传递给Dao层操作,尤其有了ORM
框架后,这种方式推上了高峰。
• 业务层会涉及到复杂的事物控制逻辑(commit、rollback
等),容易出错
• 会导致dao层两个方法,带Tx和不带Tx的,代码比较冗余
事物管理
14. ❭❭❭ 事务管理 - 设计目标
开源实践
proto管理
目标:
1. 将业务逻辑与事务代码分开。 在编写业务用例时,开发者应该只需考虑业务逻辑,不需要同
时考虑怎样给业务逻辑加事务管理。如果以后需要添加事务支持,你可以在现有业务逻辑的
基础上进行简单封装,而无需更改任何其他代码。事务实现细节应该对业务逻辑透明。
2. 事务逻辑应该作用于用例层(业务逻辑),而不在持久层上。
3. 数据服务(数据持久性)层应对事务逻辑透明。 这意味着持久性代码应该是相同的,无论它
是否支持事务。
4. 你可以选择延迟支持事物。 你可以先编写没有事务的用例,稍后可以在不修改现有代码的情
况下给该用例加上事务。你只需添加新代码。
事物管理
15. ❭❭❭ 事务管理 - 新的模式
开源实践
proto管理
事物管理
• 业务逻辑用例层通过wire由data(持久化层)注入进
来Transation接口,用例层对事物的实现细节无感知
• 业务逻辑用例层通过Transation接口开启的事物 tx实
体通过ctx进行传递,需要在同个Scope作用域下面执
行,data层无需实现多个带Tx的版本
16. ❭❭❭ 事务管理 - data层实现
开源实践
https://github.com/go-kratos/examples/tree/main/transaction
gorm
ent
proto管理
事物管理
17. ❭❭❭ 感谢
感谢!
欢迎大家关注go-kratos