Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)
概要
用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了。所以他的重要性不言而喻。本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程。
目录
- Go微服务实战 - 从0到1搭建一个类Instagram应用(持续更新)
- Go微服务实战 - 用户服务(gRPC+Protocol Buffer)
- Go微服务实战 - 关系服务服务(gRPC+Protocol Buffer)
- Go微服务实战 - 动态服务(gRPC+Protocol Buffer)
- Go微服务实战 - 聚合服务(http)
调用流程图

技术栈
- Go
- Eagle 开发框架
- Redis
- MySQL
- Gorm
- docker
- kubernetes
接口开发
使用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文件
# 生成所有proto
make grpc
# 或者
# 生成指定proto的pb文件
eagle proto client api/user/v1/user.proto
# Output
ll api/user/v1/
user.pb.go #新增
user.proto
user_grpc.pb.go #新增
会生成两个文件 api/user/v1/user.pb.go 和 api/user/v1/user.pb.go
4、生成server骨架代码
# 生成骨架代码
eagle proto server api/user/v1/user.proto
# 默认会输出到 internal/service
# 如果需要指定到对应的目录,可以使用 -t 参数, eg:
# eagle proto server -t internal/logic
# 查看
internal/service/user_svc.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/user_svc.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
也可以使用以下工具进行本地测试
postman: 新版本的postman 也支持gRPC(beta版)调试
grpucui: https://github.com/fullstorydev/grpcui
# 开启UI界面调试窗口
grpcui -plaintext localhost:9090
部署
两种部署方式
- 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~
Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)的更多相关文章
- SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
- 微服务实战——微服务架构选型SpringCloud / Dubbo / K8S比较(一)
## 说在前面 大概是三年前,因一些原因公司原项目最初为单体结构部署,所有业务模块都在一个项目里面,而后随着业务的不断膨胀以及模块之间的耦合,导致后面增加或修改一些简单业务时的成本都会变的极大.新入职 ...
- Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)
作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...
- 微服务实战(六):选择微服务部署策略 - DockOne.io
原文:微服务实战(六):选择微服务部署策略 - DockOne.io [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同 ...
- 微服务实战(三):深入微服务架构的进程间通信 - DockOne.io
原文:微服务实战(三):深入微服务架构的进程间通信 - DockOne.io [编者的话]这是采用微服务架构创建自己应用系列第三篇文章.第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使 ...
- 微服务实战(一):微服务架构的优势与不足 - DockOne.io
原文:微服务实战(一):微服务架构的优势与不足 - DockOne.io [编者的话]本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战 ...
- 微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯.通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己 ...
- 微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io
原文:微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io 这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三 ...
- ASP.NET Core微服务实战系列
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...
随机推荐
- 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示
市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...
- 算法竞赛进阶指南0x34矩阵乘法
文章目录 矩阵的相关性质再回顾 矩阵加速大法: ACWing205. 斐波那契 代码 ACWing206. 石头游戏 解题思路: 感受: 代码 矩阵的相关性质再回顾 对于一个矩阵 满足结合律 满足乘法 ...
- 我也是醉了,Eureka 延迟注册还有这个坑!
Eureka 有个延迟注册的功能,也就是在服务启动成功之后不立刻注册到 Eureka Server,而是延迟一段时间再去注册,这样做的主要目的是因为虽然服务启动成功了,可能还有一些框架或者业务的代码没 ...
- 开源MyBatisGenerator组件源码分析
开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...
- 从零开始Blazor Server(7)--使用Furion权限验证
序 上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限. 其实我们既然集成了Fution,就可以用Furion带的方式来验证. 创建AdminHandler 我 ...
- Less混合结合:nth-child()选择器的高级玩法
1.先看效果图 上图中比较麻烦的是每块的底色处理,下面看怎么处理 2.:nth-child(n) 选择器 匹配属于其父元素的第 N 个子元素,不论元素的类型. n 可以是数字.关键词或公式. 数字:最 ...
- LuoguP1456 Monkey King (左偏树)
struct LeftTree{ int l,r,val,dis; }t[N]; int fa[N]; inline int Find(int x){ return x == fa[x] ? x : ...
- 红黑树以及JAVA实现(一)
目录 前言 一. B树 1.1 概念 1.2 2-3-4树 1.3 2-3-4树的插入 节点分类 1.4 2-3-4树的删除 1.4.1 当删除节点是叶子节点 1.4.1.1 当删除节点为非2节点 1 ...
- java学习第一天.day01
Java的编译和运行机制 java文件编译成字节码文件后加载到java缓存中jvm Java的基本语法 1.Java语言严格区分大小写 2.一个Java源文件里可以定义多个Java类,但不能存在多个p ...
- 使用 Vue.js 框架后的感想
前言 用 Vue 已经有段时间了,把自己的所想所悟写下来,每一个想法都是非常宝贵的,记录成为生活,记录成为习惯. 简化开发 Vue 是可以辅助前端工程师开发 Web App 的一种框架,它节省很多时间 ...