# go-zero-learning-multi-rpc **Repository Path**: myn_wsc/go-zero-learning-multi-rpc ## Basic Information - **Project Name**: go-zero-learning-multi-rpc - **Description**: go-zero 框架的多微服务示例 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2020-11-16 - **Last Updated**: 2023-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # go-zero-learning-multi-rpc #### 介绍 go-zero 框架的多微服务示例 #### 书店服务示例简介 为了教程简单,我们用书店服务做示例,并且只实现其中的增加书目和检查价格功能。 写此书店服务是为了从整体上演示go-zero构建完整微服务的过程,实现细节尽可能简化了。 #### 书店微服务架构图 ![在这里插入图片描述](https://cdn.nlark.com/yuque/0/2020/png/2623842/1601207118369-6ba16290-bb3c-4b8d-a25a-9c633329590b.png?x-oss-process=image%2Fresize%2Cw_743) #### goctl各层代码生成一览 所有绿色背景的功能模块是自动生成的,按需激活,红色模块是需要自己写的,也就是增加下依赖,编写业务特有逻辑,各层示意图分别如下: * API Gateway ![描述](https://cdn.nlark.com/yuque/0/2020/png/2623842/1601207151367-ca23930f-c3be-4ed6-9831-73b7baedd39c.png?x-oss-process=image%2Fresize%2Cw_743) * RPC ![miaoshu](https://cdn.nlark.com/yuque/0/2020/png/2623842/1601207171293-c65fb4e5-d8a4-4ded-9218-475ed05e3624.png?x-oss-process=image%2Fresize%2Cw_743) * model ![](https://cdn.nlark.com/yuque/0/2020/png/2623842/1601207199101-56342c41-82b8-4d36-bfed-4f78fc58af78.png?x-oss-process=image%2Fresize%2Cw_743) #### 准备工作 • 安装etcd, mysql, redis • 安装protoc-gen-go ``` GOPROXY=https://goproxy.cn/,direct go get -u github.com/golang/protobuf/protoc-gen-go ``` • 安装goctl工具 ``` GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl ``` • 创建工作目录bookstore • 在bookstore目录下执行go mod init bookstore初始化go.mod #### 编写API Gateway代码 • 在bookstore/api目录下通过goctl生成api/bookstore.api: ``` goctl api -o bookstore.api ``` • 使用goctl生成API Gateway代码 ``` goctl api go -api bookstore.api -dir . ``` 生成的文件结构如下: ``` api ├── bookstore.api // api定义 ├── bookstore.go // main入口定义 ├── etc │ └── bookstore-api.yaml // 配置文件 └── internal ├── config │ └── config.go // 定义配置 ├── handler │ ├── addhandler.go // 实现addHandler │ ├── checkhandler.go // 实现checkHandler │ └── routes.go // 定义路由处理 ├── logic │ ├── addlogic.go // 实现AddLogic │ └── checklogic.go // 实现CheckLogic ├── svc │ └── servicecontext.go // 定义ServiceContext └── types └── types.go // 定义请求、返回结构体 ``` • 启动API Gateway服务,默认侦听在8888端口 ``` go run bookstore.go -f etc/bookstore-api.yaml ``` #### 编写add rpc服务 • 在rpc/add目录下编写add.proto文件 可以通过命令生成proto文件模板 ``` goctl rpc template -o add.proto ``` 修改后文件内容如下: ``` syntax = "proto3"; package add; message addReq { string book = 1; int64 price = 2; } message addResp { bool ok = 1; } service adder { rpc add(addReq) returns(addResp); } ``` • 用`goctl`生成`rpc`代码,在`rpc/add`目录下执行命令 ``` goctl rpc proto -src add.proto -dir . ``` 文件结构如下: ``` rpc/add ├── add.go // rpc服务main函数 ├── add.proto // rpc接口定义 ├── adder │ ├── adder.go // 提供了外部调用方法,无需修改 │ ├── adder_mock.go // mock方法,测试用 │ └── types.go // request/response结构体定义 ├── etc │ └── add.yaml // 配置文件 ├── internal │ ├── config │ │ └── config.go // 配置定义 │ ├── logic │ │ └── addlogic.go // add业务逻辑在这里实现 │ ├── server │ │ └── adderserver.go // 调用入口, 不需要修改 │ └── svc │ └── servicecontext.go // 定义ServiceContext,传递依赖 └── pb └── add.pb.go ``` 直接可以运行,如下: ``` $ go run add.go -f etc/add.yaml Starting rpc server at 127.0.0.1:8080... ``` `etc/add.yaml`文件里可以修改侦听端口等配置