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

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

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

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

  • comment.proto文件定义的rpc方法是通过产品id获取评论数据,用来生成评论rpc服务代码。
  • inventory.proto文件定义的rpc方法是通过产品id获取库存数据,用来生成库存rpc服务代码。
  • product.proto文件定义的rpc方法是通过产品id获取详情数据,用来生成商品rpc服务代码。
  • shopgw.proto文件定义的rpc方法是根据产品id组装成商品详情页面所需的数据,用来生成shop rpc网关服务代码。

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

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


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

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

sponge run

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

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

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

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

快速创建评论(comment)服务如下图所示:
从0到1,十分钟搭建一个微服务集群,集群由一个rpc网关和多个微服务组成_第2张图片


快速创建库存(inventory)服务如下图所示:
从0到1,十分钟搭建一个微服务集群,集群由一个rpc网关和多个微服务组成_第3张图片


快速创建产品(product)服务如下图所示:
从0到1,十分钟搭建一个微服务集群,集群由一个rpc网关和多个微服务组成_第4张图片


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

启动评论(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

启动库存(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

启动产品(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

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


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

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

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

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

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

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

在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 clients
func 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接口了。

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


总结

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



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


你可能感兴趣的:(go,微服务,rpc,架构)