当前位置:网站首页>Kratos战神微服务框架(一)
Kratos战神微服务框架(一)
2022-07-06 08:59:00 【~庞贝】
Kratos战神微服务框架
简介
Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。
名字来源于:《战神》游戏以希腊神话为背景,讲述奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险经历。
目标
我们致力于提供完整的微服务研发体验,整合相关框架及工具后,微服务治理相关部分可对整体业务开发周期无感,从而更加聚焦于业务交付。对每位开发者而言,整套 Kratos 框架也是不错的学习仓库,可以了解和参考到微服务方面的技术积累和经验。
原则
- 简单:不过度设计,代码平实简单;
- 通用:通用业务开发所需要的基础库的功能;
- 高效:提高业务迭代的效率;
- 稳定:基础库可测试性高,覆盖率高,有线上实践安全可靠;
- 健壮:通过良好的基础库设计,减少错用;
- 高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe ;
- 扩展性:良好的接口设计,来扩展实现,或者通过新增基础库目录来扩展功能;
- 容错性:为失败设计,大量引入对 SRE 的理解,鲁棒性高;
- 工具链:包含大量工具链,比如 cache 代码生成,lint 工具等等;
特性
- 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:实现统一注册中心接口,可插件化对接各种注册中心;
架构
CLI工具
安装
go install github.com/go-kratos/kratos/cmd/kratos/[email protected]
创建项目
通过 kratos 命令创建项目模板:
kratos new helloworld
使用 --nomod
添加服务, 共用 go.mod
,大仓模式
kratos new helloworld
cd helloworld
kratos new app/user --nomod
项目结构
.
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── api // 下面维护了微服务使用的proto文件以及根据它们所生成的go文件
│ └── helloworld
│ └── v1
│ ├── error_reason.pb.go
│ ├── error_reason.proto
│ ├── error_reason.swagger.json
│ ├── greeter.pb.go
│ ├── greeter.proto
│ ├── greeter.swagger.json
│ ├── greeter_grpc.pb.go
│ └── greeter_http.pb.go
├── cmd // 整个项目启动的入口文件
│ └── server
│ ├── main.go
│ ├── wire.go // 我们使用wire来维护依赖注入
│ └── wire_gen.go
├── configs // 这里通常维护一些本地调试用的样例配置文件
│ └── config.yaml
├── generate.go
├── go.mod
├── go.sum
├── internal // 该服务所有不对外暴露的代码,通常的业务逻辑都在这下面,使用internal避免错误引用
│ ├── biz // 业务逻辑的组装层,类似 DDD 的 domain 层,data 类似 DDD 的 repo,而 repo 接口在这里定义,使用依赖倒置的原则。
│ │ ├── README.md
│ │ ├── biz.go
│ │ └── greeter.go
│ ├── conf // 内部使用的config的结构定义,使用proto格式生成
│ │ ├── conf.pb.go
│ │ └── conf.proto
│ ├── data // 业务数据访问,包含 cache、db 等封装,实现了 biz 的 repo 接口。我们可能会把 data 与 dao 混淆在一起,data 偏重业务的含义,它所要做的是将领域对象重新拿出来,我们去掉了 DDD 的 infra层。
│ │ ├── README.md
│ │ ├── data.go
│ │ └── greeter.go
│ ├── server // http和grpc实例的创建和配置
│ │ ├── grpc.go
│ │ ├── http.go
│ │ └── server.go
│ └── service // 实现了 api 定义的服务层,类似 DDD 的 application 层,处理 DTO 到 biz 领域实体的转换(DTO -> DO),同时协同各类 biz 交互,但是不应处理复杂逻辑
│ ├── README.md
│ ├── greeter.go
│ └── service.go
└── third_party // api 依赖的第三方proto
├── README.md
├── google
│ └── api
│ ├── annotations.proto
│ ├── http.proto
│ └── httpbody.proto
└── validate
├── README.md
└── validate.proto
代码生成与运行
生成
# 生成所有proto源码、wire等等
go generate ./...
运行
# 运行项目
kratos run
# 输出
INFO msg=config loaded: config.yaml format: yaml # 默认载入 configs/config.yaml 配置文件
INFO msg=[gRPC] server listening on: [::]:9000 # gRPC服务监听 9000 端口
INFO msg=[HTTP] server listening on: [::]:8000 # HTTP服务监听 8000 端口
测试接口
测试HTTP接口
相关逻辑代码位于 internal/service/greeter.go
curl 'http://127.0.0.1:8000/helloworld/kratos'
# 输出:
{
"message": "Hello kratos"
}
curl 'http://127.0.0.1:8000/helloworld/error'
# 输出
{
"code": 404,
"reason": "USER_NOT_FOUND",
"message": "user not found: error",
"metadata": {
}
}
边栏推荐
- Mongodb installation and basic operation
- CUDA实现focal_loss
- UML圖記憶技巧
- Simclr: comparative learning in NLP
- How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
- LeetCode:41. Missing first positive number
- I-BERT
- Advanced Computer Network Review(4)——Congestion Control of MPTCP
- Pytest parameterization some tips you don't know / pytest you don't know
- CSP salary calculation
猜你喜欢
项目连接数据库遇到的问题及解决
LeetCode41——First Missing Positive——hashing in place & swap
BMINF的後訓練量化實現
CUDA implementation of self defined convolution attention operator
How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
Post training quantification of bminf
Ijcai2022 collection of papers (continuously updated)
I-BERT
BN folding and its quantification
Advanced Computer Network Review(3)——BBR
随机推荐
[OC foundation framework] - string and date and time >
[MySQL] multi table query
[OC]-<UI入门>--常用控件-提示对话框 And 等待提示器(圈)
Redis之Geospatial
[Hacker News Weekly] data visualization artifact; Top 10 Web hacker technologies; Postman supports grpc
KDD 2022 paper collection (under continuous update)
postman之参数化详解
LeetCode:214. 最短回文串
ant-design的走马灯(Carousel)组件在TS(typescript)环境中调用prev以及next方法
Go redis initialization connection
Selenium+Pytest自动化测试框架实战(下)
Connexion d'initialisation pour go redis
In depth analysis and encapsulation call of requests
Export IEEE document format using latex
不同的数据驱动代码执行相同的测试场景
Mise en œuvre de la quantification post - formation du bminf
如何正确截取字符串(例:应用报错信息截取入库操作)
LeetCode:387. The first unique character in the string
LeetCode:34. Find the first and last positions of elements in a sorted array
LeetCode:836. 矩形重叠