Spring Cloud Gateway 測試問題解決
本文針對於測試環境SpringCloud Gateway問題解決。
1.背景介紹
本文遇到的問題都是在測試環境真正遇到的問題,不一定試用於所有人,僅做一次記錄,便於遇到同樣問題的幹掉這些問題。
使用版本:SpringCloud 2.0.0.RELEASE
1.1 Gateway配置
之前系統是由阿里雲SLB直接分發到幾臺生產伺服器,但是經過研究,決定在中間加一層閘道器,也就是阿里雲SLB分發流量到Gateway到下游服務。但是又由於種種原因,決定使用Host方式進行攔截處理,以下為部分配置程式碼:
注意,其中部分內容並非真實環境內容,但是場景絕對真實,如:
-
test_client:routes的ID。
-
uri:這裡使用的Eureka內的application name
-
Host:需要攔截的域名
-
filters:域名字首
1.2 Gateway過濾器
過濾器內容如下,稍後介紹:
1.3 下游服務攔截器
下游服務攔截器大致內容如下,這段程式碼是原有的程式碼,這個功能大概就是載入公共的屬性basePath,用於載入靜態資源,比如前端的jquery.js,根據域名判斷,然後選擇是載入為http://127.0.0.1:8080/jquery.js還是https://www.dalaoyang.cn/jquery.js這種:
1.4 下游服務使用者過濾器
這段程式碼也是原有的程式碼,使用者Session過濾器,這個完整內容很多,只擷取遇到問題的片段,大致內容就是判斷使用者是否在其他地方登入,如果登入了就彈出的固定的提示頁面,內容如下:
1.5 跳轉流程
跳轉如下:
1.域名指向了Gateway地址。
2.在瀏覽器使用域名訪問Gateway,被Gateway轉發到下游服務,返回對應響應。
2.問題一 下游服務無法獲取域名
在使用上述配置後,使用request.getServerName()方法已經無法獲取到域名了,經過測試,獲取到的是伺服器的ip地址,導致雖然頁面可以正常跳轉,但是無法獲取到正確的域名,導致靜態資源載入有問題。
在網上請教了很多人,本想看看是不是什麼地方沒有設定對,但是後臺還是採取大多數人的建議,在header中加入一個域名資訊,修改後Gateway過濾器如下:
很容易看到,就是如下這句話:
下游服務過濾修改為:
其實大致內容就是,使用如下方式獲取域名:
到此,問題解決了,大部分內容跳轉正常。
3.問題二 NPE異常
部分請求,經過路由訪問報如下錯誤。
遇到問題後,沒有很慌,打開了百度查了查(微笑)。百度沒讓我很失望,基本上沒啥答覆,然後谷歌了一下,看到了github上的一個issues,大致內容感覺是SpringCloud Gateway 2.0.0.RELEASE版本有些問題,升級一下版本就好了,如圖。
Github issues地址:
https://github.com/spring-cloud/spring-cloud-gateway/issues/429 https://github.com/spring-cloud/spring-cloud-gateway/issues/374
說實話,感覺是版本問題,但是又看到了一篇國人的文章,地址是:http://xiaoqiangge.com/aritcle/1545889008833.html,問題大致類似,加了一下博主的微信,請教了一下,大致瞭解到了,升級了一下版本,問題解決。
感謝小強哥!!!
4.問題三 下游使用者過濾器跳轉失效
問題是這樣的,剛剛介紹了,使用者在其他地方登入會自動跳轉至一個介面提示給使用者,發現問題是無法跳轉。
檢視gateway日誌,大概提示了這樣一句話,如下:
從內容大致可以看出,重定向有問題,想到了在使用者過濾器中最後的重定向,決定在這裡下手,修改後內容如下:
問題也解決了,目前還在踩坑測試中,如果大家有類似經驗可以一起探討。
加入星球特權

1、從前端到後端玩轉Spring Cloud
2 、 實戰分庫分表中介軟體Sharding-JDBC
3、實戰分散式任務排程框架Elastic Job
4、配置中心Apollo實戰
5、高併發解決方案之快取
6、更多課程等你來解鎖,20+課程