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
验证码生成服务
初始化Kratos项目
到后端文件夹中执行命令
kratos new verifCodeSystem
生成了项目文件,该布局提供了最基本的目录结构和一个用于测试的HTTP和gRPC接口
进入项目目录,拉取依赖
go mod tidy
生成相应源码(为了能够使用wire的依赖注入相关代码)
go get github.com/google/wire/cmd/wire
go generate ./../
运行项目,使用kratos工具
kratos run
启动了http的8000服务和grpc的9000服务
测试接口成功
使用Protobuf定义验证码生成接口
步骤:
- 定义protobuf文件说明接口
- 利用protoc基于protobuf生成必要代码
- 将生成的代码整合到项目中
- 完善业务逻辑
增加proto文件模板
在项目对应目录下执行
kratos proto add api/verifyCodeSystem/verifyCodeSystem.proto
这个文件可以任意放置,不过这个布局方式比较经典
只保留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
注意: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选项指定生成文件所在位置
将生成的服务注册到gRPC服务中
更新internal/service/service.go文件
将internal/service/verifyCodeSystem.go中的NewVerifyCodeSystemService方法注册到service.go文件中
告知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来生成依赖注入的代码,保证项目正常运行。
每当service.go中的ProviderSet内的参数发生改动时,都需要重新生成一次代码
运行项目
kratos run