上篇.Net微服務實踐(一):微服務框架選型 我們對微服務框架整體做了介紹,接下來我們從網關Ocelot開始,一一開始實踐
介紹
Ocelot是一個用.NET Core實現並且開源的API網關,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑒權、限流熔斷、並內置了負載均衡器與Service Fabric、Butterfly、Tracing集成。這些功能只都只需要簡單的配置即可完成,下面我們會對這些功能的配置一一進行說明。
基本原理
簡單的來說Ocelot是一堆的asp.net core middleware組成的一個管道。當它拿到請求之后會用一個request builder來構造一個HttpRequestMessage發到下游的真實服務器,等下游的服務返回response之后再由一個middleware將它返回的HttpResponseMessage映射到HttpResponse對象並返回給客戶端。
集成方式
基本集成
用一台web service來host Ocelot,在這里有一個json配置文件,里面設置了所有對當前這個網關的配置。它會接收所有的客戶端請求,並路由到對應的下游服務器進行處理,再將請求結果返回。而這個上下游請求的對應關系也被稱之為路由。
集成IdentityServer
當我們涉及到認證和鑒權的時候,我們可以跟Identity Server進行結合。當網關需要請求認證信息的時候會與Identity Server服務器進行交互來完成。
網關集群
只有一個網關是很危險的,也就是我們通常所講的單點,只要它掛了,所有的服務全掛。這顯然無法達到高可用,所以我們也可以部署多台Ocelot網關。當然這個時候在多台網關前,你還需要一台負載均衡器
Consul服務發現
在Ocelot已經支持簡單的負載功能,也就是當下游服務存在多個結點的時候,Ocelot能夠承擔起負載均衡的作用。但是它不提供健康檢查,服務的注冊也只能通過手動在配置文件里面添加完成。這不夠靈活並且在一定程度下會有風險。這個時候我們就可以用Consul來做服務發現,它能與Ocelot完美結合。
集成Service Fabric
快速開始
創建訂單服務
- 新建一個新建asp.net core web api項目,命名為order-api, 模擬訂單服務
- 在order-api項目中,添加一個order api
[ApiController]
public class OrderController : ControllerBase
{
// GET: api/Product
[Route("api/orders")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "劉明的訂單", "王天的訂單" };
}
}
- 服務啟動地址配置為http://localhost:5001
創建產品服務
- 新建一個新建asp.net core web api項目,命名為product-api, 模擬產品服務
- 在product-api項目中,添加一個product api
[ApiController]
public class ProductController : ControllerBase
{
// GET: api/Product
[Route("api/products")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "筆記本", "口罩" };
}
}
- 服務啟動地址配置為http://localhost:5002
創建網關
-
新建一個新建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"
}
}
- 修改Program.cs文件,添加Ocelot配置文件
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();
})
- 修改Startup.cs, 在ConfigureServices中注入Ocelot組件
services.AddOcelot()
- 修改Startup.cs, 在Configure中添加Ocelot中間件
app.UseOcelot().Wait();
-- 服務啟動地址配置為http://localhost:5000
運行驗證
- 使用dotnet run命令分別運行ocelot-gateway, order-api, product-api
- 運行后網關地址為 http://localhost:5000
獲取訂單的api地址為 http://localhost:5001/api/orders
獲取產品的api地址為http://localhost:5002/api/products - 使用Postman 調用 http://localhost:5000/api/orders, 會發現返回了訂單數據
使用Postman 調用 http://localhost:5000/api/products, 會發現返回了產品數據
最后
本篇我們介紹了Ocelot,它的實現原理,以及如何快速創建ocelot的helo world項目,下面我們會介紹Ocelot的主要特性:路由 .Net微服務實踐(三):Ocelot配置路由和請求聚合