Ocelot - .Net Core開源網關
Ocelot - .Net Core開源網關
作者:markjiang7m2
原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html
源碼地址:https://gitee.com/Sevenm2/OcelotDemo
今天要給大家介紹的Ocelot是一個基於 .net core的開源WebAPI服務網關項目,它的功能非常強大,包括了路由、請求聚合、服務發現、認證鑒權、限流、負載均衡等功能。而這些功能都可以直接通過修改json配置文件即可使用,非常方便。Ocelot是系統中對外暴露的一個請求入口,所有外部接口都必須通過這個網關才能向下遊API發出請求,就如地鐵中的安檢系統,所有人都必須經過安檢才能乘坐地鐵。
- Ocelot官網:http://threemammals.com/ocelot
- 說明文檔:https://ocelot.readthedocs.io/en/latest/
- Github:https://github.com/ThreeMammals/Ocelot
我將通過具體案例對Ocelot的功能進行一一展開說明,而本文中涉及案例的完整代碼都可以從我的代碼倉庫進行下載。
- 倉庫地址:https://gitee.com/Sevenm2/OcelotDemo
搭建Ocelot項目
通過VS2017新建一個基於 .net core WebAPI項目,然後通過nuget直接搜索Ocelot
或者使用以下命令行添加Ocelot的引用。
Install-Package Ocelot
在項目的根目錄添加一個.json
配置文件,文件名自定義,此案例為Ocelot.json.添加配置如下:
{
"ReRoutes": [],
"GlobalConfiguration": {
}
}
可以看到在我們的配置文件中包含兩個配置項,ReRoutes是一個數組,將會包含服務器的路由配置,GlobalConfiguration則是一個全局配置項。我會在下文中通過各種案例詳細說明配置項中的具體內容以及如何使用,因此,在這裏暫時不展開說明。
將該配置文件添加到 .net core configuration中
Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) => {
builder.AddJsonFile("Ocelot.json");
})
.UseStartup<Startup>();
因為 .net core支持當配置文件被修改後會重新加載,所以如果我們需要支持重新加載,可修改為:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) => {
builder.AddJsonFile("Ocelot.json", optional: false, reloadOnChange: true);
})
.UseStartup<Startup>();
將Ocelot作為中間件註冊,需要添加兩個命名空間
Startup.cs
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOcelot();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
app.UseOcelot().Wait();
}
至此,我們的Ocelot就已經搭建完成了。下面我們通過具體案例來說明如何修改配置進行相關功能的使用。
配置參數介紹
我們先來認識一下到底包含哪些參數,以及這些參數的含義。前面我們有介紹到,配置文件中包含兩個配置項:ReRoutes和GlobalConfiguration。
我們先來看GlobalConfiguration,它是一個全局配置項,通常我們都要在這個配置項中添加一個屬性BaseUrl
,BaseUrl就是Ocelot服務對外暴露的Url。
"GlobalConfiguration": {
"BaseUrl": "http://localhost:4727"
}
ReRoutes是一個數組,其中的每一個元素代表了一個路由,而一個路由所包含的所有可配置參數如下:
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": [
"Get"
],
"AddHeadersToRequest": {},
"AddClaimsToRequest": {},
"RouteClaimsRequirement": {},
"AddQueriesToRequest": {},
"RequestIdKey": "",
"FileCacheOptions": {
"TtlSeconds": 0,
"Region": ""
},
"ReRouteIsCaseSensitive": false,
"ServiceName": "",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 8001,
}
],
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 0,
"DurationOfBreak": 0,
"TimeoutValue": 0
},
"LoadBalancer": "",
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": false,
"Period": "",
"PeriodTimespan": 0,
"Limit": 0
},
"AuthenticationOptions": {
"AuthenticationProviderKey": "",
"AllowedScopes": []
},
"HttpHandlerOptions": {
"AllowAutoRedirect": true,
"UseCookieContainer": true,
"UseTracing": true
},
"UseServiceDiscovery": false
}
- Downstream 下遊服務配置
- UpStream 上遊服務配置
- Aggregates 服務聚合配置
- ServiceName, LoadBalancer, UseServiceDiscovery 服務發現配置
- AuthenticationOptions 服務認證配置
- RouteClaimsRequirement Claims 鑒權配置
- RateLimitOptions 限流配置
- FileCacheOptions 緩存配置
- QosOptions 服務質量與熔斷配置
- DownstreamHeaderTransform 頭信息轉發配置
當然,我們在實際使用過程中不需要設置所有的參數,只需要根據實際需要進行配置即可。
案例一 路由
路由是Ocelot最基本的功能。Ocelot接收到來自上遊服務的請求,經過驗證後,將請求轉發到下遊服務,因此,我們首先要配置路由當中上下遊服務參數。
{
"DownstreamPathTemplate": "/api/ocelot/{Id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 8001,
}
],
"UpstreamPathTemplate": "/ocelot/{Id}",
"UpstreamHttpMethod": ["Get"]
}
- DownstreamPathTemplate 下遊請求Url模板,
{}
中的內容代表動態參數 - DownstreamScheme 下遊服務http scheme
- DownstreamHostAndPorts 下遊服務的地址,如果使用LoadBalancer的話這裏可以填多項
- UpstreamPathTemplate 上遊也就是用戶輸入的請求Url模板
- UpstreamHttpMethod 上遊請求http方法,可使用數組
因此,當上遊服務向地址http://localhost:4727/ocelot/5
發出請求時,Ocelot會將請求轉發到下遊服務http://localhost:8001/api/ocelot/5
。
本案例提供了下遊服務Demo - OcelotDownAPI,將OcelotDownAPI發布到IIS端口即可使用。下遊服務在接收到請求後返回一個字符串用於表明自己的身份。
[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
var result = await Task.Run(() =>
{
return $"This is from {HttpContext.Request.Host.Value}, path: {HttpContext.Request.Path}";
});
return Ok(result);
}
測試結果:
如果希望Ocelot能夠轉發所有的請求,則可以配置如下:
{
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 8001,
}
],
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": ["Get"]
}
這樣就能將所有Get請求轉發到下遊服務。不過這樣配置的優先級是最低的,一旦匹配到其它路由模板,會優先選擇。
如果希望Ocelot只轉發來自某個特定上遊服務Host的請求,則可以配置如下:
{
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 8001,
}
],
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": ["Get"],
"UpstreamHost": "localhost:4023"
}
這樣Ocelot就只會轉發來自localhost:4023的請求。需要註意的是,如果路由配置中包含兩個除UpstreamHost
以外都相同的路由,即其中一個帶有UpstreamHost
,而另外一個沒有,則Ocelot會優先選擇帶有UpstreamHost
的路由。
設置路由的優先級。我們可以定義ReRoutes
路由數組中響應的優先級。0是最低的優先級,數字越大,優先級越高。
[
{
"UpstreamPathTemplate": "/ocelot/{Id}"
"Priority": 0
},
{
"UpstreamPathTemplate": "/ocelot/10"
"Priority": 1
},
]
總結
本文主要介紹了Ocelot的功能,並通過簡單的案例講述如何構建Ocelot網關以及對Ocelot的基本應用。由於Ocelot功能非常的強大,如果將所有的案例都放到同一篇文章中會導致篇幅過長,不便於閱讀,因此,我將會針對Ocelot功能寫成系列文章,希望大家繼續捧場。
參考文獻
本文在編寫過程中引用或參考了以下文章中的部分內容,如有侵權,請聯系修改或刪除。
https://www.cnblogs.com/jesse2013/p/net-core-apigateway-ocelot-docs.html
Ocelot - .Net Core開源網關