Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)

[复制链接]
发表于 2022-10-2 11:55:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
概要

用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了。所以他的重要性不言而喻。本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程。
目录

调用流程图


技术栈

接口开发

使用proto方式定义,主要包含以下接口

开发步骤

这里详细的记录了开发的步骤,方便参看本项目的同学知道其实现过程。
1、生成proto模板文件
  1. eagle proto add api/user/v1/user.proto
复制代码
内容如下
  1. syntax = "proto3";
  2. package api.user.v1;
  3. option go_package = "github.com/go-microservice/user-service/api/user/v1;v1";
  4. option java_multiple_files = true;
  5. option java_package = "api.user.v1";
  6. service UserService {
  7.         rpc CreateUser (CreateUserRequest) returns (CreateUserReply);
  8.         rpc UpdateUser (UpdateUserRequest) returns (UpdateUserReply);
  9.         rpc DeleteUser (DeleteUserRequest) returns (DeleteUserReply);
  10.         rpc GetUser (GetUserRequest) returns (GetUserReply);
  11.         rpc ListUser (ListUser1Request) returns (ListUserReply);
  12. }
  13. message CreateUser1Request {}
  14. message CreateUser1Reply {}
  15. message UpdateUserRequest {}
  16. message UpdateUserReply {}
  17. message DeleteUserRequest {}
  18. message DeleteUserReply {}
  19. message GetUserRequest {}
  20. message GetUserReply {}
  21. message ListUserRequest {}
  22. message ListUserReply {}
复制代码
2、为proto填充业务方法及字段定义
  1. vim api/user/v1/user.proto
复制代码
3、生成pb文件
  1. # 生成所有proto
  2. make grpc
  3. # 或者
  4. # 生成指定proto的pb文件
  5. eagle proto client api/user/v1/user.proto
  6. # Output
  7. ll api/user/v1/
  8. user.pb.go #新增
  9. user.proto
  10. user_grpc.pb.go #新增
复制代码
会生成两个文件 api/user/v1/user.pb.go 和 api/user/v1/user.pb.go
4、生成server骨架代码
  1. # 生成骨架代码
  2. eagle proto server api/user/v1/user.proto
  3. # 默认会输出到 internal/service
  4. # 如果需要指定到对应的目录,可以使用 -t 参数, eg:
  5. # eagle proto server -t internal/logic
  6. # 查看
  7. internal/service/user_svc.go
复制代码
5、注册服务到gRPC Server
  1. // internal/server/grpc.go
  2. import (
  3.                 ...
  4.                 v1 "github.com/go-microservice/user-service/api/user/v1"
  5.                 ...
  6. )
  7. ...
  8. // NewGRPCServer creates a gRPC server
  9. func NewGRPCServer(
  10.         cfg *app.ServerConfig,
  11.         // 新增
  12.         svc *service.UserServiceServer,
  13. ) *grpc.Server {
  14.         grpcServer := grpc.NewServer(
  15.                 grpc.Network("tcp"),
  16.                 grpc.Address(cfg.WriteTimeout),
  17.                 grpc.Timeout(cfg.WriteTimeout),
  18.         )
  19.         // register biz service
  20.         // 新增
  21.         v1.RegisterUserServiceServer(grpcServer, svc)
  22.         return grpcServer
  23. }
复制代码
6、在生成的server中编写业务逻辑
  1. // vim internal/service/user_svc.go
  2. package service
  3. import (
  4.         "context"
  5.         pb "github.com/go-microservice/moment-service/api/user/v1"
  6. )
  7. var (
  8.         _ pb.UserServiceServer = (*UserServiceServer)(nil)
  9. )
  10. type UserServiceServer struct {
  11.         pb.UnimplementedUserServiceServer
  12. }
  13. func NewUserServiceServer() *UserServiceServer {
  14.         return &UserServiceServer{
  15. }
  16. }
  17. func (s *UserServiceServer) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserReply, error) {
  18.         return &pb.CreateUserReply{}, nil
  19. }
  20. func (s *UserServiceServer) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserReply, error) {
  21.         return &pb.UpdateUserReply{}, nil
  22. }
  23. func (s *UserServiceServer) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*pb.DeleteUserReply, error) {
  24.         return &pb.DeleteUserReply{}, nil
  25. }
  26. func (s *UserServiceServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserReply, error) {
  27.         return &pb.GetUserReply{}, nil
  28. }
  29. func (s *UserServiceServer) ListUser(ctx context.Context, req *pb.ListUserRequest) (*pb.ListUserReply, error) {
  30.         return &pb.ListUserReply{}, nil
  31. }
复制代码
后面就可以在这里补充具体的业务逻辑处理了。
7、启动服务
  1. # 在根目录下运行
  2. go run main.go
复制代码
确保运行gRPC server
  1. // main.go
  2. ...
  3. eagle.WithServer(
  4.         // init gRPC server
  5.         gs,
  6. ),
  7. ...
复制代码
8、接口调试
调试工具,这里使用 [grpcurl](https://github.com/fullstorydev/grpcurl)
  1. # 查看服务列表
  2. grpcurl -plaintext localhost:9090 list
  3. # Output
  4. api.user.v1.UserService
  5. grpc.health.v1.Health
  6. grpc.reflection.v1alpha.ServerReflection
  7. # 访问列表
  8. grpcurl -plaintext -d '{"user_id":2}' localhost:9090 api.user.v1.UserService/ListUser
复制代码
参数说明

  • -d 提交的参数, json格式
  • -plaintext 使用纯文本连接,跳过TLS
也可以使用以下工具进行本地测试
部署

两种部署方式

  • docker
  • k8s (本地部署可以使用minikube)
部署步骤

  • 构建docker镜像
    1. docker build -t user-service:v1.0.0 -f deploy/docker/Dockerfile .
    复制代码
  • 打docker tag
    1. docker tag user-service:v1.0.0 qloog/user-service:v1.0.0
    复制代码
  • push tag 到 docker hub
    1. docker push qloog/user-service:v1.0.0
    复制代码
  • 部署到k8s
    1. kubectl apply -f deploy/k8s/go-deployment.yaml
    2. kubectl apply -f deploy/k8s/go-service.yaml
    复制代码
以上命令都是一步一步执行的,为了方便期间,这里也提供了一件部署脚本,执行如下
  1. sh deploy/deploy.sh
复制代码
项目源码

最终源码在这里:https://github.com/go-microservice/user-service
完结

到此,开发、测试、部署已经操作完了,后面会继续完善链路追踪和监控监控相关的部分。
感谢阅读, 祝大家 Happy coding~
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表