/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
Kratos是一套轻量级Go微服务框架,包含大量微服务相关框架及工具,解决了gin在微服务场景下的一些适配和微服务本身的一系列生态!
Kratos是一款功能强大的轻量级GO微服务框架,为用户提供了海量的微服务相关框架和工具,为微服务的开发构建工作提供了帮助。软件能够轻松解决gin在微服务场景下的一些适配和微服务本身的一系列生态,满足用户的各种微服务框架功能需求。
依赖注入
Wire 是一个灵活的依赖注入工具,通过自动生成代码的方式在编译期完成依赖注入。
在各个组件之间的依赖关系中,通常鼓励显式初始化,而不是全局变量传递。
所以通过 Wire 进行初始化代码,可以很好地解决组件之间的耦合,以及提高代码维护性。
安装工具#
go get github.com/google/wire/cmd/wireCopy
工作原理#
Wire 具有两个基本概念:Provider 和 Injector。
Provider 是一个普通的 Go Func ,这个方法也可以接收其它 Provider 的返回值,从而形成了依赖注入;
使用方式#
在 Kratos 中,主要分为 server、service、biz、data 服务模块,会通过 Wire 进行模块顺序的初始化;
在每个模块中,只需要一个 ProviderSet 提供者集合,就可以在 wire 中进行依赖注入;
并且我们在每个组件提供入口即可,不需要其它依赖,例如:
然后通过 wire.go 中定义所有 ProviderSet 可以完成依赖注入配置。
初始化组件#
通过 wire 初始化组件,需要定义对应的 wire.go,以及 kratos application 用于启动管理。
在项目的 main 目录中,运行 go generate 进行生成编译期依赖注入代码:
go generate ./...
Errors
APIs 错误码可以统一通过 proto 定义业务原因,然后通过 protoc-gen-go-errors 生成判定代码。
在errors包中,错误信息通过 proto 定义,并且实现对应的 Error 接口,并且可以直接通过 middleware 转换成 gRPC 错误码。
安装工具#
go get github.com/go-kratos/kratos/cmd/protoc-gen-go-errors@latestCopy
错误定义#
api/helloworld/errors/helloworld.proto
错误生成#
通过 proto 生成对应的代码:
kratos proto client api/helloworld/errors/helloworld.protoCopy
生成的源码,可以直接通过 errors.IsMissingName(err) 进行对应的错误判定:
使用方式#
Config
使用方式#
配置源可以指定多个,并且 config 会进行合并成 map[string]interface{},然后通过 Scan 或者 Value 获取值内容;
Logging
接口实现#
为了方便业务自适配不同的 log 接入使用,Logger 只包含了最简单的 Print 接口。当业务需要在 Kratos 框架内部使用自定义的 logging middlerware 的时候,只需要简单实现 Print 方法即可
使用方式#
输出日志到stdout#
使用自带的 StdLogger 可以创建标准输出日志对象. 通过 NewHelper 构造日志模块,Helper 生成的日志模块可以提供不同等级的日志输出。
输出日志到fluentd#
引入 fluent sdk
在kratos中引入logging middleware#
在 http.ServerOption 中引入 logging.Server(), 则 Kratos 会在每次收到 HTTP 请求的时候打印详细请求信息
APIs:协议通信以 HTTP/gRPC 为基础,通过 Protobuf 进行定义;
Errors:通过 Protobuf 的 Enum 作为错误码定义,以及工具生成判定接口;
Metadata:在协议通信 HTTP/gRPC 中,通过 Middleware 规范化服务元信息传递;
Config:支持多数据源方式,进行配置合并铺平,通过 Atomic 方式支持动态配置;
Logger:标准日志接口,可方便集成三方 log 库,并可通过 fluentd 收集日志;
Metrics:统一指标接口,可以实现各种指标系统,默认集成 Prometheus;
Tracing:遵循 OpenTelemetry 规范定义,以实现微服务链路追踪;
Encoding:支持 Accept 和 Content-Type 进行自动选择内容编码;
Transport:通用的 HTTP/gRPC 传输层,实现统一的 Middleware 插件支持;
Registry:实现统一注册中心接口,可插件化对接各种注册中心;
简单:不过度设计,代码平实简单;
通用:通用业务开发所需要的基础库的功能;
高效:提高业务迭代的效率;
稳定:基础库可测试性高,覆盖率高,有线上实践安全可靠;
健壮:通过良好的基础库设计,减少错用;
高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe ;
扩展性:良好的接口设计,来扩展实现,或者通过新增基础库目录来扩展功能;
容错性:为失败设计,大量引入对 SRE 的理解,鲁棒性高;
工具链:包含大量工具链,比如 cache 代码生成,lint 工具等等;