写点什么

从 0 到 1,十分钟搭建一个微服务集群,集群由一个 rpc 网关和多个微服务组成

作者:vison
  • 2023-05-07
    广东
  • 本文字数:3431 字

    阅读完需:约 11 分钟

从0到1,十分钟搭建一个微服务集群,集群由一个rpc网关和多个微服务组成

以一个简单的电商微服务集群为例,商品详情页面有商品信息、库存信息、商品评价信息,这些信息数据分散在不同的微服务中,通过 rpc 网关服务组装所需的数据返回给商品详情页面,如下图所示:



已经提前准备好 4 个 proto 文件,每个 proto 文件生成对应一个服务代码:


  • comment.proto 文件定义的 rpc 方法是通过产品 id 获取评论数据,用来生成评论 rpc 服务代码。

  • inventory.proto 文件定义的 rpc 方法是通过产品 id 获取库存数据,用来生成库存 rpc 服务代码。

  • product.proto 文件定义的 rpc 方法是通过产品 id 获取详情数据,用来生成商品 rpc 服务代码。

  • shopgw.proto 文件定义的 rpc 方法是根据产品 id 组装成商品详情页面所需的数据,用来生成 shop rpc 网关服务代码。


<br>


接下来使用工具 sponge 生成 4 个服务代码,并运行起来。


十分钟搭建一个微服务集群的详细演示过程请看 B 站视频 https://www.bilibili.com/video/BV1YM4y127YK/


<br>


安装 sponge 地址:https://github.com/zhufuyi/sponge


安装完 sponge 后,执行命令打开 UI 界面:


sponge run
复制代码


<br>

快速生成和启动评论、库存、产品三个微服务

生成评论、库存、产品三个微服务代码

进入 sponge 的 UI 界面,点击左边菜单栏【protobuf】--> 【RPC 类型】-->【创建 rpc 项目】,填写评论、库存、产品各自参数,分别生成评论、库存、商品服务代码。


微服务框架使用 grpc,还包含了常用的服务治理功能代码,构建部署脚本等,使用什么数据库由自己选择。


快速创建评论(comment)服务如下图所示:



<br>


快速创建库存(inventory)服务如下图所示:



<br>


快速创建产品(product)服务如下图所示:



<br>


打开三个终端,评论、库存、产品分别对应一个终端。

启动评论(comment)服务

切换到评论(comment)目录,执行步骤:


(1) 生成 pb.go 代码,生成模板代码,生成测试代码


make proto
复制代码


(2) 打开 internal/service/comment.go,这是生成的模板代码,里面有一行提示填写业务逻辑代码的 panic 代码,在这里填写业务逻辑,例如填写返回值:


  return &commentV1.ListByProductIDReply{    Total:     11,    ProductID: 1,    CommentDetails: []*commentV1.CommentDetail{      {        Id:       1,        Username: "Mr Zhang",        Content:  "good",      },      {        Id:       2,        Username: "Mr Li",        Content:  "good",      },      {        Id:       3,        Username: "Mr Wang",        Content:  "not good",      },    },  }, nil
复制代码


(3) 打开 configs/comment.yml 配置文件,找到 grpc,修改下面的 port 和 httpPort 两个端口值


grpc:  port: 18203              # listen port  httpPort: 18213        # profile and metrics ports
复制代码


(4) 编译和启动 comment 服务


make run
复制代码


<br>

启动库存(inventory)服务

切换到库存(inventory)目录,执行和 comment 一样的步骤:


(1) 生成 pb.go 代码,生成模板代码,生成测试代码


make proto
复制代码


(2) 打开 internal/service/inventory.go,这是生成的模板代码,里面有一行提示填写业务逻辑代码的 panic 代码,在这里填写业务逻辑,例如填写返回值:


  return &inventoryV1.GetByIDReply{    InventoryDetail: &inventoryV1.InventoryDetail{      Id:      1,      Num:     999,      SoldNum: 111,    },  }, nil
复制代码


(3) 打开 configs/inventory.yml 配置文件,找到 grpc,修改下面的 port 和 httpPort 两个端口值


grpc:  port: 28203              # listen port  httpPort: 28213        # profile and metrics ports
复制代码


(4) 编译和启动 inventory 服务


make run
复制代码


<br>

启动产品(product)服务

切换到库存(product)目录,执行和 comment 一样的步骤:


(1) 生成 pb.go 代码,生成模板代码,生成测试代码


make proto
复制代码


(2) 打开 internal/service/product.go,这是生成的模板代码,里面有一行提示填写业务逻辑代码的 panic 代码,在这里填写业务逻辑,例如填写返回值:


  return &productV1.GetByIDReply{    ProductDetail: &productV1.ProductDetail{      Id:          1,      Name:        "数据线",      Price:       10,      Description: "安卓type c数据线",    },    InventoryID: 1,  }, nil
复制代码


(3) 打开 configs/product.yml 配置文件,找到 grpc,修改下面的 port 和 httpPort 两个端口值


grpc:  port: 38203              # listen port  httpPort: 38213        # profile and metrics ports
复制代码


(4) 编译和启动 product 服务


make run
复制代码


评论、库存、产品三个微服务都启动成功后,接下来就可以生成和启动网关服务了。


<br>

快速生成和启动 rpc 网关服务

进入 sponge 的 UI 界面,点击左边菜单栏【protobuf】--> 【Web 类型】-->【创建 rpc 网关项目】,填写一些参数就可以生成 rpc 网关项目代码了。


web 框架使用 gin,还包含了 swagger 文档、常用的服务治理功能代码,构建部署脚本等。



为了连接评论、库存、产品三个 rpc 服务,需要另外生成连接 rpc 服务代码,点击左边菜单栏【Public】--> 【生成连接 rpc 服务代码】,填写参数后生成代码,然后把生成的连接 rpc 服务代码移动到 rpc 网关项目代码目录下。



在 rpc 网关服务中为了能够调用 rpc 服务的方法,需要把评论、库存、产品三个 rpc 服务的 proto 文件复制到 rpc 网关服务的目录api/shopgw/v1下。


切换到 shopgw 目录,执行步骤:


(1) 生成 pb.go 代码,生成注册路由代码,生成模板代码,生成 swagger 文档


make proto
复制代码


(2) 打开 internal/service/shopgw_logic.go,这是生成的 api 接口代码,在这里填写业务逻辑代码,填写下面简单业务逻辑代码:


package service
import ( "context"
commentV1 "shopgw/api/comment/v1" inventoryV1 "shopgw/api/inventory/v1" productV1 "shopgw/api/product/v1" shopgwV1 "shopgw/api/shopgw/v1" "shopgw/internal/rpcclient")
var _ shopgwV1.ShopGwLogicer = (*shopGwClient)(nil)
type shopGwClient struct { productCli productV1.ProductClient inventoryCli inventoryV1.InventoryClient commentCli commentV1.CommentClient}
// NewShopGwClient creating rpc clientsfunc NewShopGwClient() shopgwV1.ShopGwLogicer { return &shopGwClient{ productCli: productV1.NewProductClient(rpcclient.GetProductRPCConn()), inventoryCli: inventoryV1.NewInventoryClient(rpcclient.GetInventoryRPCConn()), commentCli: commentV1.NewCommentClient(rpcclient.GetCommentRPCConn()), }}
func (c *shopGwClient) GetDetailsByProductID(ctx context.Context, req *shopgwV1.GetDetailsByProductIDRequest) (*shopgwV1.GetDetailsByProductIDReply, error) { productRep, err := c.productCli.GetByID(ctx, &productV1.GetByIDRequest{ Id: req.ProductID, }) if err != nil { return nil, err }
inventoryRep, err := c.inventoryCli.GetByID(ctx, &inventoryV1.GetByIDRequest{ Id: productRep.InventoryID, }) if err != nil { return nil, err }
commentRep, err := c.commentCli.ListByProductID(ctx, &commentV1.ListByProductIDRequest{ ProductID: req.ProductID, }) if err != nil { return nil, err }
return &shopgwV1.GetDetailsByProductIDReply{ ProductDetail: productRep.ProductDetail, InventoryDetail: inventoryRep.InventoryDetail, CommentDetails: commentRep.CommentDetails, }, nil}
复制代码


(3) 打开 configs/shopgw.yml 配置文件,找到 grpcClient,添加评论、库存、产品三个 rpc 服务地址:


grpcClient:  - name: "comment"    host: "127.0.0.1"    port: 18282  - name: "inventory"    host: "127.0.0.1"    port: 28282  - name: "product"    host: "127.0.0.1"    port: 38282
复制代码


(4) 编译和启动 shopgw 服务


make run
复制代码


在浏览器打开 http://localhost:8080/apis/swagger/index.html 就可以测试 api 接口了。



<br>

总结

使用工具 sponge 很容易就搭建出一个微服务集群,集群中各个微服务的常用服务治理功能也是具备的,例如服务注册与发现、限流、熔断、链路跟踪、监控、性能分析、资源统计、CICD 等,这些功能统一在 yml 配置文件开启或关闭。只要在 proto 文件定义好 rpc 方法的描述信息,后续的开发基本都是在生成的模板代码填写业务逻辑代码,在生成的测试代码中验证业务逻辑,使得开发简单化,提高开发效率,节省开发时间。


<br>



这是根据上面步骤生成的完整源码: https://wwzy.lanzoub.com/ilA0m0rz6z9i


用户头像

vison

关注

还未添加个人签名 2019-06-29 加入

还未添加个人简介

评论

发布
暂无评论
从0到1,十分钟搭建一个微服务集群,集群由一个rpc网关和多个微服务组成_微服务_vison_InfoQ写作社区