背景介绍:Spring Cloud Gateway做为接入业务的统一层,主要是用来鉴权、校验参数、黑白名单等功能。后端采用多个微服务部署,nacos作为服务的注册发现中心以及服务的配置中心。完成服务的注册发现以及路由转发。
前提条件
整体服务架构师微服务方式部署
- 业务网关采用spring cloud gateway
- 服务注册与发现采用阿里开源的nacos
- 后端每个服务都在访问路径配置服务名,例如service-a,则其访问路径为
/service-a/v1/test
Spring Cloud Gateway中的bootstrap.yml配置
spring:
profiles: local
cloud:
nacos:
username: test
password: test
config:
server-addr: 127.0.0.1:8848
namespace: 695b5c44-ee06-4e50-865b-940907e521a3
extension-configs[0]:
data-id: common-config.yml
refresh: true
file-extension: yml
gateway:
discovery:
locator:
enabled:true
filters:
- name: RewritePath
args[regexp]: "'/' + serviceId + '/(?.*)'"
args[replacement]: "'/' + serviceId + '/${remaining}'"
routes:
- id: service-a
uri: lb://service-a
order: -1
predicates:
- Path= /service-a/v2/**
特殊需求
由于业务历史包袱,需要将service-a拆分成两个服务,但是路径的第一级别都是service-a,此时如果采用原来的方式,则访问则出现异常
解决方案:
将service-a拆分出来的新的服务的content-path配置成/service-a/v2,增加一个版本号用来区分不同的服务实例 在网关层的配置可以采用两种方式:
- 针对
/service-a/**和/service-a/v2/**分别配置对应的routers - 在配置全局RewritePath情况下,
- Path= /service-a/v2/**需要增加一个order的配置,这个值越小,优先级越高,也即是/service-a/v2/**>/service-a/**优先被执行