歷史原因,筆者所在公司的專案目前還在使用 .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 主庫 傳送門
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/47024.html
標籤:.NET Core
