.NET CORE2.2 下 Ocelot+Consul服務發現踩坑記錄


歷史原因,筆者所在公司的項目目前還在使用 .NET CORE 2.2版本,在所有業務應用升級完成服務注冊發現之后,最后剩下 Ocelot 網關服務升級。在升級過程中,遇到一些問題,記錄此文,以便有相同情況的同學參考。

1. Ocelot 升級服務發現

根據官方文檔 ,通過簡單的添加配置,既可以將原有配置方式改為服務發現:

  1. 安裝插件
    Install-Package Ocelot.Provider.Consul 13.5.2,.Net Core 2.x 最后一個版本

  2. 配置服務

s.AddOcelot()
    .AddConsul();
  1. 添加全局配置文件
"ServiceDiscoveryProvider": {
    "Host": "localhost",
    "Port": 8500,
    "Type": "Consul"
}
  1. 配置路由
{
    "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

總結

  1. 在.NET CORE 2.x 版本中,應該采用 13.5.1 以及之前的版本,否則會產生 Node Name 問題。
  2. Ocelot.Provider.Consul 源碼已合並至 Ocelot 主庫 傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM