kratos源码走读记录
go-kratos 是 B 站开源的微服务框架,是 golang 体系下几大微服务框架之一,有阅读源码的必要。
api
?? metadata server
cmd
命令行工具,三个部分:
- 创建 proto、api 等的基础工具
- 基于 protoc 的 http server 代码生成 ( grpc 框架的 http 方案,可以对比一下其他方案 )
- 基于 protoc 的 errors 代码生成 ( 这个很有特色,详见 errors 包 )
config
配置管理
几个特点:
- 全部基于接口设计
- option 模式,可以修改 source、decoder、resolver 的具体实现
- 支持多个 source 及合并
- resolver 支持模板处理
- watch 机制,支持向上的变更监听
- observe 机制,支持向下的变更通知
一个想法: 基于接口的开发,很流畅
- 对比一下和 viper 、go-zero、goframe、go-kit 的配置方案
contrib
三方项目的支持
config: apollo、consul、etcd、configmap、nacos、polaris
原来使用 volume 挂载的方式使用 configmap,需要 deployment 去申明这些东西,比较麻烦,实际上,直接在 k8s 中用 sdk 读 configmap 确实挺方便。
encoding: msgpack #序列化
metrics: datadog、promethues (看看 metrics 还有其他什么方案吗)
opensergo: 一个ali、字节、bilibili 一起搞的服务治理框架,参考文档
registry: consul、 discovery、etcd、eureka、k8s、nacos、polaris、zk
encoding
用于序列化和反序列化。
提供了 json、xml、yaml、proto、form 的方式。
json 和 proto 都用的 pb 的 marshal 和 unmarshal。
xml 用的标准库。
yaml 用的 gopkg.in/yaml.v3
form 用的 gggo-playground/form/v4
,并且为 proto.Message 做了专门的适配。
errors
errors 的设计挺有意思,可以再参考下。
使用 proto 文件管理,自动生成代码。
有很多 error 体系都是自己的 封装,可以参考下 goframe 的 errors 、gopkg/errors 的设计。
internal
一些内部工具。
group 包下的 example_test.go 的使用比较有意思,可以参考 这种 test 的方式。
log
log 的接口有两层,一层是 log(level, kv...)
,另一层是 helper
,日常使用 helper。
contrib 中实现了对 ali、fluent、zap、logrus 的对接。主要还是做输出的管理。
metadata
简单的 metadata 封装,其实就是一个 map[string]string
metrics
简单的 metrics 接口定义。 具体实现在 contrib 包中。
middleware
一些常用的 server 中间件。
registry
简单的注册中心接口定义,具体的实现在 contrib 中。
?? 不知道现在是 全量同步,还是增量同步。
selector
一些 balancer 的方法,例如 随机、轮询。
third_party
一些三方的 proto 定义。
transport
http 框架封装 和 grpc 框架封装。 预期 ws 框架封装也可以进来。
http 路由使用的 mux 。
整体感受
kratos 的代码非常清晰简洁,没有太多复杂的设计。
代码风格一致性很好,外层定义接口,内层多个实现。常用 option 模式。
之后要再实际用 kratos 写几个小 demo 。
要看看 kratos 的返回值定义,以及 api 文档方面的解决方案。
- 使用 go-kratos 写几个小 demo
Life’s most persistent and urgent question is, ‘What are you doing for others?’
— Martin Luther King Jr.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!