kratos

357 阅读2分钟

Kratos是古希腊神话中的战神 kratos框架由bilibili团队开源

安装依赖

  • go
  • protoc:protocol Compiler
  • peotoc-gen-go,Protoc的插件,用于生成Go代码
  • kratos,kratos框架配套的脚手架工具

安装kratos工具

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

测试安装是否成功

kratos -v

image.png

验证码生成服务

初始化Kratos项目

到后端文件夹中执行命令

kratos new verifCodeSystem

image.png image.png 生成了项目文件,该布局提供了最基本的目录结构和一个用于测试的HTTP和gRPC接口

进入项目目录,拉取依赖

go mod tidy

生成相应源码(为了能够使用wire的依赖注入相关代码)

go get github.com/google/wire/cmd/wire
go generate ./../

image.png 运行项目,使用kratos工具

kratos run

image.png 启动了http的8000服务和grpc的9000服务 image.png 测试接口成功

使用Protobuf定义验证码生成接口

步骤:

  1. 定义protobuf文件说明接口
  2. 利用protoc基于protobuf生成必要代码
  3. 将生成的代码整合到项目中
  4. 完善业务逻辑

增加proto文件模板

在项目对应目录下执行

kratos proto add api/verifyCodeSystem/verifyCodeSystem.proto

image.png 这个文件可以任意放置,不过这个布局方式比较经典

image.png 只保留Get方法,其他的全部删掉

编写proto文件

syntax = "proto3";

package api.verifyCodeSystem;

// 生成的go代码所在的包
option go_package = "verifyCodeSystem/api/verifyCodeSystem;verifyCodeSystem";
option java_multiple_files = true;
option java_package = "api.verifyCodeSystem";

// 定义VerifyCodeSystem服务
service VerifyCodeSystem {
 rpc GetVerifyCodeSystem (GetVerifyCodeSystemRequest) returns (GetVerifyCodeSystemReply);
}

enum TYPE {
 DEFAULT = 0;
 DIGIT = 1;
 LETTER = 2;
 MIXED = 3;
}
// 接口请求参数结构
message GetVerifyCodeSystemRequest {
 // 验证码长度
 int32  length = 1;
 // 验证码类型
 TYPE type = 2;
}
// 接口返回值结构
message GetVerifyCodeSystemReply {
 string code = 1;
}

基于api/verifyCodeSystem/verifyCodeSystem.proto文件生成pb代码和grpc代码

生成client相关代码

kratos proto client api/verifyCodeSystem/verifyCodeSystem.proto

image.png image.png

注意:http代码只会在proto文件中声明了http时才会生成。 api/verifyCodeSystem/verifyCodeSystem_http.pb.gp

生成的文件不可修改,如果要改变业务逻辑,则必须修改.proto文件后重新生成go文件

基于api/verifyCodeSystem/verifyCodeSystem.proto文件生成grpc服务代码

kratos proto server api/verifyCodeSystem/verifyCodeSystem.proto -t internal/service

-t选项指定生成文件所在位置 image.png image.png

将生成的服务注册到gRPC服务中

更新internal/service/service.go文件

将internal/service/verifyCodeSystem.go中的NewVerifyCodeSystemService方法注册到service.go文件中 image.png 告知wire依赖注入系统,如果需要VerifyCodeSystem的话,使用NewVerifyCodeSystem函数来构建

更新internal/service/grpc.go文件

加入注释的两个部分

// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server,
   greeter *service.GreeterService,
   // 增加需要使用的服务作为参数
   verifyCodeSystemService *service.VerifyCodeSystemService,
   logger log.Logger) *grpc.Server {
   var opts = []grpc.ServerOption{
      grpc.Middleware(
         recovery.Recovery(),
      ),
   }
   if c.Grpc.Network != "" {
      opts = append(opts, grpc.Network(c.Grpc.Network))
   }
   if c.Grpc.Addr != "" {
      opts = append(opts, grpc.Address(c.Grpc.Addr))
   }
   if c.Grpc.Timeout != nil {
      opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))
   }
   srv := grpc.NewServer(opts...)
   v1.RegisterGreeterServer(srv, greeter)
   // 完成服务的注册:verifyCodeSystem
   verifyCodeSystem.RegisterVerifyCodeSystemServer(srv, verifyCodeSystemService)
   return srv
}

生成依赖注入代码

go generate ./...

根据刚刚提供的ProviderSet来生成依赖注入的代码,保证项目正常运行。 image.png 每当service.go中的ProviderSet内的参数发生改动时,都需要重新生成一次代码

运行项目

kratos run