go-zero 实战 - Food API Gateway

308 阅读3分钟

我们通过一个系列文章跟大家详细展示一个 go-zero 微服务实例,整个系列分十三篇文章,目录结构如下:

  1. go-zero 实战 - 服务划分与项目创建
  2. go-zero 实战 - User API Gateway
  3. go-zero 实战 - User Login
  4. go-zero 实战 - User Register
  5. go-zero 实战 - User Userinfo
  6. go-zero 实战 - Food API Gateway
  7. go-zero 实战 - Food Search
  8. go-zero 实战 - Food AddFood
  9. go-zero 实战 - Food DeleteFood
  10. go-zero 实战 - Food Foodlist
  11. go-zero 实战进阶 - rpc 服务
  12. go-zero 实战进阶 - 用户管理 rpc 服务
  13. go-zero 实战进阶 - 食材管理 rpc 服务

期望通过本系列文章带你在本地利用 go-zero 快速开发一个《食谱指南》系统,让你快速上手微服务。

API 概述

食材管理服务中包含四个 API,分别为 SearchAddFood DeleteFoodFoodList,其中 AddFood DeleteFoodFoodList 请求需要做 jwt 鉴权处理。下面我们分别梳理一下四个 API 的请求体和响应体。

  • 食材搜索接口(search)
请求参数类型说明是否必传
keystring搜索关键字
响应字段类型说明
idstring食物 ID
namestring食物名称
proteinstring食物蛋白质含量
fatstring食物脂肪含量
carbohydratestring食物碳水化合物含量
caloriestring食物卡路里
mineralsstring食物矿物质含量
calciumstring食物钙含量
phosphorusstring食物磷含量
ironstring食物铁含量
purinestring食物嘌呤含量
  • 食材新增接口(addfood)
请求参数类型说明是否必传
foodIdstring食物 ID
响应字段类型说明
.........
  • 食材删除接口(deletefood)
请求参数类型说明是否必传
foodIdstring食物 ID
响应字段类型说明
.........
  • 我的食材接口(foodlist)
请求参数类型说明是否必传
.........
响应字段类型说明
listarray食材列表
- idstring食物 ID
- namestring食物名称
- proteinstring食物蛋白质含量
- fatstring食物脂肪含量
- carbohydratestring食物碳水化合物含量
- caloriestring食物卡路里
- mineralsstring食物矿物质含量
- calciumstring食物钙含量
- phosphorusstring食物磷含量
- ironstring食物铁含量
- purinestring食物嘌呤含量

Food API Gateway 创建

我们将从本篇开始编写 Food API Gateway,创建方式与 User API Gateway 类似。

创建 food.api 文件

cdFoodGuides/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》