首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置Spring将web请求转发到内部url

配置Spring将web请求转发到内部url
EN

Stack Overflow用户
提问于 2022-01-01 04:52:16
回答 3查看 699关注 0票数 0

我有一个Spring应用程序,它有以下的Gradle依赖关系:

代码语言:javascript
复制
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-gateway'
implementation 'com.netflix.eureka:eureka-core'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

路由配置:

代码语言:javascript
复制
@Bean
public RouteLocator routes(RouteLocatorBuilder builder, LoggingGatewayFilterFactory loggingFactory) {

    return builder.routes()
            .route("service_route_clients_summary", r -> r.path("c")
                    .filters(f -> f.rewritePath("/api/management/home/clients/summary", "/management/home/clients/summary")
                            .filter(loggingFactory.apply(new LoggingGatewayFilterFactory.Config("My Custom Message", true, true))))
                    .uri("lb://merchant-hub-admin-service:8000/management/home/clients/summary"))
            .build();
}

我希望将/api/management/home/clients/summary转发到内部链接/management/home/clients/summary,但使用Eureka客户端查找内部服务。

当我敲响代码时,什么都没有发生--路径是找不到的。知道有什么不对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-08 00:57:16

对于尤里卡的发现,你可以这样做:

代码语言:javascript
复制
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
          predicates:
            - name: Path
              args:
                pattern: "'/api/'+serviceId.toLowerCase()+'/**'"
          filters:
            - name: RewritePath
              args:
                regexp: "'/api/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
                replacement: "'/${remaining}'"

当然,您需要在主类中使用@EnableDiscoveryClient。如果有兴趣的话,可以看看我的试验恢复

在eureka中,检查/eureka/app,并查看您的服务的元数据。您将看到服务是否有上下文路径。如果没有,上述配置将有效。

如果服务确实有contextPath,则需要在replacement键中使用折叠:

代码语言:javascript
复制
replacement: "{metadata.get('contextPath') != null ? metadata.get('contextPath') : ''} + '/${remaining}'"
票数 1
EN

Stack Overflow用户

发布于 2022-01-05 16:38:47

您可以添加筛选器表达式,这将根据您的要求修剪url。

下面的配置将使url /api/management ==> /management

代码语言:javascript
复制
spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://example.org
        predicates:
        - Path=/api/**
        filters:
        - RewritePath=/api(?<segment>/?.*), /$\{segment}
票数 3
EN

Stack Overflow用户

发布于 2022-01-03 22:43:35

很短的版本中,传递给routes().route的参数是不正确的。

你应该试试这样的方法:

代码语言:javascript
复制
    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p.path(" /api/management/home/clients/summary **")
                        .filters(gatewayFilterSpec -> gatewayFilterSpec
                                .rewritePath("/management/home/clients/summary/(?<remaining>.*)"
                                , "/home/clients//${remaining}"))
                        .uri("lb:///home/clients/summary/"))
                .build();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70547020

复制
相关文章

相似问题

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