首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Cloud Gateway动态路由

Spring Cloud Gateway动态路由
EN

Stack Overflow用户
提问于 2018-10-27 02:19:44
回答 1查看 6.6K关注 0票数 7

对Spring Cloud Gateway来说真的很新--但它“看起来”很简单。有一个问题是我一直在努力解决的。我的要求是在路径前面加上前缀,检查一个头变量,根据该变量查找URI,然后继续执行。

问题是uri始终是下面的DEFAULT_IMPLEMENTION,即使我在idResolvingGatewayFilter中更改了它。我如何才能做到这一点呢?新的ids可以在任何时候添加-所以这是“动态”部分。因此,在网关过滤器中,我正在读取头部并查找uri (我正在查看的数据源可以随时更新)。但是下面的代码似乎覆盖了我在过滤器中分配的任何内容-如果不提供URI,您就无法做到这一点。例如:

header-id=123

uri=http://www.somedestination.com/something/services/v1.0

header-id=999

uri=http://www.anotherdestination.com/something/services/v1.0

代码语言:javascript
复制
  @Bean
  public RouteLocator rosterRouteLocator( RouteLocatorBuilder builder )
  {
    log.info( "Establishing Gateway Routes" );
    return builder.routes()
        .route( r -> r.path( "/**" ).filters( f -> f.prefixPath( "/something/services/v1.0" ).filter( idResolvingGatewayFilter() ) )
            .uri( resolver.buildDestinationEndpoint( IdUrlResolver.DEFAULT_IMPLEMENTATION ) ) )
        .build();
  }

在idResolvingGatewatFilter中,我进行了更改(并且日志语句看起来是正确的-1...它就是不会出现在那里!)

代码语言:javascript
复制
public Mono<Void> filter( ServerWebExchange exchange, GatewayFilterChain chain )
  {
    try
    {
      URI newUri = buildURI( exchange );
      ServerHttpRequest request = exchange.getRequest().mutate().uri( newUri ).build();
      exchange = exchange.mutate().request( request ).build();
      log.debug( "Modified URI: " + exchange.getRequest().getURI() );
EN

回答 1

Stack Overflow用户

发布于 2019-07-27 14:18:49

代码语言:javascript
复制
@SpringBootApplication
public class SpringCloudGatewayApplication {

    @Autowired
    private CustomerFilter filter;

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

    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {

        return builder.routes().route(p -> p.path("/**").filters(f -> f.filter(filter)).uri("no://op")).build();
    }
}

class CustomerFilter implements GatewayFilter, Ordered {

    @Override
    public int getOrder() {
        return RouteToRequestUrlFilter.ROUTE_TO_URL_FILTER_ORDER + 1;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String newUrl = null;

        if (exchange.getRequest().getHeaders().getHost().toString().equals("localhost:8080")) {
            newUrl = "http://ip1/path1";
        } else {
            newUrl = "http://ip2/path2";
        }

        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, new URI(newUrl));
        return chain.filter(exchange);
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53014301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档