簡體   English   中英

部署在 GCP App Engine 中的 Spring Cloud Gateway 靈活導致無限重定向循環

[英]Spring cloud gateway deployed in GCP App engine flexible causes infinite redirect loop

我在 GCP 應用引擎中運行了兩個服務; 假設服務A和B,然后我部署了一個spring cloud gateway服務,根據路徑謂詞將外部流量路由到這兩個服務。 服務 A 和 B 部署在靈活的應用引擎中。 最初,我將網關靈活地部署在應用引擎中,並且運行良好。 因為我們有一些批處理服務的響應時間超過 10 分鍾(應用引擎標准的最大響應超時為 10 分鍾),我們不得不決定將網關遷移到靈活的應用引擎。

網關服務是 dockerized 並在 8080 端口運行。我的 app.yaml 如下所示:

runtime: custom
env: flex

service: beta-gateway

env_variables:
  SPRING_PROFILES_ACTIVE: "beta"

resources:
  cpu: 1
  memory_gb: 2

liveness_check:
  path: "/actuator/health"
  check_interval_sec: 30
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2
  initial_delay_sec: 300

readiness_check:
  path: "/actuator/health"
  check_interval_sec: 5
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2
  app_start_timeout_sec: 300

服務部署正確,執行器端點完美運行,我調用/actuator/gateway/routes端點並且路由配置看起來不錯(並且我使用 appshot dns uri 將其路由到服務 A 和 B;不是最好的方法應該將來使用服務注冊表)。

問題:問題是對於執行器端點以外的任何端點,請求都會進入重定向(302)循環並最終失敗。

我嘗試了什么:

如上所述,我調用了 /actuator/gateway/routes 端點,並且路由配置看起來不錯。 我為網關啟用了 TRACE 日志記錄,我看到路由與服務 A 或 B 的應用程序 dns url 正確匹配。

我不太確定它是否相關,但我最初使用指定端口綁定的網絡設置進行了部署

network:
  name: default
  forwarded_ports:
    - 80:8080

然后我了解到與 8080 的綁定是默認完成的,並將其刪除。

任何建議將不勝感激。 謝謝!

出現此問題的原因是,即使從瀏覽器到 GCP 應用引擎的負載均衡器的流量是安全的 (HTTP),從負載均衡器到實例的流量也是 http,因為它們是內部流量。

從這一點開始,網關使用 X-Forwarded-Proto 作為 HTTP(而不是 HTTPS)將請求轉發到下游 api,然后是 dowsteam API,因為它應該發送重定向請求(302),要求客戶端訪問端點使用安全連接 (HTTPS)。 收到 302 狀態后,客戶端/瀏覽器再次發送請求,並且 SSL 終止發生在負載均衡器上,循環繼續。

解決方法是:

  • server.forward-headers-strategy屬性設置為NATIVE ,以使 tomcat 服務器能夠處理轉發標頭。

  • server.tomcat.redirect-context-root設置為false ,以使 tomcat 服務器在重定向之前遵守 X-Forwarded-* 標頭。

遇到下面提到的解釋這一點的讀物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM