Spring Cloud Gateway 中每个备用请求的 404 错误

Posted

技术标签:

【中文标题】Spring Cloud Gateway 中每个备用请求的 404 错误【英文标题】:404 error in spring cloud gateway for every alternate request 【发布时间】:2020-09-12 11:13:47 【问题描述】:

我在spring cloud gateway中遇到了一个非常奇特的问题。每个备用请求都会返回 404。这发生在我在 api-gateway 中配置的所有服务中,无一例外。我什至不知道从哪里开始调试这个问题。

这是我用于通用配置的 application.yml 文件。

server:
  port: 8080
  ssl:
    enabled: true
    key-store: classpath:keystore.p12
    key-store-password: password
    key-store-type: pkcs12
    key-alias: tomcat

security:
  require-ssl=true:
logging:
  level:
    org:
      springframework:
        cloud.gateway: DEBUG
        http.server.reactive: DEBUG
        web.reactive: DEBUG

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true

这是我的 java 配置文件


@EnableWebFluxSecurity
public class SecurityConfig 

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http,
                                                            ReactiveClientRegistrationRepository clientRegistrationRepository) 
        // Authenticate through configured OpenID Provider
        http.oauth2Login();
        // Also logout at the OpenID Connect provider
        http.logout(logout -> logout.logoutSuccessHandler(new OidcClientInitiatedServerLogoutSuccessHandler(
                clientRegistrationRepository)));
        // Require authentication for all requests
        http.authorizeExchange().anyExchange().authenticated();
        // Allow showing /home within a frame
        http.headers().frameOptions().mode(Mode.SAMEORIGIN);
        // Disable CSRF in the gateway to prevent conflicts with proxied service CSRF
        http.csrf().disable();
        return http.build();
    

这是加载在通用 application.yml 文件之上的特定于 spring 配置文件的配置文件。

spring:
  security:
    oauth2:
      client:
        provider:
          keycloak:
            issuerUri: http://localhost:9080/auth/realms/mylocal
            userNameAttribute: preferred_username
        registration:
          keycloak:
            clientId: api-gateway-client
            clientSecret: abcdefgh-ijkl-mnop-qrst-uvwxyz5d6a9
  cloud:
    gateway:
      default-filters:
        - TokenRelay
      routes:
        - id: news
          uri: http://localhost:8082/news
          predicates:
            - Path= /news/**
        - id: customers
          uri: http://localhost:8083/customers
          predicates:
            - Path= /boards/**
        - id: search
          uri: http://localhost:8085/search
          predicates:
            - Path= /search/**

【问题讨论】:

遇到spring-cloud-gateway同样的问题,你能解决吗? 【参考方案1】:

我遇到了类似的问题。原因是在我的 Eureka 服务器中以相同的应用程序名称注册了多个服务。像这样: Eureka instances screenshot

这些是完全不同的服务,但它们注册在一个应用程序名称下。因此,当通过负载均衡器发出请求时,后者会尝试使用这两个服务 url。一个服务能够正确地处理请求,但另一个服务可能对请求的路径一无所知,这就是返回 404 的原因。

【讨论】:

【参考方案2】:

我知道这是一个老问题......但可能会对未来的读者有所帮助。

嘿,这是我在浏览器中为自己找到的最简单的解决方案 url,而不是 'localhost',提供您的系统名称。

例如: http://hp:8083/SERVICE-NAME/customers/**

还要确保将所有 spring 应用程序命名为大写。

【讨论】:

【参考方案3】:

嘿,我最近也遇到了这个问题,我发现这是负载平衡的问题。确保您尝试联系的微服务的 spring.application.name 都是大写字母(示例),特别是如果您使用 Eureka。 (希望有帮助)

【讨论】:

谢谢。负载均衡器是一个很好的探索途径。你能把你的示例配置放在这里吗?我尝试了大写字​​母的建议,但它不起作用。 您使用的是配置服务器吗?如果是,只需在 bootstrap.properties 或 .yml 中添加以下内容:spring.application.name=MICROSERVICENAME 全部大写,例如:spring.application.name=OAUTH-SERVER 并确保您尝试访问实例使用注释与负载均衡器一起使用:@RibbonClient(name = "OAUTH-SERVER") 如果您使用功能区:) 并遵循相同的示例 有趣的是,您有任何文件或技术参考证明这些名称必须大写吗?我多年来一直使用小写字母,这从来都不是问题。 @PRF 我没有看到通知我现在要尝试找到它,就像刚才一样:) 编辑:“从尤里卡返回的值是大写的......”来源: cloud.spring.io/spring-cloud-static/spring-cloud.html

以上是关于Spring Cloud Gateway 中每个备用请求的 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构之spring cloud gateway

Spring Cloud Gateway的10个经典问题

一篇搞懂Spring Cloud Gateway(从入门到放弃)

Spring Cloud Gateway 服务网关的部署与使用详细介绍

Spring Cloud Gateway 服务网关的部署与使用详细介绍

Spring Cloud Gateway 服务网关的部署与使用详细教程