• Kratos战神微服务框架介绍


    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:实现统一注册中心接口,可插件化对接各种注册中心;

    架构

    kratos architecture

    CLI工具

    安装

    go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
    
    • 1

    创建项目

    通过 kratos 命令创建项目模板:

    kratos new helloworld
    
    • 1

    使用 --nomod 添加服务, 共用 go.mod ,大仓模式

    kratos new helloworld
    cd helloworld
    kratos new app/user --nomod
    
    • 1
    • 2
    • 3

    项目结构

    kratos ddd

      .
    ├── 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    代码生成与运行

    生成

    # 生成所有proto源码、wire等等
    go generate ./...
    
    • 1
    • 2

    运行

    # 运行项目
    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 端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试接口

    测试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": {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    java正则表达式匹配${key}形式字符串
    一个接口同时支持 form 表单、form-data、json 的优雅写法
    如何进行lidar和imu的外参标定
    力扣树的进一步应用
    用JavaScript撸一个静态链表
    肠道菌群代谢组学之粪便微生物移植治疗原发性硬化性胆管炎
    了解常用测试模型 -- V模型、W模型
    【PickerView案例13-应用程序对象介绍 Objective-C语言】
    如何挑选工业镜头?
    Linux用户增删改查,修改密码,查看当前用户ID,切换用户
  • 原文地址:https://blog.csdn.net/qq_53267860/article/details/125527158