该系列源码已开源:micro-shop
在第三章
讲到:表结构划分,共8
个表,分别对应以下版块:
user
表product
、category
表cart
表orders
、order_record
、order_address
表pay_info
表总共5
个服务。在咱们原先的构想中,远不止远不止以上这 5
个服务版块。
但是对于电商系统来说,这5
个版块是重中之重的,是必不可少的。
在第四章
讲到:API定义
,针对5
个服务进行接口定义。有了API
那自然就要说到RPC
了。
所以咱们该篇文章就针对重中之重的5
个版块进行RPC
的定义,用于对API数据依赖
的开发。
如果以上设计构想不是很清楚的,可通过如下传送门查看该系列其他文章:
不同的微服务间需要做数据的隔离,每个微服务独占数据库资源,通过RPC
调用来获取数据依赖,整体架构如下图所示:
通过以上对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
文件?另外,如果你感兴趣,非常欢迎你加入,我们一起来完成这个项目,为社区献出自己的一份力。
希望本篇文章对你有所帮助,谢谢。