簡介
微服務的架構體系是由許多顆粒的服務組合而成,這些服務均負責各自的業務獨立運行,使用網關可以將這些服務的接口進行聚合對外發布統一的網關API地址即可。本篇將介紹ABP網關服務的搭建,ABP網關不僅轉發API接口,還提供了微服務權限的聚合。
新建項目
在Gateways目錄中創建一個新的 asp.net core 項目 WebAppGateway.Host
空項目結構如下:
發布本地微服務NuGet包
微服務架構不同於單體應用架構開發,單體應用中我們可以對項目工程直接添加引用,微服務中無法跨服務添加引用,所以通常會有一個本地的包管理器進行項目版本管理來添加相應服務版本的nuget包。
發布Business包
在Business解決方案中選擇Business.Domain配置如下
Business.Application.Contracts和Business.HttpApi同上配置,重新生成解決方案
上傳NuGet包
打開proget包管理添加Business.HttpApi 1.0.0包
搭建ProGet管理器可以參考這篇文章:https://www.cnblogs.com/william-xu/p/12083885.html
安裝模塊組件
在空項目中安裝 .net core、ef core、ids4、abp等官方組件和其他服務nuget包。
PM> Install-Package Serilog.AspNetCore
PM> Install-Package Serilog.Sinks.File
PM> Install-Package Serilog.Sinks.Elasticsearch
PM> Install-Package Serilog.Sinks.Async
PM> Install-Package Swashbuckle.AspNetCore
PM> Install-Package Ocelot
PM> Install-Package IdentityServer4.AccessTokenValidation
PM> Install-Package Microsoft.Extensions.Caching.StackExchangeRedis
PM> Install-Package Microsoft.AspNetCore.DataProtection.StackExchangeRedis
PM> Install-Package Volo.Abp.AspNetCore.MultiTenancy
PM> Install-Package Volo.Abp.Autofac
PM> Install-Package Volo.Abp.EntityFrameworkCore.SqlServer
PM> Install-Package Volo.Abp.Identity.HttpApi
PM> Install-Package Volo.Abp.PermissionManagement.EntityFrameworkCore
PM> Install-Package Volo.Abp.PermissionManagement.HttpApi
PM> Install-Package Volo.Abp.SettingManagement.EntityFrameworkCore
PM> Install-Package Volo.Abp.TenantManagement.EntityFrameworkCore
PM> Install-Package Volo.Abp.TenantManagement.HttpApi
配置Module
在項目根目錄下添加WebAppGatewayHostModule.cs
注冊認證方式、swagger、redis等服務,代碼如下:
public class WebAppGatewayHostModule: AbpModule
{
private const string DefaultCorsPolicyName = "Default";
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var hostingEnvironment = context.Services.GetHostingEnvironment();
ConfigureAuthentication(context, configuration);
ConfigureSql();
ConfigureRedis(context, configuration, hostingEnvironment);
ConfigureCors(context, configuration);
ConfigureSwaggerServices(context);
context.Services.AddOcelot(context.Services.GetConfiguration());
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
app.UseCorrelationId();
app.UseVirtualFiles();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
app.UseMultiTenancy();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Business Service API");
});
app.MapWhen(
ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") ||
ctx.Request.Path.ToString().StartsWith("/Abp/"),
app2 =>
{
app2.UseRouting();
app2.UseMvcWithDefaultRouteAndArea();
}
);
app.UseOcelot().Wait();
app.UseAbpSerilogEnrichers();
}
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = true;
options.ApiName = "BusinessService";
});
}
private static void ConfigureSwaggerServices(ServiceConfigurationContext context)
{
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Business Service API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
});
}
private void ConfigureSql()
{
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
}
private void ConfigureRedis(
ServiceConfigurationContext context,
IConfiguration configuration,
IWebHostEnvironment hostingEnvironment)
{
context.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = configuration["Redis:Configuration"];
});
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
}
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddCors(options =>
{
options.AddPolicy(DefaultCorsPolicyName, builder =>
{
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
}
啟動
Ctrl+F5運行
進入swagger頁面如下
Identity、Tenant、Business接口文件均已顯示:
調試
網關服務接口測試
AbpApplicationConfiguration測試:
請求成功並返回所有權限信息
聯調
通過網關調用business服務接口
成功請求但未授權
授權后測試
請求成功並返回數據