通過上篇我們知道,閘道器是外部訪問的統一入口,本文采用Ocelot作為Api閘道器。
環境要求:
-
vs2019
-
.NetCore3.1
-
Ocelot16.0.1
建立一個產品服務Api站點(AAStore.ProductCatalog.Api)
新增一個ProductController
[Route("api/[controller]")] [ApiController] public class ProductController : ControllerBase { [HttpGet(template:"Get")] public string GetProductById() { return "Product service"; } }
執行瀏覽
然後再建立一個訂單服務Api站點(AAStore.Orde.Api)
新增一個OrderController
[Route("api/[controller]")] [ApiController] public class OrderController : ControllerBase { [HttpGet(template:"Get")] public string GetOrder() { return "Order Service"; } }
執行瀏覽
兩個服務已經已經準備好了,最後建立一個閘道器站點(AAStore.WebApiGateway)
-
安裝Ocelot
建立一個json配置檔案(ocelot.json)
{ "Routes": [ { "DownstreamPathTemplate": "/api/Product/get", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8081 } ], "UpstreamPathTemplate": "/api/Product/{everything}", "UpstreamHttpMethod": [ "Get" ] }, { "DownstreamPathTemplate": "/api/Order/get", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8082 } ], "UpstreamPathTemplate": "/api/Order/get", "UpstreamHttpMethod": [ "Get" ] } ] }
ocelot api閘道器的主要功能是接收傳入的HTTP請求並將其轉發到下游服務,目前作為一個HTTP請求。Ocelot將一個請求到另一個請求的路由描述為Routes。
DownstreamPathTemplate、Scheme 和 DownstreamHostAndPorts 構成要將此請求轉發到的內部微服務 URL。
埠是服務使用的內部埠。使用容器時,在其 dockerfile 中指定埠。Host 是一個服務名稱,取決於使用的服務名稱解析。使用 docker-compose 時,服務名稱由 Docker 主機提供,它使用 docker-compose 檔案中提供的服務名稱。如果使用 Kubernetes 或 Service Fabric 等業務流程協調程式,則應通過每個業務流程協調程式提供的 DNS 或名稱解析來解析該名稱。
DownstreamHostAndPorts 是一個陣列,包含要將請求轉發到的任何下游服務的主機和埠。通常這隻包含一個條目,但有時可能想要將均衡請求載入到下游服務,而通過 Ocelot 即可新增多個條目,然後選擇負載均衡器。但是如果使用 Azure 和任何業務流程協調程式,那麼通過雲和業務流程協調程式基礎結構進行負載均衡可能會更好。
UpstreamPathTemplate 是一個 URL,Ocelot 將其用來識別用於客戶端中給定請求的 DownstreamPathTemplate。最後,使用了 UpstreamHttpMethod,因此 Ocelot 可區分對相同 URL 的不同的請求(GET、POST、PUT)。
注意: ocelot16.x版本之後的配置節點寫為Routes,而非ReRoutes 否則會報錯(Failed to mat ch Route configuration for upstream path)。
-
在Program.cs 通過AddJsonFile方法向生成器提供ocelot.json檔案、新增Ocelot服務(AddOcelot)和新增ocelot中介軟體(UseOcelot)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("ocelot.json") .AddEnvironmentVariables(); ; }) .ConfigureServices(services => { services.AddOcelot(); services.AddHttpContextAccessor(); }) .Configure(app => { app.UseOcelot().Wait(); }); });
然後執行閘道器,通過閘道器訪問產品、訂單微服務:
如果運氣好的話,跟著一步一步做,你也可以執行成功。當然ocelot還有很多功能如:路由、請求聚合、服務發現、WebSockets、認證、授權、LB、K8S、限流、熔斷等等。
參考https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/multi-container-microservice-net-applications/implement-api-gateways-with-ocelot