上篇.Net微服務實踐(一):微服務框架選型 咱們對微服務框架總體作了介紹,接下來咱們從網關Ocelot開始,一一開始實踐html
Ocelot是一個用.NET Core實現而且開源的API網關,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑑權、限流熔斷、並內置了負載均衡器與Service Fabric、Butterfly、Tracing集成。這些功能只都只須要簡單的配置便可完成,下面咱們會對這些功能的配置一一進行說明。git
簡單的來講Ocelot是一堆的asp.net core middleware組成的一個管道。當它拿到請求以後會用一個request builder來構造一個HttpRequestMessage發到下游的真實服務器,等下游的服務返回response以後再由一個middleware將它返回的HttpResponseMessage映射到HttpResponse對象並返回給客戶端。github
基本集成
用一臺web service來host Ocelot,在這裏有一個json配置文件,裏面設置了全部對當前這個網關的配置。它會接收全部的客戶端請求,並路由到對應的下游服務器進行處理,再將請求結果返回。而這個上下游請求的對應關係也被稱之爲路由。web
集成IdentityServer
json
當咱們涉及到認證和鑑權的時候,咱們能夠跟Identity Server進行結合。當網關須要請求認證信息的時候會與Identity Server服務器進行交互來完成。api
網關集羣
服務器
只有一個網關是很危險的,也就是咱們一般所講的單點,只要它掛了,全部的服務全掛。這顯然沒法達到高可用,因此咱們也能夠部署多臺Ocelot網關。固然這個時候在多臺網關前,你還須要一臺負載均衡器app
Consul服務發現
負載均衡
在Ocelot已經支持簡單的負載功能,也就是當下遊服務存在多個結點的時候,Ocelot可以承擔起負載均衡的做用。可是它不提供健康檢查,服務的註冊也只能經過手動在配置文件裏面添加完成。這不夠靈活而且在必定程度下會有風險。這個時候咱們就能夠用Consul來作服務發現,它能與Ocelot完美結合。框架
集成Service Fabric
[ApiController] public class OrderController : ControllerBase { // GET: api/Product [Route("api/orders")] [HttpGet] public IEnumerable<string> Get() { return new string[] { "劉明的訂單", "王天的訂單" }; } }
[ApiController] public class ProductController : ControllerBase { // GET: api/Product [Route("api/products")] [HttpGet] public IEnumerable<string> Get() { return new string[] { "筆記本", "口罩" }; } }
新建一個新建asp.net core web api項目,命名爲ocelot-gateway, 這是網關
項目結構圖
Nuget添加Ocelot package
添加Ocelot配置文件, 命名爲Ocelot.json (放在appsettings.json平級目錄)
。咱們暫且無論配置文件內容的含義,先快速把網關運行起來
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/orders", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 5001 } ], "UpstreamPathTemplate": "/api/orders", "UpstreamHttpMethod": [ "Get" ] }, { "DownstreamPathTemplate": "/api/products", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 5002 } ], "UpstreamPathTemplate": "/api/products", "UpstreamHttpMethod": [ "Get" ] } ], "GlobalConfiguration": { "BaseUrl": "http://localhost:5000" } }
Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("appsettings.json", true, true) .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true) .AddJsonFile("Ocelot.json",false,true) .AddEnvironmentVariables(); })
services.AddOcelot()
app.UseOcelot().Wait();
-- 服務啓動地址配置爲http://localhost:5000
本篇咱們介紹了Ocelot,它的實現原理,以及如何快速建立ocelot的helo world項目,下面咱們會介紹Ocelot的主要特性:路由