Spring Cloud Gateway结合Nacos配置动态路由

232 阅读1分钟

背景介绍: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,增加一个版本号用来区分不同的服务实例 在网关层的配置可以采用两种方式:

  1. 针对/service-a/**/service-a/v2/**分别配置对应的routers
  2. 在配置全局RewritePath情况下,- Path= /service-a/v2/**需要增加一个order的配置,这个值越小,优先级越高,也即是/service-a/v2/** > /service-a/**优先被执行