安装 CLI
go get -u github.com/go-kratos/kratos/cmd/kratos/v2@latest
升级相关插件集
kratos upgrade
拉取 layout
kratos new github.com/you_name/you_project -r https://github.com/xiaohubai/rpc_layout.git
开发相关
生成 .proto文件
kratos proto add api/you_project/you_project.proto
编写 .proto文件
syntax = "proto3";
package api.user;
import "validate/validate.proto";
import "google/api/annotations.proto";
option go_package = "github.com/xiaohubai/rpc_layout/api/user;user";
option java_multiple_files = true;
option java_package = "api.user";
service User {
rpc Login(LoginRequest) returns (LoginReply) {
option (google.api.http) = {
post : "/login"
body : "*"
};
};
}
message LoginRequest {
string user_name = 1 [ (validate.rules).string = {min_len : 1} ];
string passwd = 2 [ (validate.rules).string = {min_len : 6} ];
}
message LoginReply {
int32 code = 1;
string msg = 2;
Data data = 3;
string trace_id = 4;
}
message Data {
string user_name = 1;
string phone = 2;
int64 age = 3;
}
生成客户端调用pb文件
kratos proto client api/you_you_microservice/you_microservice.proto
生成微服务项目
cd app
kratos new github.com/you_name/you_project/app/you_microservice
生成服务端代码
kratos proto server api/user/user.proto -t app/user/internal/service
编写和configs相对应的internal/conf/conf.proto文件,
syntax = "proto3";
package internal.conf;
option go_package = "github.com/xiaohubai/rpc_layout/app/user/internal/conf;conf";
import "google/protobuf/duration.proto";
message Bootstrap {
Server server = 1;
Data data = 2;
}
message Server {
message HTTP {
string network = 1;
string addr = 2;
google.protobuf.Duration timeout = 3;
}
message GRPC {
string network = 1;
string addr = 2;
google.protobuf.Duration timeout = 3;
}
HTTP http = 1;
GRPC grpc = 2;
}
message Data {
message Database {
string driver = 1;
string source = 2;
}
message Redis {
string network = 1;
string addr = 2;
google.protobuf.Duration read_timeout = 3;
google.protobuf.Duration write_timeout = 4;
}
Database database = 1;
Redis redis = 2;
}
生成 internal/conf/conf.proto相关的结构体
//在根目录执行make config
make config
编写biz的 repo和usecase
package biz
import (
"context"
"github.com/go-kratos/kratos/v2/log"
)
//1. 定义表相关的结构体
type User struct {
Name string `json:"name"`
Phone string `json:"phone"`
Age int `json:"age"`
}
//2. 定义repo接口集
type UserRepo interface {
GetUser(context.Context, *User) (*User, error)
}
//3. 定义usecase
type UserUseCase struct {
repo UserRepo
log *log.Helper
}
//4. 生成usecase实例,用于wire依赖注入
func NewUserUseCase(repo UserRepo, logger log.Logger) *UserUseCase {
return &UserUseCase{repo: repo, log: log.NewHelper(logger)}
}
定义、初始化data实例,实现biz的repo方法。
package data
import (
"context"
"github.com/go-kratos/kratos/v2/log"
"github.com/xiaohubai/rpc_layout/app/user/internal/biz"
)
type userRepo struct {
data *Data
log *log.Helper
}
func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {
return &userRepo{
data: data,
log: log.NewHelper(logger),
}
}
func (r *userRepo) GetUser(ctx context.Context, u *biz.User) (*biz.User, error) {
return u, nil
}
server/http.go 、grpc.go 注册微服务
// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, userSrv *service.UserService, logger log.Logger) *grpc.Server {
var opts = []grpc.ServerOption{
grpc.Middleware(
recovery.Recovery(),
logging.Server(logger),
),
}
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...)
user.RegisterUserServer(srv, userSrv)
return srv
// NewHTTPServer new a HTTP server.
func NewHTTPServer(c *conf.Server, userSrv *service.UserService, logger log.Logger) *http.Server {
var opts = []http.ServerOption{
http.Middleware(
recovery.Recovery(),
logging.Client(logger),
),
}
if c.Http.Network != "" {
opts = append(opts, http.Network(c.Http.Network))
}
if c.Http.Addr != "" {
opts = append(opts, http.Address(c.Http.Addr))
}
if c.Http.Timeout != nil {
opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))
}
srv := http.NewServer(opts...)
user.RegisterUserHTTPServer(srv, userSrv)
return srv
}
}
使用wire 生成依赖注入
//在 app/you_microservice/cmd/you_microservice下执行wire,生成wire_gen.go依赖文件
wire
运行
kratos run