当前位置:网站首页>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": {
}
}
边栏推荐
- Kratos战神微服务框架(二)
- LeetCode:162. Looking for peak
- 一改测试步骤代码就全写 为什么不试试用 Yaml实现数据驱动?
- Intel distiller Toolkit - Quantitative implementation 3
- MySQL uninstallation and installation methods
- opencv+dlib实现给蒙娜丽莎“配”眼镜
- LeetCode:34. Find the first and last positions of elements in a sorted array
- SimCLR:NLP中的对比学习
- How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
- [OC-Foundation框架]---【集合数组】
猜你喜欢
Advanced Computer Network Review(4)——Congestion Control of MPTCP
Chapter 1 :Application of Artificial intelligence in Drug Design:Opportunity and Challenges
I-BERT
How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
Digital people anchor 618 sign language with goods, convenient for 27.8 million people with hearing impairment
LeetCode:498. 对角线遍历
[oc]- < getting started with UI> -- common controls - prompt dialog box and wait for the prompt (circle)
postman之参数化详解
Nacos 的安装与服务的注册
【shell脚本】——归档文件脚本
随机推荐
Basic usage of xargs command
Redis之cluster集群
postman之参数化详解
LeetCode:394. String decoding
LeetCode41——First Missing Positive——hashing in place & swap
IJCAI2022论文合集(持续更新中)
Using label template to solve the problem of malicious input by users
Advanced Computer Network Review(4)——Congestion Control of MPTCP
SimCLR:NLP中的对比学习
[text generation] recommended in the collection of papers - Stanford researchers introduce time control methods to make long text generation more smooth
AcWing 2456. Notepad
Problems encountered in connecting the database of the project and their solutions
Post training quantification of bminf
BMINF的後訓練量化實現
Pytest之收集用例规则与运行指定用例
Leetcode刷题题解2.1.1
I-BERT
多元聚类分析
Pytest参数化你不知道的一些使用技巧 /你不知道的pytest
CUDA实现focal_loss