使用gRPC、API网关和权限校验创建Go微服务[下]

Coding Alan 2年前 (2022-08-23) 1317次浏览 0个评论 扫描二维码

使用Go语言创建3个微服务和1个API网关 (2022版)

使用gRPC、API网关和权限校验创建Go微服务[下]

本文是系列文章使用gRPC、API网关和权限校验创建Go微服务的下篇。

我们继续讲解。

商品微服务 (go-grpc-product-svc)

Github: https://github.com/alanhou/go-grpc-project

这是三个微服务中的第二个。这里我们实现三个功能:

  • 创建商品
  • 根据ID查找某一商品
  • 根据商品ID或订单ID减少商品库存

 在命令行终端进入 go-grpc-product-svc

项目初始化

安装模块

项目结构

我们需要配置整个项目。认证微服务相较API网关要精简很多。

目录

Files

项目结构如下所示:

使用gRPC、API网关和权限校验创建Go微服务[下]

Makefile

又到了快乐的编码时间了。老规矩,先编写Makefile来简化命令。

先在Makefile中添加代码:

Proto文件

生成protobuf文件需要先编写一个商品的proto文件。我们声明了三个功能: CreateProductFindOneDecreaseStock

pkg/pb/product.proto中添加如下代码:

生成Protobuf文件

接下来使用下面的命令生成protobuf文件:

环境变量

同样我们需要定义一些环境变量。在pkg/config/envs/dev.env中添加如下代码:

配置

我们需要使用Viper模块初始化来加载这里环境变量。

pkg/config/config.go文件中添加如下代码:

减库存记录模型

这是我们唯一包含两个模型的微服务。出于幂等考虑我们需要记录下所有减少的库存。

什么是幂等?

幂等(Idempotence)是一种特性,可以保障同一运算的调用不会导致服务状态的任何改变进而导致其它的副作用。

也就是说,我们要确保库存只减少一次。设想一下如果出于某种原因同一订单中库存单位减少了两次,就会导致数据的不一致性。

pkg/models/stock_decrease_log.go中添加如下代码:

商品模型

然后我们需要添加商品模型。在pkg/models/product.go中添加如下代码:

数据库连接

我们还要像第一部分中一样连接数据库。在pkg/db/db.go中添加如下代码:

商品服务

此处我们需要处理所有进入的gRPC请求。从第60行开始的DecreaseStock函数值得注意,我们检查了特定订单ID已减去的库存来保障数据的一致性,避免不小心连续两次调了同一端点。这是微服务中非常重要的课题。

pkg/services/product.go中添加代码:

main文件

最后的重头戏,我们需要启用应用。在cmd/main.go中添加代码

 

这时就可以使用下面命令运行应用了:

订单微服务(go-grpc-order-svc)

Github: https://github.com/alanhou/go-grpc-project

这是三个微服务中的最后一个。我们会添加一个功能。。

  • 按用户ID和商品ID创建订单

在终端中进入go-grpc-order-svc目录执行后续操作!

初始化项目

安装模块

项目结构

我们需要搭建项目。订单服务比API网关要简洁一些。

文件夹

文件

文件结构如下所示:

使用gRPC、API网关和权限校验创建Go微服务[下]

Makefile

同样需要编写Makefile文件。

Makefile中加入如下代码:

订单Proto文件

pkg/pb/order.proto中添加如下代码:

商品Proto文件

这个有些特别,因为订单微服务中包含了商品微服务中的商品Proto。原因是我们创建订单时需要调用商品微服务,有两大原因。

第一是我们需要检查商品是否存在。第二是我们需要根据订单请求减少商品的库存量。

pkg/pb/product.proto中添加如下代码:

生成Protobuf文件

老规矩,运行以下命令生成两个protobuf文件:

环境文件

pkg/config/envs/dev.env中添加如下代码:

配置

pkg/config/config.go中添加代码:

订单模型

pkg/models/order.go中添加代码:

数据库连接

pkg/db/db.go中添加代码:

商品微服务客户端

前面提到我们需要连接商品微服务。这就要创建一个客户端。

pkg/client/product_client.go中添加代码:

订单服务

pkg/services/order.go中添加代码:

main文件

最后需要有一个启动文件,cmd/main.go中添加代码:

太棒了!我们已经完成了所有的微服务以及API网关。下面就来进行全面测试。但首先要确保已经启动了API网关和所有这3个微服务,在相应的项目中运行命令:

测试所有端点

可以使用Insomnia、Postman等软件逐一测试,也可以像本文中一样使用cURL测试各端点。

首先需要注册一个用户:

登录

接下要进行登录来获取JSON Web Token:

这里的响应非常重要,因为后续的请求都需要使用响应中的token

响应

创建商品

此时我们需要在请求头中添加token来创建商品。

查找商品

需要在URL中添加商品ID来查找商品。

创建订单

需要传递商品ID和数量来创建订单。

恭喜你成功了!

感谢阅读本系列有关如何使用Go语言开发微服务的第二部分。真心希望读者能从中学到一些新知识。

加油!

整理自Kevin Vogel的文章。

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址