Spring Cloud 网关重定向

Posted

技术标签:

【中文标题】Spring Cloud 网关重定向【英文标题】:Spring cloud gateway redirection 【发布时间】:2021-05-27 09:05:29 【问题描述】:

我有一个简单的要求,就是用新的 uri 替换旧的 uri,这样客户端仍然可以调用旧的 uri

我的 API 网关在 8090 端口上运行,它连接到 Eureka 服务器

这是网关中的属性文件

spring.application.name=api-gateway-server
server.port=8090
eureka.client.serviceUrl.defaultZone=http://localhost:9100/eureka

spring.cloud.gateway.discovery.locator.enabled=true

spring.cloud.gateway.discovery.locator.lower-case-service-id=true

logging.level.root=DEBUG

通过网关的旧 API 是

http://localhost:8090/currency-conversion-service/currency-convertor-feign/from/USD/to/INR/456

'currency-conversion-service' 是 Eureka 中目标应用程序的名称

并且货币转换服务应用程序中的 URI 已更改为

/currency-convertor-v2/from/USD/to/INR/456

来自

/currency-convertor-feign/from/USD/to/INR/456

所以我想要的是当客户端点击 API 网关 URL 时

http://localhost:8090/currency-conversion-service/currency-convertor-feign/from/USD/to/INR/456

请求被重定向到

/currency-convertor-v2/from/USD/to/INR/456

在货币兑换服务中

这是我试图在网关应用程序中编写的代码

package com.kingshuk.springcloudprojects.apigatewayserver;

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;

@Configuration
public class ApiRoutingConfiguration 

    @Bean
    public RouteLocator applicationRouteLocator(RouteLocatorBuilder builder) 
        return builder.routes()
                .route(p -> p.path("/currency-convertor-feign/**")
                        .filters(gatewayFilterSpec -> gatewayFilterSpec
                                .rewritePath("/currency-convertor-feign/(?<remaining>.*)"
                                , "/currency-convertor-v2/$remaining"))
                        .uri("http://currency-conversion-service/"))
                .build();
    

但它不起作用。不断出现错误。 API 网关日志中不会打印任何异常。

我是 spring 云网关的新手,所以如果我能在这方面得到一些帮助,那就太好了。

谢谢

【问题讨论】:

lb://currency-conversion-service/ 试过了...没用...但感谢您的回复 你说“不断出错”,什么错误?和“试过……没用”,发生了什么? 很抱歉给您带来了困惑。我没有在任何地方得到任何异常,只是它没有重定向,我在浏览器中得到了白标签错误页面 您要命中的路径以 /currency-conversion-service/currency-convertor-feign/ 开头,但您的路径谓词不包括该路径 【参考方案1】:

更新:

它现在可以根据spencergibb 的建议进行以下代码调整。感谢您的帮助...!!

@Bean
    public RouteLocator applicationRouteLocator(RouteLocatorBuilder builder) 
        return builder.routes()
                .route(p -> p.path("/currency-conversion-service/currency-convertor-feign/**")
                        .filters(gatewayFilterSpec -> gatewayFilterSpec
                                .rewritePath("/currency-conversion-service/currency-convertor-feign/(?<remaining>.*)"
                                , "/currency-convertor-v2/$remaining"))
                        .uri("lb://currency-conversion-service/"))
                .build();
    

【讨论】:

以上是关于Spring Cloud 网关重定向的主要内容,如果未能解决你的问题,请参考以下文章

尽管设置了承载令牌,但 Spring Cloud Gateway 重定向到 Keycloak 登录页面

Spring Cloud实战小贴士:Zuul处理Cookie和重定向

spring api gateway 不会将我重定向到 keycloak 提供的 spring-cloud-gateway-client url

在 Spring Cloud Gateway 的 oauth2 客户端流中禁用重定向到 oauth2/authorization/registrationId

Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样

Spring boot zuul错误重定向请求