1.打造網(wǎng)關(guān)
1.1 簡介
BFF(Backend For Frontend)負(fù)責(zé)認(rèn)證授權(quán),服務(wù)聚合,目標(biāo)是為前端提供服務(wù)。BFF是在前后端分離架構(gòu)出來后才出現(xiàn)的,為前端提供單純的API樣式的網(wǎng)關(guān)。
在微服務(wù)架構(gòu)中網(wǎng)關(guān)和BFF的區(qū)別實際不大,二者之間的職責(zé)可以是重疊,聚合的,本質(zhì)來講BFF模式是網(wǎng)關(guān)職責(zé)的一種進(jìn)化。
1.2 連接模式
傳統(tǒng)的連接模式
共享網(wǎng)關(guān)模式的好處是統(tǒng)一的入口,所有的應(yīng)用程序通過單一的網(wǎng)關(guān)進(jìn)行請求,適合網(wǎng)關(guān)比較強(qiáng)大并且所有接口都在網(wǎng)關(guān)上注冊,要求網(wǎng)關(guān)的可用性比較高。
隨著業(yè)務(wù)的發(fā)展,單個服務(wù)并不能滿足要求,很可能需求是需要跨微服務(wù)之間進(jìn)行組裝數(shù)據(jù),這時候就出現(xiàn)了聚合服務(wù)。聚合服務(wù)可以單獨作為一個服務(wù)存在微服務(wù)的體系下,也是通過網(wǎng)關(guān)去訪問它,實際上聚合服務(wù)也可以設(shè)計在網(wǎng)關(guān)中,這樣的網(wǎng)關(guān)實際上就類似于BFF。
專用網(wǎng)關(guān)模式指的是針對不同的客戶端采用不用的網(wǎng)關(guān),比如將移動端和PC的網(wǎng)關(guān)分開。這樣的好處在于,不同的客戶端所依賴的網(wǎng)關(guān)是不同的,可以使故障隔離,不用端之間是不會收到相互之間的影響;同時也可以為不同端設(shè)計不同的數(shù)據(jù)聚合接口,暴露不同的微服務(wù)Api。不同業(yè)務(wù)線之間只要維護(hù)自己的網(wǎng)關(guān),同時根據(jù)自身業(yè)務(wù)線去進(jìn)行業(yè)務(wù)的拆分文章來源:http://www.zghlxwxcb.cn/news/detail-679943.html
1.3 打造網(wǎng)關(guān)
- 添加包Ocelot 14.0.3
- 添加配置文件ocelot.json
- 添加配置讀取代碼
- 注冊O(shè)celot服務(wù)
- 注冊O(shè)ceot中間件
// startup
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot(Configuration);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseOcelot().Wait(); // 放最后是為了讓網(wǎng)關(guān)內(nèi)置的 Api仍然生效
}
2.身份認(rèn)證與授權(quán)
2.1 身份認(rèn)證方案
- Cookie
- JWT Bearer
2.1.1 JWT是什么
- 全程 Json Web Tokens
- 支持簽名的數(shù)據(jù)結(jié)構(gòu)
文章來源地址http://www.zghlxwxcb.cn/news/detail-679943.html
2.1.2 啟用JwtBearer身份認(rèn)證
- Microsoft.AspNetCore.Authentication.JwtBearer
2.1.3 配置身份認(rèn)證
- Ocelot網(wǎng)關(guān)配置身份認(rèn)證
- 微服務(wù)配置認(rèn)證與授權(quán)
// appsetting.json配置秘鑰
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"SecurityKey": "aabbccddffskldjfklajskdlfjlas234234234"
}
// startup 配置
var secrityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]));
services.AddSingleton(secrityKey);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,//是否驗證Issuer
ValidateAudience = true,//是否驗證Audience
ValidateLifetime = true,//是否驗證失效時間
ClockSkew = TimeSpan.FromSeconds(30),
ValidateIssuerSigningKey = true,//是否驗證SecurityKey
ValidAudience = "localhost",//Audience
ValidIssuer = "localhost",//Issuer
IssuerSigningKey = secrityKey//拿到SecurityKey
};
});
// 注冊
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
// 這兩個需要注冊在UseEndpoints之前
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/live");
endpoints.MapHealthChecks("/ready");
endpoints.MapHealthChecks("/hc", new Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions
{
ResponseWriter = HealthChecks.UI.Client.UIResponseWriter.WriteHealthCheckUIResponse
});
endpoints.MapControllers();
endpoints.MapDefaultControllerRoute();
});
app.UseOcelot().Wait();
}
2.1.4 JWT注意事項
- Payload信息不宜過大
- Payload不宜存儲敏感信息
到了這里,關(guān)于【微服務(wù)】05-網(wǎng)關(guān)與BFF(Backend For Frontend)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!