Go

(一)初识 Kratos 框架:Go 微服务开发的利器

Royal
2025-02-01 / 0 评论 / 19 阅读 / 正在检测是否收录...

  一. Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具。

名字来源于:《战神》游戏以希腊神话为背景,讲述奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险经历。

   二. kratos遵循以下基本原则:

  • 简单:不过度设计,代码平实简单;
  • 通用:通用业务开发所需要的基础库的功能;
  • 高效:提高业务迭代的效率;
  • 稳定:基础库可测试性高,覆盖率高,有线上实践安全可靠;
  • 健壮:通过良好的基础库设计,减少错用;
  • 高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe ;
  • 扩展性:良好的接口设计,来扩展实现,或者通过新增基础库目录来扩展功能;
  • 容错性:为失败设计,大量引入对 SRE 的理解,鲁棒性高;
  • 工具链:包含大量工具链,比如 cache 代码生成,lint 工具等等;

     三. kratos具有以下特性:

  • 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 :实现统一注册中心接口,可插件化对接各种注册中心;
  • Validation: 通过Protobuf统一定义校验规则,并同时适用于HTTP/gRPC服务.
  • SwaggerAPI: 通过集成第三方Swagger插件 能够自动生成Swagger API json并启动一个内置的Swagger UI服务.
    m71bt20h.png

     四. kratos目录结构

      .
    ├── 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

      五. Kratos 项目初始化
     环境准备: 
     - go 
     - protoc
     - protoc-gen-go
    首先要确保已经安装以上三个工具,而且go版本建议≥go1.23.6最新版本,不然后面安装依赖时会提示unknown directive: toolchain
     建议开启GO111MODULE

    go env -w GO111MODULE=on

    m70n5lpk.png
     六.创建项目

    # 使用默认模板创建项目
    kratos new helloworld
    
    # 如在国内环境拉取失败, 可 -r 指定源
    kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git
    
    # 进入项目目录
    cd helloworld
    
    # 拉取项目依赖
    go mod download

     七. 代码生成与运行

    # 安装依赖
    go get github.com/google/wire/cmd/wire@latest
    # 生成所有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 端口
    

    m71bjbtp.png
     八.测试HTTP接口
    相关逻辑代码位于 internal/service/greeter.go
    m71bl2fj.png
    m71blk6e.png

0

评论

博主关闭了当前页面的评论