ASP.NET Core3.1 Ocelot負載均衡的實現
1.負載均衡
Ocelot可以在每個路由的可用下游服務中實現負載均衡,這使我們更有效地選擇下游服務來處理請求。負載均衡型別:
- LeastConnection:根據服務正在處理請求量的情況來決定哪個服務來處理新請求,即將新請求傳送到具有最少現有請求的服務去處理。演算法狀態沒有分佈在Ocelot叢集中。
- RoundRobin:遍歷可用服務併發送請求。演算法狀態沒有分佈在Ocelot叢集中。
- NoLoadBalancer:從配置或服務發現中獲取第一個可用服務來處理新請求。
- CookieStickySessions:通過使用Cookie,確保特定的請求能夠被分配到特定的服務上進行處理。
在Ocelot負載均衡專案示例中,通過閘道器專案的路由LoadBalancerOptions選項可以配置負載均衡型別:
{ "Routes": [ { //下游路由服務地址 "DownstreamPathTemplate": "/api/values",//下游服務地址訪問協議型別http或者https "DownstreamScheme": "http",//下游服務的主機和埠 "DownstreamHostAndPorts": [ { "Host": "localhost","Port": 9001 },{ "Host": "localhost","Port": 9002 } ],//上游服務地址,即下游服務真實訪問地址 "UpstreamPathTemplate": "/",//負載均衡型別:輪詢 "LoadBalancerOptions": { "Type": "RoundRobin" },//上游服務HTTP請求方式,例如Get、Post "UpstreamHttpMethod": [ "Get" ] } ] }
新請求通過上游訪問下游服務的時候,Ocelot會根據LoadBalancerOptions負載均衡選項型別來分發到具體下游服務。
2.服務發現
下面展示如何使用服務發現來設定路由:
{ "DownstreamPathTemplate": "/api/posts/{postId}","DownstreamScheme": "https","UpstreamPathTemplate": "/posts/{postId}","UpstreamHttpMethod": [ "Put" ],"ServiceName": "product","LoadBalancerOptions": { "Type": "LeastConnection" } }
設定此選項後,Ocelot將從服務發現提供程式中查詢下游主機和埠,並在所有可用服務中進行負載平衡請求。如果您從服務發現提供者(領事)中新增和刪除服務,Ocelot會停止呼叫已刪除的服務,並開始呼叫已新增的服務。後續學習服務發現這塊知識點時候會重新再講解。
3.專案演示
3.1APIGateway專案
該專案通過LoadBalancerOptions配置選項定義服務負載均衡請求機制,事例專案使用的負載均衡型別是RoundRobin,在Program新增Ocelot支援程式碼如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) //.UseStartup<Startup>() .UseUrls("http://*:9000") .ConfigureAppConfiguration((hostingContext,config) => { config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) //新增Ocelot配置檔案 .AddJsonFile("configuration.json") .AddEnvironmentVariables(); }) .ConfigureServices(s => { //新增Ocelot服務; s.AddOcelot(); }) .Configure(a => { //使用Ocelot a.UseOcelot().Wait(); });
3.2APIServicesA和APIServicesB下游服務專案
APIServicesA和APIServicesB專案分別新建兩個GET請求方法,程式碼分別如下:
//APIServicesA [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public string Get() { return "From APIServiceA"; } } //APIServicesB [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public string Get() { return "From APIServiceB"; } }
通過dotnet run命令啟動APIGateway專案(閘道器層)
dotnet run --project APIGateway專案路徑\APIGateway.csproj
通過dotnet run命令啟動APIServicesA專案
dotnet run --project APIGateway專案路徑\APIGateway.csproj
通過dotnet run命令啟動APIServicesB專案
dotnet run --project APIServicesB專案路徑\APIServicesB.csproj
通過瀏覽器檢視輪詢分發給下游服務返回的結果:
負載均衡輪詢分發下游服務成功。
4.自定義負載均衡
Ocelot支援自定義負載均衡的方法。自定義負載均衡的類需要繼承ILoadBalancer介面類,下面我們定義一個簡單的負載均衡迴圈輸出下游服務的示例:
public class CustomLoadBalancer : ILoadBalancer { private readonly Func<Task<List<Service>>> _services; private readonly object _lock = new object(); private int _last; public CustomLoadBalancer(Func<Task<List<Service>>> services) { _services = services; } public async Task<Response<ServiceHostAndPort>> Lease(HttpContext httpContext) { var services = await _services(); lock (_lock) { if (_last >= services.Count) { _last = 0; } var next = services[_last]; _last++; return new OkResponse<ServiceHostAndPort>(next.HostAndPort); } } public void Release(ServiceHostAndPort hostAndPort) { } }
在Ocelot中註冊此類:
Func<IServiceProvider,DownstreamRoute,IServiceDiscoveryProvider,CustomLoadBalancer> loadBalancerFactoryFunc = (serviceProvider,Route,serviceDiscoveryProvider) => new CustomLoadBalancer(serviceDiscoveryProvider.Get); s.AddOcelot().AddCustomLoadBalancer(loadBalancerFactoryFunc);
最後在路由的LoadBalancerOptions配置選項上修改為CustomLoadBalancer自定義負載均衡類名:
"LoadBalancerOptions": { "Type": "CustomLoadBalancer" }
執行專案除錯檢視結果:
第一次請求時候分發到APIServicesA專案。
第二次請求時候分發到APIServicesB專案。
從上面結果來看,自定義負載均衡成功。
參考文獻:
Ocelot官網
到此這篇關於ASP.NET Core3.1 Ocelot負載均衡的實現的文章就介紹到這了,更多相關ASP.NET Core3.1 Ocelot負載均衡內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!