go-zero 成长之路—微服务电商实战系列(五、RPC定义)

该系列源码已开源:micro-shop

概述

第三章讲到:表结构划分,共8个表,分别对应以下版块:

  • 用户服务版块:user
  • 产品服务版块:productcategory
  • 购物车服务版块:cart
  • 订单服务版块:ordersorder_recordorder_address
  • 支付服务版块:pay_info

总共5个服务。在咱们原先的构想中,远不止远不止以上这 5 个服务版块。

但是对于电商系统来说,这5个版块是重中之重的,是必不可少的。

第四章讲到:API定义,针对5个服务进行接口定义。有了API那自然就要说到RPC了。

所以咱们该篇文章就针对重中之重的5个版块进行RPC的定义,用于对API数据依赖的开发。

如果以上设计构想不是很清楚的,可通过如下传送门查看该系列其他文章:

  • go-zero 成长之路—微服务电商实战系列(四、API定义)
  • go-zero 成长之路—微服务电商实战系列(三、表结构篇)
  • go-zero 成长之路—微服务电商实战系列(二、划分篇)
  • go-zero 成长之路—微服务电商实战系列(一、需求篇)

RPC定义

不同的微服务间需要做数据的隔离,每个微服务独占数据库资源,通过RPC调用来获取数据依赖,整体架构如下图所示:

go-zero 成长之路—微服务电商实战系列(五、RPC定义)_第1张图片

通过以上对API的定义我们大致了解了需要定义哪些服务的RPC,下面开始RPC的定义。

这里采用 rpc.proto 文件的形式进行构建RPC服务。

用户服务

主要功能:用户登录、用户注册、用户信息、…

  • account.proto 文件如下:
syntax = "proto3";

package account;

option go_package = "./account";

message RegisterReq{
  string UserName = 1;
  string PassWord = 2;
  string UserNick = 3;
  string UserFace = 4;
  int64 UserSex = 5;
  string UserEmail = 6;
}

message LoginReq{
  string UserName = 1;
  string PassWord = 2;
}

message CommonResply{
  int64 Code = 1;
  string Message = 2;
  string Data = 3;
}

message UserInfoReq{
  string UserIdentity = 1;
}

service user{
  rpc Register(RegisterReq) returns(CommonResply);
  rpc Login(LoginReq) returns(CommonResply);
  rpc UserInfo(UserInfoReq) returns (CommonResply);
}
  • 生成命令如下:
goctl rpc protoc account.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. -style go-zero 
  • 生成后的目录结构:
├── Dockerfile
├── account.go 
├── account.proto                  // proto描述文件
├── etc
│   └── account.yaml               // 配置文件
├── internal
│   ├── config
│   │   └── config.go              // 配置声明type
│   ├── logic                      // 业务逻辑
│   │   ├── login-logic.go
│   │   ├── register-logic.go
│   │   └── user-info-logic.go
│   ├── server
│   │   └── user-server.go
│   └── svc                        // logic所依赖的资源池
│       └── service-context.go
├── model                          // 数据库表模型生成
│   ├── user_model.go
│   ├── user_model_gen.go
│   ├── user_receive_address_model.go
│   ├── user_receive_address_model_gen.go
│   └── vars.go
├── types                          // request、response的struct,根据api自动生成,不建议编辑
│   └── account
│       ├── account.pb.go
│       └── account_grpc.pb.go
└── user                           // main函数入口
    └── user.go

首页服务

主要功能:首页banner图、人气推荐、商品推荐列表、…

  • home.proto 文件如下:
syntax = "proto3";

package home;

option go_package = "./home";

message BannerReq{}
message RecommendReq{}
message RankingListReq{}

message CommonResply{
  int64 Code = 1;
  string Message = 2;
  string Data = 3;
}

service home{
  rpc Banner(BannerReq) returns(CommonResply);
  rpc Recommend(RecommendReq) returns(CommonResply);
  rpc RankingList(RankingListReq) returns(CommonResply);
}
  • 生成命令如下:
goctl rpc protoc home.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. -style go-zero 
  • 生成后的目录结构:
├── etc
│   └── home.yaml
├── home.go
├── home.proto
├── homeclient
│   └── home.go
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   ├── banner-logic.go
│   │   ├── ranking-list-logic.go
│   │   └── recommend-logic.go
│   ├── server
│   │   └── home-server.go
│   └── svc
│       └── service-context.go
├── model
│   ├── banner.sql
│   ├── banner_model.go
│   ├── banner_model_gen.go
│   └── vars.go
└── types
    └── home
        ├── home.pb.go
        └── home_grpc.pb.go

产品服务

主要功能:产品列表、产品详情、分类列表、…

  • product.proto 文件如下:
syntax = "proto3";

package product;

option go_package = "./product";

message GetProductsReq {
  int64 Page = 1;
  int64 PageSize = 2;
  string Search = 3;
}

message ProductReq {
  string productIds = 1;
}

message GetCateoryReq {
  int64 Pid = 1;
}

message CommonResply{
  int64 Code = 1;
  string Message = 2;
  string Data = 3;
}

service product{
  rpc Products (GetProductsReq) returns (CommonResply);
  rpc Product (ProductReq) returns (CommonResply);
  rpc Category (GetCateoryReq) returns (CommonResply);
}
  • 生成命令如下:
goctl rpc protoc product.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. -style go-zero 
  • 生成后的目录结构:
├── etc
│   └── product.yaml
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   ├── category-logic.go
│   │   ├── product-logic.go
│   │   └── products-logic.go
│   ├── server
│   │   └── product-server.go
│   └── svc
│       └── service-context.go
├── product.go
├── product.proto
├── productclient
│   └── product.go
└── types
    └── product
        ├── product.pb.go
        └── product_grpc.pb.go

说到这里:剩下的几个服务咱们就暂时不说了,有兴趣的朋友可以自行补齐:购物车服务支付服务订单服务这几个版块。

结束语

本篇文章介绍说明了:

  • 如何构建一个RPC服务?
  • 如何编写 rpc.proto 文件?
  • 构建后的每个目录和文件是做什么的?

另外,如果你感兴趣,非常欢迎你加入,我们一起来完成这个项目,为社区献出自己的一份力。

希望本篇文章对你有所帮助,谢谢。

你可能感兴趣的:(go-zero,电商实战系列,rpc,微服务,golang)