我们通过一个系列文章跟大家详细展示一个 go-zero
微服务实例,整个系列分十三篇文章,目录结构如下:
- go-zero 实战 - 服务划分与项目创建
- go-zero 实战 - User API Gateway
- go-zero 实战 - User Login
- go-zero 实战 - User Register
- go-zero 实战 - User Userinfo
- go-zero 实战 - Food API Gateway
- go-zero 实战 - Food Search
- go-zero 实战 - Food AddFood
- go-zero 实战 - Food DeleteFood
- go-zero 实战 - Food Foodlist
- go-zero 实战进阶 - rpc 服务
- go-zero 实战进阶 - 用户管理 rpc 服务
- go-zero 实战进阶 - 食材管理 rpc 服务
期望通过本系列文章带你在本地利用 go-zero
快速开发一个《食谱指南》系统,让你快速上手微服务。
API 概述
食材管理服务中包含四个 API,分别为 Search
, AddFood
DeleteFood
和 FoodList
,其中 AddFood
DeleteFood
和 FoodList
请求需要做 jwt
鉴权处理。下面我们分别梳理一下四个 API 的请求体和响应体。
请求参数 | 类型 | 说明 | 是否必传 |
---|
key | string | 搜索关键字 | 是 |
响应字段 | 类型 | 说明 |
---|
id | string | 食物 ID |
name | string | 食物名称 |
protein | string | 食物蛋白质含量 |
fat | string | 食物脂肪含量 |
carbohydrate | string | 食物碳水化合物含量 |
calorie | string | 食物卡路里 |
minerals | string | 食物矿物质含量 |
calcium | string | 食物钙含量 |
phosphorus | string | 食物磷含量 |
iron | string | 食物铁含量 |
purine | string | 食物嘌呤含量 |
请求参数 | 类型 | 说明 | 是否必传 |
---|
foodId | string | 食物 ID | 是 |
请求参数 | 类型 | 说明 | 是否必传 |
---|
foodId | string | 食物 ID | 是 |
响应字段 | 类型 | 说明 |
---|
list | array | 食材列表 |
- id | string | 食物 ID |
- name | string | 食物名称 |
- protein | string | 食物蛋白质含量 |
- fat | string | 食物脂肪含量 |
- carbohydrate | string | 食物碳水化合物含量 |
- calorie | string | 食物卡路里 |
- minerals | string | 食物矿物质含量 |
- calcium | string | 食物钙含量 |
- phosphorus | string | 食物磷含量 |
- iron | string | 食物铁含量 |
- purine | string | 食物嘌呤含量 |
Food API Gateway 创建
我们将从本篇开始编写 Food API Gateway
,创建方式与 User API Gateway
类似。
创建 food.api
文件
cd
到 FoodGuides/service/foodmanage/api
目录下,执行如下命令创建 food.api
文件。
$ goctl api -o food.api
Done.
定义 api
服务
$ vim foodmanage/api/food.api
syntax = "v1"
info (
title: "Food Api"
desc: "食材管理服务相关 API"
author: "DESKTOP-4T5UKHP/Owner"
email: "renpanpan1990@163.com"
)
type (
SearchRequest {
Key string `json:"key"`
}
SearchResponse {
FoodReply
}
)
type (
AddFoodRequest {
FoodId string `json:"foodId"`
}
AddFoodResponse {
}
)
type (
DeleteFoodRequest {
FoodId string `json:"foodId"`
}
DeleteFoodResponse {
}
)
type FoodReply {
Id string `json:"id"`
Name string `json:"name"`
Protein string `json:"protein"`
Fat string `json:"fat"`
Carbohydrate string `json:"carbohydrate"`
Calorie string `json:"calorie"`
Minerals string `json:"minerals"`
Calcium string `json:"calcium"`
Phosphorus string `json:"phosphorus"`
Iron string `json:"iron"`
Purine string `json:"purine"`
}
type FoodListResponse {
List []FoodReply `json:"list"`
}
service food-api {
@handler Search
post /food/search(SearchRequest) returns(SearchResponse)
}
@server(
jwt: Auth
)
service food-api {
@handler AddFood
post /food/addfood (AddFoodRequest) returns(AddFoodResponse)
@handler DeleteFood
post /food/deletefood (DeleteFoodRequest) returns(DeleteFoodResponse)
@handler FoodList
post /food/foodlist returns(FoodListResponse)
}
运行 goctl api 命令,生成 food-api
服务
$ goctl api go -api food.api -dir .
Done.
查看一下 foodmanage/api
目录
➜ foodmanage/api:
$ tree
.
├── etc
│ └── food-api.yaml
├── food.api
├── food.go
└── internal
├── config
│ └── config.go
├── handler
│ ├── addfoodhandler.go
│ ├── deletefoodhandler.go
│ ├── foodlisthandler.go
│ ├── routes.go
│ └── searchhandler.go
├── logic
│ ├── addfoodlogic.go
│ ├── deletefoodlogic.go
│ ├── foodlistlogic.go
│ └── searchlogic.go
├── svc
│ └── servicecontext.go
└── types
└── types.go
编辑 food-api.yaml
文件,增加 Jwt
鉴权
$ vim foodmanage/api/etc/food-api.yaml
Name: food-api
Host: 0.0.0.0
Port: 8889
Auth:
AccessSecret: ad879037-d3fd-tghj-112d-6bfc35d54b7d
AccessExpire: 86400
启动服务
$ go run food.go -f etc/food-api.yaml
Starting server at 0.0.0.0:8889...
这样 Food API Gateway
就初步完成了。下一篇我们将搭建 食材搜索
接口。
上一篇《go-zero 实战 - User Userinfo》
下一篇《go-zero 实战 - Food Search》