下面是我的網關配置來驗證下Ocelot的問題,如果只是做網關轉發應該還ok,但是要是結合Consul來檢查並健康的轉發有效服務器還是有很多弊端
關鍵在於通過設置 DeregisterCriticalServiceAfter來處理,那么這個值要夠大,如果在這個值內服務器web站點更新正常了就沒有問題,如果一直失敗就會注銷的掉這個服務不回去健康檢查了
下面用代碼來說明下:
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/Check/ocelot", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "192.168.0.233", "Port": 20011 }, { "Host": "192.168.0.233", "Port": 20012 }, { "Host": "192.168.0.233", "Port": 30011 } ], "UpstreamPathTemplate": "/testocelot", "UpstreamHttpMethod": [ "Get" ], "LoadBalancer": "LeastConnection", "ServiceName": "userservices", "UseServiceDiscovery": true } ], "GlobalConfiguration": { "BaseUrl": "http://192.168.0.233:20010", "ServiceDiscoveryProvider": { "Host": "192.168.0.233", "Port": 8500 } } }
網關都是結合consul服務的狀態,那么服務器web網站的consul服務沒有注冊,何來的健康轉發呢?
.NetCore 在 Configure中配置了 consul 服務注冊,但是 web網站都沒有運行起來 consul 服務就不存在 更不存在健康證狀態
那么 利用 ServiceDiscoveryProvider 服務發現的方式來轉發 根本就會失敗
所以感覺還是坑~~~~
當web站點沒有訪問過的時候 Consul服務
訪問web站點
所以 Consul 拿來做服務器健康檢查就行了 結合Ocelot實現LB還是有些牽強(至少第一次注冊服務需要訪問站點),如果能把注冊服務單獨出來不需要放在web站點中就行了
當然訪問之后就可以了
這里三個服務都在了不同的地址