Golang Go语言微服务实战 - 用户服务(gRPC+Protocol Buffer)

概要

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

目录

调用流程图

技术栈

接口开发

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

开发步骤

这里详细的记录了开发的步骤,方便参看本项目的同学知道其实现过程。

1 、生成 proto 模板文件

eagle proto add api/user/v1/user.proto

内容如下

syntax = "proto3";

package api.user.v1;

option go_package = “github.com/go-microservice/user-service/api/user/v1;v1”; option java_multiple_files = true; option java_package = “api.user.v1”;

service UserService { rpc CreateUser (CreateUserRequest) returns (CreateUserReply); rpc UpdateUser (UpdateUserRequest) returns (UpdateUserReply); rpc DeleteUser (DeleteUserRequest) returns (DeleteUserReply); rpc GetUser (GetUserRequest) returns (GetUserReply); rpc ListUser (ListUser1Request) returns (ListUserReply); }

message CreateUser1Request {} message CreateUser1Reply {}

message UpdateUserRequest {} message UpdateUserReply {}

message DeleteUserRequest {} message DeleteUserReply {}

message GetUserRequest {} message GetUserReply {}

message ListUserRequest {} message ListUserReply {}

2 、为 proto 填充业务方法及字段定义

vim api/user/v1/user.proto

3 、生成 pb 文件

会生成两个文件 api/user/v1/user.pb.goapi/user/v1/user.pb.go

# 生成所有 proto
make grpc

或者

生成指定 proto 的 pb 文件

eagle proto client api/user/v1/user.proto

Output

ll api/like/v1/ like.pb.go #新增 like.proto like_grpc.pb.go #新增

4 、生成 server 骨架代码

# 生成骨架代码
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

// internal/server/grpc.go 

import ( … v1 “github.com/go-microservice/user-service/api/user/v1” … )

// NewGRPCServer creates a gRPC server func NewGRPCServer( cfg *app.ServerConfig, // 新增 svc *service.UserServiceServer, ) *grpc.Server {

grpcServer := grpc.NewServer(
	grpc.Network("tcp"),
	grpc.Address(cfg.WriteTimeout),
	grpc.Timeout(cfg.WriteTimeout),
)

// register biz service
// 新增
v1.RegisterUserServiceServer(grpcServer, svc)

return grpcServer

}

6 、在生成的 server 中编写业务逻辑

// vim internal/service/userservice_grpc.go

package service

import ( “context”

pb "github.com/go-microservice/moment-service/api/user/v1"

)

var ( _ pb.UserServiceServer = (*UserServiceServer)(nil) )

type UserServiceServer struct { pb.UnimplementedUserServiceServer }

func NewUserServiceServer() *UserServiceServer { return &UserServiceServer{ } }

func (s *UserServiceServer) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserReply, error) {

return &pb.CreateUserReply{}, nil

} func (s *UserServiceServer) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserReply, error) { return &pb.UpdateUserReply{}, nil } func (s *UserServiceServer) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*pb.DeleteUserReply, error) { return &pb.DeleteUserReply{}, nil } func (s *UserServiceServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserReply, error) { return &pb.GetUserReply{}, nil } func (s *UserServiceServer) ListUser(ctx context.Context, req *pb.ListUserRequest) (*pb.ListUserReply, error) { return &pb.ListUserReply{}, nil }

7 、启动服务

# 在根目录下运行
go run main.go

确保运行 gRPC server

// main.go

… eagle.WithServer( // init gRPC server gs, ), …

8 、接口调试

调试工具,这里使用 [grpcurl]( https://github.com/fullstorydev/grpcurl)

# 查看服务列表
grpcurl -plaintext localhost:9090 list

Output

api.user.v1.UserService grpc.health.v1.Health grpc.reflection.v1alpha.ServerReflection

访问列表

grpcurl -plaintext -d ‘{“user_id”:2}’ localhost:9090 api.user.v1.UserService/ListUser

参数说明

  • -d 提交的参数,json 格式
  • -plaintext 使用纯文本连接,跳过 TLS

也可以使用以下工具进行本地测试

部署

两种部署方式

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

部署步骤

  • 构建 docker 镜像

    docker build -t user-service:v1.0.0 -f deploy/docker/Dockerfile .
    
  • 打 docker tag

    docker tag user-service:v1.0.0 qloog/user-service:v1.0.0
    
  • push tag 到 docker hub

    docker push qloog/user-service:v1.0.0
    
  • 部署到 k8s

    kubectl apply -f deploy/k8s/go-deployment.yaml
    kubectl apply -f deploy/k8s/go-service.yaml
    

以上命令都是一步一步执行的,为了方便期间,这里也提供了一件部署脚本,执行如下

sh deploy/deploy.sh

项目源码

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

完结

到此,开发、测试、部署已经操作完了,后面会继续完善链路追踪和监控相关的部分。

感谢阅读, 祝大家 Happy coding~


Golang Go语言微服务实战 - 用户服务(gRPC+Protocol Buffer)

更多关于Golang Go语言微服务实战 - 用户服务(gRPC+Protocol Buffer)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Go语言微服务实战 - 用户服务(gRPC+Protocol Buffer)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


针对“Golang Go语言微服务实战——用户服务(gRPC+Protocol Buffer)”的帖子,以下是我的回复:

在Golang中,使用gRPC和Protocol Buffer实现微服务架构是一种高效且流行的方式。以下是对这一实践的专业解读:

  1. gRPC简介:gRPC是一种高性能、开源的远程过程调用(RPC)框架,适用于微服务之间的通信。它基于HTTP/2协议,并提供了诸如双向流、流式RPC等多种通信模式,以满足不同的服务需求。

  2. Protocol Buffer(Protobuf):Protobuf是Google开发的一种轻量级、高效的序列化和反序列化协议。它可以将结构化数据进行编码和解码,非常适合用于微服务之间的数据传输。

  3. 实践应用

    • 定义服务:首先,使用Protobuf定义服务接口和数据结构。例如,可以定义一个用户服务,包含用户信息的查询、更新等功能。
    • 生成代码:使用protoc工具根据Protobuf定义文件生成对应的Golang代码。
    • 编写服务端和客户端代码:根据生成的代码,编写服务端和客户端的实现逻辑。服务端负责处理请求并返回结果,客户端则负责调用服务端的功能。
  4. 注意事项:在微服务架构中,还需要注意服务的拆分、注册与发现、治理等问题,以确保整个系统的可靠性和稳定性。

综上所述,使用gRPC和Protobuf在Golang中实现微服务架构是一种可行且高效的方式。

回到顶部