开发流程 - gRPC
👉 记录gRPC的开发流程,方便后续的开发
开发步骤
1、生成proto模板文件
eagle proto add api/like/v1/like.proto
内容如下
syntax = "proto3";
package api.like.v1;
option go_package = "github.com/go-microservice/moment-service/api/like/v1;v1";
option java_multiple_files = true;
option java_package = "api.like.v1";
service LikeService {
rpc CreateLike (CreateLikeRequest) returns (CreateLikeReply);
rpc UpdateLike (UpdateLikeRequest) returns (UpdateLikeReply);
rpc DeleteLike (DeleteLikeRequest) returns (DeleteLikeReply);
rpc GetLike (GetLikeRequest) returns (GetLikeReply);
rpc ListLike (ListLikeRequest) returns (ListLikeReply);
}
message CreateLikeRequest {}
message CreateLikeReply {}
message UpdateLikeRequest {}
message UpdateLikeReply {}
message DeleteLikeRequest {}
message DeleteLikeReply {}
message GetLikeRequest {}
message GetLikeReply {}
message ListLikeRequest {}
message ListLikeReply {}
2、定义proto
主要是填充业务方法及message定义
vim api/like/v1/like.proto
3、生成pb文件
业务rpc方法及message定义完,就可以生成pb文件了,具体操作如下
# 方式一:生成所有proto
make grpc
# 方式二:生成指定proto的pb文件
eagle proto client api/like/v1/like.proto
# Output
# api/like/v1/
like.pb.go #新增
like.proto
like_grpc.pb.go #新增
说明
protocol buffer编译器(protoc)生成的代码包含
- 消息序列化代码(
*.pb.go
) - 客户端使用方法调用的远程接口存根(
*_grpc.pb.go
) - 服务器代码实现的抽象接口(
*_grpc.pb.go
)
4、生成server骨架代码
实现了上一步生成的接口(*_grpc.pb.go
内)
# 生成骨架代码
eagle proto server api/like/v1/like.proto
# 默认会输出到 internal/service
# 如果需要指定到对应的目录,可以使用 -t 参数, eg:
# eagle proto server -t internal/logic
# 查看
internal/service/likeservice_grpc.go
5、注册服务到gRPC Server
// NewGRPCServer creates a gRPC server
func NewGRPCServer(
cfg *app.ServerConfig,
// 新增
likeSvc *service.LikeServiceServer,
) *grpc.Server {
grpcServer := grpc.NewServer(
grpc.Network("tcp"),
grpc.Address(":9090"),
grpc.Timeout(3*time.Second),
)
// register biz service
// 新增
likev1.RegisterLikeServiceServer(grpcServer, likeSvc)
return grpcServer
}
6、在server中编写业务逻辑
这里编写具体的业务逻辑
# vim internal/service/likeservice_grpc.go
package service
import (
"context"
pb "github.com/go-microservice/moment-service/api/like/v1"
)
var (
_ pb.LikeServiceServer = (*LikeServiceServer)(nil)
)
type LikeServiceServer struct {
pb.UnimplementedLikeServiceServer
// here 导入你需要用到的repo
likeRepo repository.UserLikeRepo
}
func NewLikeServiceServer() *LikeServiceServer {
return &LikeServiceServer{
}
}
func (s *LikeServiceServer) CreateLike(ctx context.Context, req *pb.CreateLikeRequest) (*pb.CreateLikeReply, error) {
return &pb.CreateLikeReply{}, nil
}
func (s *LikeServiceServer) UpdateLike(ctx context.Context, req *pb.UpdateLikeRequest) (*pb.UpdateLikeReply, error) {
return &pb.UpdateLikeReply{}, nil
}
func (s *LikeServiceServer) DeleteLike(ctx context.Context, req *pb.DeleteLikeRequest) (*pb.DeleteLikeReply, error) {
return &pb.DeleteLikeReply{}, nil
}
func (s *LikeServiceServer) GetLike(ctx context.Context, req *pb.GetLikeRequest) (*pb.GetLikeReply, error) {
return &pb.GetLikeReply{}, nil
}
func (s *LikeServiceServer) ListLike(ctx context.Context, req *pb.ListLikeRequest) (*pb.ListLikeReply, error) {
return &pb.ListLikeReply{}, nil
}