歷史原因,筆者所在公司的項目目前還在使用 .NET CORE 2.2版本,在所有業務應用升級完成服務註冊發現之後,最後剩下 Ocelot 網關服務升級。在升級過程中,遇到一些問題,記錄此文,以便有相同情況的同學參考。 1. Ocelot 升級服務發現 "根據官方文檔" ,通過簡單的添加配置,既可以將 ...
歷史原因,筆者所在公司的項目目前還在使用 .NET CORE 2.2版本,在所有業務應用升級完成服務註冊發現之後,最後剩下 Ocelot 網關服務升級。在升級過程中,遇到一些問題,記錄此文,以便有相同情況的同學參考。
1. Ocelot 升級服務發現
根據官方文檔 ,通過簡單的添加配置,既可以將原有配置方式改為服務發現:
-
安裝插件
Install-Package Ocelot.Provider.Consul 13.5.2,.Net Core 2.x 最後一個版本 -
配置服務
s.AddOcelot()
.AddConsul();
- 添加全局配置文件
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
}
- 配置路由
{
"DownstreamPathTemplate": "/api/values}",
"DownstreamScheme": "https",
"UpstreamPathTemplate": "/spider/api/values",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "spider",
"LoadBalancerOptions": {
"Type": "LeastConnection"
},
}
2. 問題產生
簡單的幾個步驟,Ocelot 升級完成,然而經過測試,卻發現 Ocelot 並沒有向我們預期那樣,路由到後端的服務,而是報如下錯誤:
剛開始以為是配置問題,直到將日誌級別調至 Debug,查看更加詳細的日誌才發現,下游請求的 URL 拼接有問題。
具體來說,就是 Ocelot 採用了 Consul 服務節點的 Node Name,而不是節點上對應的該服務的 IP 地址。
既然問題定位到,那麼翻閱源碼應該可以找到原因,首先根據 nuget 包信息導航到 https://github.com/ThreeMammals/Ocelot.Provider.Consul 地址查看 Provider 源碼,經過載入調試,發現居然是正常的,但是有個疑問是,這個源碼倉庫中只有最早期的幾個版本tag,後續版本都沒有,經過查找,原來後續版本均已合併到 Ocelot 主庫中,而 Nuget 包中的項目URL 並未更新,汗!
既然問題跟版本有關,就翻閱了一下 Issue 列表,還真找到了問題,而且看問題下麵的討論,踩坑的人應該不少。具體原因請直接參看以下鏈接:
https://github.com/ThreeMammals/Ocelot/issues/954
總結
- 在.NET CORE 2.x 版本中,應該採用 13.5.1 以及之前的版本,否則會產生 Node Name 問題。
- Ocelot.Provider.Consul 源碼已合併至 Ocelot 主庫 傳送門