持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
本文主要涉及网关本身设计实现,其中架构设计可以看我之前分享的文章
内部网关软件架构
原理概述
网关的主要模块由如下几个模块组成
环境配置模块,动态路由模块,负载均衡模块,网关配置模块
动态路由负责根据下发的配置构建网关的路由表,通过路由将请求和微服务串联起来,负载均衡模块决定选择哪些下游节点服务请求. 这两个模块是实现蓝绿,灰度的基础
网关配置模块 实现了 控制API(新增,删除路由), 网关自身参数的配置(SSL, 健康检查,超时...),配置数据的维护
蓝绿发布其实就是通过网关的load balancer根据切换规则把流量导向到某个部署集群环境的过程
下面是蓝绿发布的内部实现流程描述
整个发布流程用到的配置全都保存在 Nacos 中,网关需要用到如下表中的配置,网关提供API修改这些配置。具体说明如下表
配置列表
| 名称 | 说明 |
|---|---|
| gateway.yaml | 网关路由配置文件 |
| publish_env.yaml | 部署环境配置文件 |
| publish_rule.yaml | 发布规则配置文件 |
gateway.yaml
这个配置文件一般很少修改,只有在初始化环境时,或者增加新的微服务时才需要修改这个配置文件
如下配置是一个最精简的配置,表示凡是以 /bcs/开头的请求,都转发到 后端的 bcs-server 这个微服务
spring:
``cloud:
``gateway:
``routes:
``- id: bcs
``uri: lb:``//bcs-server
``predicates:
``- Path=/bcs/**
gateway.yaml路由配置表属性说明
| 名称 | 类型 | 描述 | |||
|---|---|---|---|---|---|
| id | string | 代表微路由的id,需要一个唯一的值,可以和后面的微服务名称保持一致 | |||
| uri | string | 格式为 lb://微服务名称 | |||
| predicate | list | 路由匹配的条件,一般配置 Path 属性即可. 属性名称区分大小写 | 名称 | 类型 | 说明 |
| ---- | ------ | ------------ | |||
| Path | string | 匹配的地址如 /bcs/ |
publish_env.yaml
运维平台需要在初始化环境的时候,调用网关的环境操作接口管理环境配置
deploy.yaml
config:
activate_env: prod1
env_list: # 部署环境列表
-prod1: 生产环境1
-prod1: 生产环境2-备用环境
publish_rule.yaml
配置完环境后,下一步就需要配置蓝绿发布规则, 发布规则使用配置文件 publish_rule.yaml 描述,格式如下
ruleset:
- bytag:
descr: 根据环境标签整体切换
tag_name: prod2 #要切换
match_uri: /*
规则表
| 名称 | 类型 | 说明 |
|---|---|---|
| bytag | map | 表示根据环境标签切换 |
| byiprange | map | 根据IP地址范围切换 |
规则通用的配置属性如下表
| 名称 | 类型 | 说明 |
|---|---|---|
| descr | string | 规则描述 |
| tag_name | string | 要切换的目标环境标签,比如上述配置文件中的 prod2 |
| match_uri | string | 哪些path需要切换流量到指定的tag上去写法支持通配符 * ?/* 代表网关管理的所有path |
可以在此基础上扩展出新的流量调度规则,比如根据ip 地址的范围调度流量的规则 byiprange
byiprange
其配置属性如下表
| 名称 | 类型 | 说明 |
|---|---|---|
| iprange | list | 支持如下写法172.26.0.1-172.26.0.20 指定ip范围的写法172.26.0.1/16 IP CIDR的写法 |
| descr | string | 规则描述 |
| tag_name | string | 要切换的目标环境标签,比如上述配置文件中的 prod2 |
| match_uri | string | 哪些path需要切换流量到指定的tag上去写法支持通配符 * ?/* 代表网关管理的所有path |
运维平台如何使用网关
网关的功能通过API的方式提供出来,运维平台使用网关分为如下几步
- 调用路由初始化接口 初始化路由和微服务的调用关系 这个接口会修改 gateway.yaml文件
- 在创建环境时调用 部署环境接口创建部署环境信息,这个环境信息是和运维平台中的部署环境一一对应的.这个接口会修改 publish_env.yaml中的配置
- 配置对应环境配置参数组时添加如下参数绑定该环境的环境标签. service.instance.metadata.tag=xxx
4.需要切换流量时调用流量调度接口 配置流量调度规则,将流量切换到指定的环境 这个接口会修改 publish_rule.yaml中的配置
接口说明
环境操作接口
- GET /gw/env
查询环境信息 包含生效的主环境
{ "code":"0"
"config": {
"activate_env": "prod1",
"env_list": [
{
"prod1": "生产环境1"
},
{
"prod2": "生产环境2-备用环境"
}
]
}
}
- POST /gw/env/add
添加环境信息
{ "code":"0"
tag: [{"prod1": "生产环境1"}]
}
- POST /gw/env/del?code=prod1 删除环境信息
{
"tag": "prod1"
}
- POST /gw/env/update 更新环境信息
{
"tag": "prod1",
"name": "生产环境2"
}
- /gw/env/switch 切换环境
{
"rule_type": "bytag",
"tag_name": "prod2", //代表根据环境标签进行切换,把所有服务的请求整体切换到标签为prod2的环境
"match_uri": "/*"
}
路由操作接口
- /gw/route/add 添加路由
{ "id":"bcs",
"uri":"lb://bcs-server",
"path":"/bcs/*"
}
- /gw/route/del 删除路由
{
"id":"bcs",
}