一、前言

本文将基于以下环境通过Gateway配置动态路由

环境:

  1. spring-boot-dependencies 2.3.2.RELEASE
  2. spring-cloud-dependencies Hoxton.SR8
  3. spring-cloud-alibaba-dependencies 2.2.3.RELEASE
  4. spring-cloud-starter-gateway 2.2.5.RELEASE

二、Gateway配置动态路由

可参考 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#route-metadata-configuration

开启从注册中心动态创建路由的功能,利用服务名进行路由
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true               # 开启从注册中心动态创建路由的功能,利用服务名进行路由
          lower-case-service-id: true # 将请求路径上的服务名配置为小写
方式1: 代码中注入RouteLocator的Bean
@Configuration
public class GatewayRouteLocatorConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        for (String serviceName : GatewayConstant.RPC_SERVICE_NAME_LIST) {
            // 配置路由规则 ex: 当访问地址"http://127.0.0.1:1218/web/api/demo/demo/detail"时会自动转发到地址"http://127.0.0.1:1218/demo/web/api/demo/demo/detail"
            routes.route(serviceName, r -> r
                    .path(String.format("/web/api/%s/**", serviceName))
                    .uri(String.format("lb://%s", serviceName))).build();
        }
        return routes.build();
    }

}
public interface GatewayConstant {

    /**
     * rpc服务名
     */
    List<String> RPC_SERVICE_NAME_LIST = Lists.newArrayList(
            "demo",
            "system",
            "tool"
    );

}
方式2: 在yml配置文件中配置spring.cloud.gateway.routes属性值
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true               # 开启从注册中心动态创建路由的功能,利用服务名进行路由
          lower-case-service-id: true # 将请求路径上的服务名配置为小写
      # 配置动态路由
      routes:
        - id: nacos-consumer           # 唯一路由表示,没有实际作用不重复就好,建议配合服务名
          uri: lb://nacos-consumer     # 匹配后提供服务的路由地址,lb后跟提供服务的微服务的名,不要写错!!!
          predicates:
            - Path=/consumer/*         # 以`consumer`开头的请求都负载到`nacos-consumer`服务
          filters:
            - RewritePath=/consumer/(?<segment>.*),/$\{segment} # 重写请求路径,例如 http://127.0.0.1:18090/consumer/hi -> http://127.0.0.1:18080/hi
        - id: nacos-provider
          uri: lb://nacos-provider
          predicates:
            - Path=/provider/**
          filters:
            - RewritePath=/provider/(?<segment>.*),/$\{segment}
        # demo服务
        - id: demo
          uri: lb://demo
          predicates:
            - Path=/web/api/demo/**  # 所有以“/web/api/demo/**”前缀的请求转发到demo服务上 例如 http://127.0.0.1:1218/web/api/demo/demo/detail ->  http://127.0.0.1:1218/demo/web/api/demo/demo/detail

tips: 两种方式配置值最终会合并处理

三、本文案例demo源码

https://gitee.com/zhengqingya/small-tools


今日分享语句:
你需要跟自己比的唯一一个人,就是以前的自己。你需要比一个人变得更好,那个人就是此刻的你。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐