閘道器是什麼
簡單來說,閘道器就是暴露給外部的請求入口。就和門衛一樣,外面的人想要進來,必須要經過門衛。當然,閘道器並不一定是必須的,後端服務通過http也可以很好的向客戶端提供服務。但是對於業務複雜、規模龐大的專案來說,使用閘道器有很多無法捨棄的好處,比如可以進行統一的請求聚合來節省流量、降低耦合度,可以賦予專案熔斷限流的能力提高可用性等等。
ocelot是什麼
ocelot是.net core實現的開源的api閘道器專案,開源地址:https://github.com/ThreeMammals/Ocelot
ocelot除了十分契合.net開發者以外,功能強大,包含:路由、認證、請求聚合、限流熔斷、服務發現、鑑權,還有內建負載均衡器、Consul整合等等。
當然了,api閘道器不止這一款,市面上還有kong之類的,隨自己喜好就好。
ocelot整合
首先明確一點,閘道器應該作為獨立程式存在。那麼我們先新建一個.net core3.1專案,然後新增nuget包:
關於版本,選擇當前所能支援的最新版即可。
新增好nuget包以後,需要修改StartUp:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot();
//services.AddControllers();
}
// 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().Wait();
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//app.UseHttpsRedirection();
//app.UseRouting();
//app.UseAuthorization();
//app.UseEndpoints(endpoints =>
//{
// endpoints.MapControllers();
//});
}
這裡不要驚訝,因為走了閘道器就不會再走預設的管道了。UseOcelot().Wait() 表示設定ocelot所有的中介軟體,而ocelot也提供了很多整合中介軟體的庫,就像這些:
現在,想要讓ocelot成功執行,還需要新增配置檔案,並在Program新增配置檔案的引用:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config =>
{
config.AddJsonFile("ocelotConfig.json", optional: false, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
配置檔案:
{
"Routes": [
{
"DownstreamPathTemplate": "/{url}", //服務地址--url變數
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "123.123.123.123",
"Port": 5050 //服務埠
}
],
"UpstreamPathTemplate": "/MJ/{url}", //閘道器地址--url變數
"UpstreamHttpMethod": [ "Get", "Post" ]
}
]
}
這是一份簡單的轉發配置,Downstream和Upstream開頭的配置項就是下游、上游相關項。這裡要說一句,在微服務架構中,客戶端——服務端通常理解為上游——下游,這裡自行替換一下。
上面的配置檔案做了一件事,接收上游請求時,把請求路徑中含有【/MJ/所有】的請求轉發到IP【http://123.123.123.123:5050/所有】並回傳結果,支援http的get、post方法,其實這就是最基本的路由。
來測試一下,啟動專案並寫好請求路徑:
可以看到,ocelot成功把本地請求按照路由規則轉發給遠端伺服器,並回發了結果。一個閘道器最基本的功能有了。
截圖中所請求的遠端服務,是我前幾篇文章基於consul搭建起來的專案,有興趣可以去看看。
關於ocelot更高階的應用,比如熔斷限流、身份認證等,都是通過配置來完成的,我會整理後發出來,同時也建議仔細閱讀官方文件,地址:https://ocelot.readthedocs.io/en/latest/