相關文章
Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服務注冊,服務發現
Consul+Ocelot+Polly在.NetCore中使用(.NET5)-網關Ocelot+Consul
Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly緩存、限流、熔斷、降級
微服務網關Ocelot加入IdentityServer4鑒權-.NetCore(.NET5)中使用
一、簡介
前一篇Consul中有個問題是,所有客戶端都要和Consul進行連接,且直接拿到了所有的服務實例,這就直接把全部的服務實例暴露出來了,所以需要用網關來隔離客戶端和服務實例,
所有api請求都從網關進入。
Ocelot作為一個網關應用,主要的功能有路由、請求聚合、服務發現、統一認證、統一鑒權、限流熔斷、並內置了負載均衡器等的集成。而且這些功能都只需要簡單的配置即可完成。
二、使用Ocelot
2.1應用配置
新建一個.NetCore項目作網關應用。
安裝NuGet包
Ocelot
Startup.cs中把ConfigureServices(),Configure()里面的代碼都去掉,加上Ocelot接管代碼。
public void ConfigureServices(IServiceCollection services) { services.AddOcelot(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseOcelot(); }
這些操作完,程序就再也不是asp.net core,也不是什么webApi的程序了,就是一個Ocelot網關應用。
2.2路由配置
網關最重要的功能就是路由,根據路由把功能轉發到其它應用去,它本身的應用有ip地址,別人可能訪問它,但它怎么知道哪個請求轉到哪個應用去呢,這些全靠配置。
首先在 Program.cs里的CreateHostBuilder()加入配置文件信息
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(c => { c.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
根目錄下增加配置文件ocelot.json。
{ "Routes": [ { //轉發到下游服務地址--url變量 "DownstreamPathTemplate": "/api/{url}", //下游http協議 "DownstreamScheme": "http", //負載方式, "LoadBalancerOptions": { "Type": "RoundRobin" // 輪詢 }, "DownstreamHostAndPorts": [ { "Host": "172.16.2.9", "Port": 5201 //服務端口 }, //可以多個,自行負載均衡 { "Host": "172.16.2.9", "Port": 5202 //服務端口 }, { "Host": "172.16.2.9", "Port": 5203 //服務端口 } ], //上游地址 "UpstreamPathTemplate": "/T1/{url}", //網關地址--url變量 //沖突的還可以加權重Priority "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ] } ] }
這里的是路由配置,注釋說明已經很清楚,假如網關程序啟動后的地址為http://172.16.2.9:5200
當訪問:http://172.16.2.9:5200/T1/Test/GetName 網關會把請求轉發到http://172.16.2.9:5201/api/Test/GetName,http://172.16.2.9:5202/api/Test/GetName,http://172.16.2.9:5203/api/Test/GetName,根據負載算法決定轉發規則。
LoadBalancer是來決定負載的算法
-
LeastConnection:將請求發往最空閑的那個服務器
-
RoundRobin:輪流轉發
-
NoLoadBalance:總是發往第一個請求或者是服務發現
Routes里面可以配多個路由轉發。
2.3驗證
在前面的Consul注冊的程序中(5201,5202,5203端口程序)加入一個接口
[Route("api/[controller]/[action]")] public class TestController : Controller { private IConfiguration _configuration; public TestController(IConfiguration configuration) { _configuration = configuration; } public IActionResult GetName() { string port = _configuration["port"]; return Json($"端口:{port},姓名:張三"); } }
啟動Ocelot的網關程序,端口為5200
訪問地址:http://ip:5200/T1/Test/GetName
刷新一下
可以看到,已經成功轉發到上面配置好的路由地址。
2.4Ocelot結合Consul進行服務發現
上面的示例是沒有經過Consul的,是直接轉發到相應地址,這顯然又面臨了服務地址管理的問題了,所以需要結合Consul自動發現服務的地址。
把ocelot.json的文件加入consul配置信息
{ "Routes": [ { //轉發到下游服務地址--url變量 "DownstreamPathTemplate": "/api/{url}", //下游http協議 "DownstreamScheme": "http", //負載方式, "LoadBalancerOptions": { "Type": "RoundRobin" // 輪詢 }, //"DownstreamHostAndPorts": [ // { // "Host": "172.16.2.9", // "Port": 5201 //服務端口 // }, //可以多個,自行負載均衡 // { // "Host": "172.16.2.9", // "Port": 5202 //服務端口 // }, // { // "Host": "172.16.2.9", // "Port": 5203 //服務端口 // } //], //上游地址 "UpstreamPathTemplate": "/T1/{url}", //網關地址--url變量 //沖突的還可以加權重Priority "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ], "UseServiceDisConvery": true, //使用服務發現 "ServiceName": "api"//Consul服務名稱 } ], "GlobalConfiguration": { //Ocelot應用地址 "BaseUrl": "http://172.16.2.9:5200", "ServiceDiscoveryProvider": { //Consul地址 "Host": "172.16.2.84", //Consul端口 "Port": 8500, "Type": "Consul"//由Consul提供服務發現,每次請求Consul } } }
可以看到,這里已經把寫死的下游地址去掉了,加入了Consul的信息。
安裝NuGet包
Ocelot.Provider.Consul
Startup.cs中ConfigureServices(IServiceCollection services)加入.AddConsul();
public void ConfigureServices(IServiceCollection services) { services.AddOcelot() .AddConsul(); }
配置完成,驗證效果,啟動項目。
再次訪問http://ip:5200/T1/Test/GetName
刷新一下
控制台信息
到這就已經成功完成 Ocelot+Consul的網關和服務發現功能了。
源碼地址:https://github.com/weixiaolong325/Ocelot-Consul-Polly-Id4.Demo