Api网关:架构设计

300 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前言

网关是微服务架构中重要的中间件组件,对外发布内部微服务,提供服务路由,灰度,蓝绿发布,熔断和限流能力

架构

image.png

灰度发布

灰度发布,是在生产环境稳定集群之外,额外部署一个小规模的灰度集群,并通过流量控制,引入部分流量到灰度集群,进行生产全量发布前的灰度验证。如果验证失败,可立刻将所有流量切回至稳定集群,取消灰度发布过程;如果验证成功,则将新版本进行全量发布升级至生产环境稳定集群,完成灰度发布过程

image.png

基于医院使用的特殊情况,有自己特色的灰度发布流程。

有如下场景

科室灰度

医院的科室一般分配有固定的IP地址段,比如下表

科室名称IP段
门诊科室1192.168.1.1-192.168.1.3
门诊科室2192.168.1.4-192.168.1.20

门诊需要灰度新功能,需要做到新功能只对门诊科室1开放, 这个时候的灰度发布流程如下

  1. 启动新的灰度实例,并对启动实例打上灰度 tag ,如  gray-feature-v1

  2. 服务启动后注册自己的metadata(tag=gray-feature-v1)信息到服务注册中心

  3. 在网关配置路由规则,把 192.168.1.1-192.168.1.3 (科室1)这个来源地址段的请求路由至带有此标签的微服务实列

  4. 灰度验证。查看新的灰度请求是否路由至指定的微服务实例

  5. 灰度取消。如果在灰度验证过程中发现了问题,灰度取消可秒级将全部流量切回稳定集群,具体包括两个步骤:删除路由规则和灰度集群下线。当然,用户也可先通过修改规则的方式(如店铺列表置空或请求百分比置0),先将流量切回稳定集群,然后保留现场,方便进行问题排查。

  6. 全量发布。如果灰度验证没有发现问题,那么就可以进行新版本的全量发布了。包括:稳定集群全量发布、删除灰度路由规则和灰度集群下线

  7.  灰度发布结束

具体如图所示

image.png

流程图:

image.png

分组灰度

cpoe-server 可以同时处理门诊和住院的医嘱服务调用,现场可以做如下部署,默认情况下,发往 /cpoe/*的请求会平均分配到这四个实例上面去

实例用例
192.168.20.1cpoe-server-1
192.168.20.2cpoe-server-2
192.168.20.3cpoe-server-3
192.168.20.4cpoe-server-4

\

希望可以做到流量分组,由门诊工作站发出的医嘱请求路由至 192.168.20.1 - 192.168.20.2 节点,住院的医嘱请求发往 192.168.20.3-192.168.20.4 节点

具体流程如下

  1. cpoe-server-1 和  cpoe-server-2 实例启动前,打上 tag ,如  env.dept=门诊
  2. cpoe-server-3 和  cpoe-server-4 实例启动前,打上 tag ,如  env.dept=住院
  3. 配置路由规则,匹配请求头中的来源path 如 systemUri = 门诊 | 住院  ,这类请求路由至已经注册的微服务实例

蓝绿发布

蓝绿发布,是在生产环境稳定集群之外,额外部署一个与稳定集群规模相同的新集群,并通过流量控制,逐步引入流量至新集群直至100%,原先稳定集群将与新集群同时保持在线一段时间,期间发生任何异常,可立刻将所有流量切回至原稳定集群,实现快速回滚。直到全部验证成功后,下线老的稳定集群,新集群成为新的稳定集群

image.png

发布流程如下

  1. 准备两个环境 Blue, Green 环境
  2. Blue环境的实例启动是打tag 为 env.group=Blue, Green环境的实例启动打tag为 env.group=Green
  3. 配置路由规则,设至Blue 环境的流量权重为 100%, Green 环境的流量权重为 0
  4. 此时流量会全部流向Blue 环境,Green作为备用环境
  5. 升级或修复时,在Green环境进行升级,升级完成无误后切换Green 环境流量weight 为 100%,Blue 环境weight 为 0%。
  6. 继续升级Blue 环境,等待下一次切换

流程图:

image.png

网关与运维平台结合

网关需要提供标准的API 供外部访问,一般需要提供如下接口

  1. 查看服务分组
  2. 设置分组权重
  3. 切换服务分组
  4. 增加路由规则