首页 > 解决方案 > spring cloud gateway - 创建动态 java 路由

问题描述

我像这样创建了我的bean:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder, LoggingGatewayFilterFactory loggingFactory) {
    return builder.routes()
            .route("configuracionApp",
                    r -> r.path("/configuracion")
                    .and().readBody(String.class, requestBody -> true)
                    .filters(
                            f -> f
                            .filter(loggingFactory.apply(new Config("My Custom Message", true, true)))
                            .modifyResponseBody(String.class, String.class, bodyRewrite)
                            )
                    .uri("lb://msapp")
                    )
            .route("configuracionHorario",
                    r -> r.path("/configuracion/horario")
                    .filters(
                            f -> f
                            .filter(loggingFactory.apply(new Config("My Custom Message", true, true)))
                            .modifyResponseBody(String.class, String.class, bodyRewrite)
                            )
                    .uri("lb://msapp")
                    )
            .build();
}

一切都很完美,我唯一的疑问是我是否可以从列表中创建这些路由,并将该列表保存在 yml 文件中,例如,

提前致谢

标签: spring-cloud-gateway

解决方案


我在application.yml中定义了一个路由列表

application:
  routes:
    - 
      id: referential
      path: /referential/**
      uri: https://referential.p.rapidapi.com
    - 
      id: muslimsalat
      path: /muslimsalat/**
      uri: https://muslimsalat.p.rapidapi.com

我定义了一个配置属性类来映射
RouteConfigProperties.java中的属性

import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import lombok.Data;

@Configuration
@ConfigurationProperties(prefix = "application")
@Data
public class RouteConfigProperties 
{
    private List<CustomRoute> routes;

    @Data
    public static class CustomRoute 
    {
        private String id;
        private String path;
        private String uri;
    }

}

最后我在 RouteConfig.java 中定义了我的 GatewayRouteConfig

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder.Builder;

@Configuration
public class RouteConfig {
            
    private final RouteConfigProperties routeConfigProperties;

    public RouteConfig(RouteConfigProperties routeConfigProperties) {
        this.routeConfigProperties = routeConfigProperties;
    }

    @Bean
    RouteLocator staticRoutes(RouteLocatorBuilder builder) 
    {       
        Builder build = builder.routes();
    
        routeConfigProperties.getRoutes().forEach(customRoute -> {
        
             build.route(
                  customRoute.getId(), 
                  route -> route.path(customRoute.getPath())
                  .filters(filter -> filter.addRequestHeader("x-rapidapi-host", String.format("%s.p.rapidapi.com", customRoute.getId()))
                                           .addRequestHeader("x-rapidapi-key", "2bb4b6cd95msh13bd91f0c332909p10dc79jsn9e98442d4457")
                                           .rewritePath(String.format("/%s/(?<segment>.*)", customRoute.getId()), "/${segment}"))
                  .uri(customRoute.getUri()));
        
        });
    
        return build.build();
    }

}

不要忘记启用配置属性:
GatewayServiceApplication.java

import org.sid.gatewayservice.config.RouteConfigProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties({ RouteConfigProperties.class })
public class GatewayServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServiceApplication.class, args);
    }

}

推荐阅读