当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud网关动态路由

闽朝
2023-03-14

Spring Cloud Gateway真的很新--但它“看起来”很容易。有一个问题我很纠结。我的要求是给路径加上前缀,检查一个头变量,查找基于该变量的URI,然后顺着它前进。

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

header-id=123
uri=http://www.somedestination.com/something/services/v1.0

  @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中,我正在进行更改(log语句看起来很正确--一个...它就是不在那里!

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() );

共有1个答案

戚俊美
2023-03-14
@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);
    }
}
 类似资料:
  • 本文向大家介绍SpringCloud Gateway 利用 Mysql 实现动态路由的方法,包括了SpringCloud Gateway 利用 Mysql 实现动态路由的方法的使用技巧和注意事项,需要的朋友参考一下 需求描述 标准网关动态路由功能是重要的一环,将路由、断言以及过滤器信息,持久化到 Mysql 中,通过配置后台页面实现路由、断言、以及过滤器等配置的增删改查。 Spring Cloud

  • 本文向大家介绍SpringCloud网关Gateway架构解析,包括了SpringCloud网关Gateway架构解析的使用技巧和注意事项,需要的朋友参考一下 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性,典型的架构图如图所示: 安全 ,只有网关系

  • 我可以看到请求消息被加入和出列,响应消息被加入和出列。但我有个例外, 我应该如何检索响应?

  • 本文向大家介绍SpringCloud网关组件zuul实例解析,包括了SpringCloud网关组件zuul实例解析的使用技巧和注意事项,需要的朋友参考一下 1.引入如下依赖 2.启动类添加如下注解 @EnableZuulProxy 原先访问商品服务如下: 通过网关访问:将访问地址改为网关地址,并添加商品服务的服务名称如下: 即完成统一完成由网关进行发送 同时可以在启动类中添加自定义路由映射 这样就

  • 我目前正在用spring cloud gateway替换网飞Zuul的api gateway。该设置对大多数路线使用发现客户端(eureka ),但是我们还有一个solr实例正在运行,它需要手动定义路线(因为solr不支持Eureka) 使用以下配置,使用到在本地主机上运行的solr的静态路由可以很好地工作: 但是,我想为这条路由使用负载平衡的uri,因为我们有多个solr实例。查看留档,我发现实

  • 本文向大家介绍Spring Cloud 网关服务 zuul  动态路由的实现方法,包括了Spring Cloud 网关服务 zuul  动态路由的实现方法的使用技巧和注意事项,需要的朋友参考一下 zuul动态路由 网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。 数据库动态路由基于事件刷新机制热修改zuul的路由属性。 DiscoveryClientRouteLocator