From 065cae33b471a42a137ce316978ef4380a5db846 Mon Sep 17 00:00:00 2001
From: cKey <35512826+colinin@users.noreply.github.com>
Date: Tue, 12 Jul 2022 18:56:57 +0800
Subject: [PATCH] add microsoft reverse-proxy module
---
...agementDbContextModelCreatingExtensions.cs | 4 -
...-Default-Value-With-Job-Source.Designer.cs | 272 ++++++++++++++++++
...41_Remove-Default-Value-With-Job-Source.cs | 33 +++
...agementMigrationsDbContextModelSnapshot.cs | 5 +-
.../InternalApiGatewayModule.cs | 137 +++++++++
.../LY.MicroService.ApiGateway.csproj | 20 ++
.../web/LY.MicroService.ApiGateway/Program.cs | 54 ++++
.../Properties/launchSettings.json | 28 ++
.../appsettings.Development.json | 71 +++++
.../appsettings.json | 72 +++++
.../web/LY.MicroService.ApiGateway/yarp.json | 130 +++++++++
11 files changed, 818 insertions(+), 8 deletions(-)
create mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.Designer.cs
create mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.cs
create mode 100644 gateways/web/LY.MicroService.ApiGateway/InternalApiGatewayModule.cs
create mode 100644 gateways/web/LY.MicroService.ApiGateway/LY.MicroService.ApiGateway.csproj
create mode 100644 gateways/web/LY.MicroService.ApiGateway/Program.cs
create mode 100644 gateways/web/LY.MicroService.ApiGateway/Properties/launchSettings.json
create mode 100644 gateways/web/LY.MicroService.ApiGateway/appsettings.Development.json
create mode 100644 gateways/web/LY.MicroService.ApiGateway/appsettings.json
create mode 100644 gateways/web/LY.MicroService.ApiGateway/yarp.json
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
index 27c741f84..427d5f245 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
@@ -55,10 +55,6 @@ public static class TaskManagementDbContextModelCreatingExtensions
.HasConversion(new ExtraPropertiesValueConverter(b.Metadata.ClrType))
.Metadata.SetValueComparer(new ExtraPropertyDictionaryValueComparer());
- b.Property(p => p.Source)
- .HasColumnName(nameof(BackgroundJobInfo.Source))
- .HasDefaultValue(JobSource.None);
-
b.ConfigureByConvention();
b.HasIndex(p => new { p.Name, p.Group });
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.Designer.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.Designer.cs
new file mode 100644
index 000000000..c690e5cb8
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.Designer.cs
@@ -0,0 +1,272 @@
+//
+using System;
+using LY.MicroService.TaskManagement.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ [DbContext(typeof(TaskManagementMigrationsDbContext))]
+ [Migration("20220712105141_Remove-Default-Value-With-Job-Source")]
+ partial class RemoveDefaultValueWithJobSource
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
+ .HasAnnotation("ProductVersion", "6.0.6")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobId")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("Paramters")
+ .HasColumnType("longtext")
+ .HasColumnName("Paramters");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name");
+
+ b.ToTable("TK_BackgroundJobActions", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobInfo", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Args")
+ .HasColumnType("longtext")
+ .HasColumnName("Args");
+
+ b.Property("BeginTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("Cron")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Cron");
+
+ b.Property("Description")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("Description");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Group")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Group");
+
+ b.Property("Interval")
+ .HasColumnType("int");
+
+ b.Property("IsAbandoned")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobType")
+ .HasColumnType("int");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("LastRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LockTimeOut")
+ .HasColumnType("int");
+
+ b.Property("MaxCount")
+ .HasColumnType("int");
+
+ b.Property("MaxTryCount")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("NextRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("NodeName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("NodeName");
+
+ b.Property("Priority")
+ .HasColumnType("int");
+
+ b.Property("Result")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Result");
+
+ b.Property("Source")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("TriggerCount")
+ .HasColumnType("int");
+
+ b.Property("TryCount")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Type");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "Group");
+
+ b.ToTable("TK_BackgroundJobs", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("Exception")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)")
+ .HasColumnName("Exception");
+
+ b.Property("JobGroup")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("JobGroup");
+
+ b.Property("JobId")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("JobName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("JobName");
+
+ b.Property("JobType")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("JobType");
+
+ b.Property("Message")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Message");
+
+ b.Property("RunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JobGroup", "JobName");
+
+ b.ToTable("TK_BackgroundJobLogs", (string)null);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.cs
new file mode 100644
index 000000000..6dea0144e
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220712105141_Remove-Default-Value-With-Job-Source.cs
@@ -0,0 +1,33 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ public partial class RemoveDefaultValueWithJobSource : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterColumn(
+ name: "Source",
+ table: "TK_BackgroundJobs",
+ type: "int",
+ nullable: false,
+ oldClrType: typeof(int),
+ oldType: "int",
+ oldDefaultValue: -1);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterColumn(
+ name: "Source",
+ table: "TK_BackgroundJobs",
+ type: "int",
+ nullable: false,
+ defaultValue: -1,
+ oldClrType: typeof(int),
+ oldType: "int");
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
index 9f1abeb11..782ccc326 100644
--- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
@@ -187,10 +187,7 @@ namespace LY.MicroService.TaskManagement.Migrations
.HasColumnName("Result");
b.Property("Source")
- .ValueGeneratedOnAdd()
- .HasColumnType("int")
- .HasDefaultValue(-1)
- .HasColumnName("Source");
+ .HasColumnType("int");
b.Property("Status")
.HasColumnType("int");
diff --git a/gateways/web/LY.MicroService.ApiGateway/InternalApiGatewayModule.cs b/gateways/web/LY.MicroService.ApiGateway/InternalApiGatewayModule.cs
new file mode 100644
index 000000000..6a88a7e13
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/InternalApiGatewayModule.cs
@@ -0,0 +1,137 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Cors;
+using Microsoft.AspNetCore.Rewrite;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.OpenApi.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Volo.Abp;
+using Volo.Abp.AspNetCore.Serilog;
+using Volo.Abp.Autofac;
+using Volo.Abp.Data;
+using Volo.Abp.Modularity;
+using Volo.Abp.Swashbuckle;
+using Yarp.ReverseProxy.Configuration;
+
+namespace LY.MicroService.ApiGateway;
+
+[DependsOn(
+ typeof(AbpAutofacModule),
+ typeof(AbpDataModule),
+ typeof(AbpSwashbuckleModule),
+ typeof(AbpAspNetCoreSerilogModule)
+)]
+public class InternalApiGatewayModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ var configuration = context.Services.GetConfiguration();
+ var hostingEnvironment = context.Services.GetHostingEnvironment();
+
+ context.Services.AddAbpSwaggerGenWithOAuth(
+ authority: configuration["AuthServer:Authority"],
+ scopes: new Dictionary
+ {
+ {"Account", "Account API"},
+ {"Identity", "Identity API"},
+ {"IdentityServer", "Identity Server API"},
+ {"BackendAdmin", "Backend Admin API"},
+ {"Localization", "Localization API"},
+ {"Platform", "Platform API"},
+ {"RealtimeMessage", "RealtimeMessage API"},
+ {"TaskManagement", "Task Management API"},
+ {"Webhooks", "Webhooks API"},
+ },
+ options =>
+ {
+ options.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiGateway", Version = "v1" });
+ options.DocInclusionPredicate((docName, description) => true);
+ options.CustomSchemaIds(type => type.FullName);
+ });
+
+ context.Services.AddCors(options =>
+ {
+ options.AddDefaultPolicy(builder =>
+ {
+ builder
+ .WithOrigins(
+ configuration["App:CorsOrigins"]
+ .Split(",", StringSplitOptions.RemoveEmptyEntries)
+ .Select(o => o.Trim().RemovePostFix("/"))
+ .ToArray()
+ )
+ .WithAbpExposedHeaders()
+ .WithAbpWrapExposedHeaders()
+ .SetIsOriginAllowedToAllowWildcardSubdomains()
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials();
+ });
+ });
+
+ context.Services
+ .AddReverseProxy()
+ .LoadFromConfig(configuration.GetSection("ReverseProxy"));
+ }
+
+ public override void OnApplicationInitialization(ApplicationInitializationContext context)
+ {
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+ app.UseCorrelationId();
+ app.UseAbpSerilogEnrichers();
+ app.UseCors();
+
+ app.UseSwagger();
+ app.UseSwaggerUI(options =>
+ {
+ var configuration = context.ServiceProvider.GetRequiredService();
+ var logger = context.ServiceProvider.GetRequiredService>();
+ var proxyConfigProvider = context.ServiceProvider.GetRequiredService();
+ var yarpConfig = proxyConfigProvider.GetConfig();
+
+ var routedClusters = yarpConfig.Clusters
+ .SelectMany(t => t.Destinations,
+ (clusterId, destination) => new { clusterId.ClusterId, destination.Value });
+
+ var groupedClusters = routedClusters
+ .GroupBy(q => q.Value.Address)
+ .Select(t => t.First())
+ .Distinct()
+ .ToList();
+
+ foreach (var clusterGroup in groupedClusters)
+ {
+ var routeConfig = yarpConfig.Routes.FirstOrDefault(q =>
+ q.ClusterId == clusterGroup.ClusterId);
+ if (routeConfig == null)
+ {
+ logger.LogWarning($"Swagger UI: Couldn't find route configuration for {clusterGroup.ClusterId}...");
+ continue;
+ }
+
+ options.SwaggerEndpoint($"{clusterGroup.Value.Address}/swagger/v1/swagger.json", $"{routeConfig.RouteId} API");
+ options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
+ options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
+ }
+ });
+
+ app.UseRewriter(new RewriteOptions().AddRedirect("^(|\\|\\s+)$", "/swagger"));
+
+ app.UseRouting();
+ app.UseEndpoints(endpoints =>
+ {
+ endpoints.MapReverseProxy(options =>
+ options.UseLoadBalancing());
+ });
+ }
+}
diff --git a/gateways/web/LY.MicroService.ApiGateway/LY.MicroService.ApiGateway.csproj b/gateways/web/LY.MicroService.ApiGateway/LY.MicroService.ApiGateway.csproj
new file mode 100644
index 000000000..e74b6f639
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/LY.MicroService.ApiGateway.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gateways/web/LY.MicroService.ApiGateway/Program.cs b/gateways/web/LY.MicroService.ApiGateway/Program.cs
new file mode 100644
index 000000000..7ccfedd43
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/Program.cs
@@ -0,0 +1,54 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Serilog;
+using System;
+using System.Threading.Tasks;
+
+namespace LY.MicroService.ApiGateway;
+
+public class Program
+{
+ public static async Task Main(string[] args)
+ {
+ try
+ {
+ Log.Information("Starting Internal ApiGateway.");
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Host.AddAppSettingsSecretsJson()
+ .UseAutofac()
+ .ConfigureAppConfiguration((context, config) =>
+ {
+ var configuration = config.Build();
+ if (configuration.GetSection("AgileConfig").Exists())
+ {
+ config.AddAgileConfig(new AgileConfig.Client.ConfigClient(configuration));
+ }
+
+ config.AddJsonFile("yarp.json", true, true).AddEnvironmentVariables();
+ })
+ .UseSerilog((context, provider, config) =>
+ {
+ config.ReadFrom.Configuration(context.Configuration);
+ });
+
+ await builder.AddApplicationAsync();
+ var app = builder.Build();
+ await app.InitializeApplicationAsync();
+ await app.RunAsync();
+
+ return 0;
+ }
+ catch (Exception ex)
+ {
+ Log.Fatal(ex, "Starting Internal ApiGateway terminated unexpectedly!");
+ return 1;
+ }
+ finally
+ {
+ Log.CloseAndFlush();
+ }
+ }
+}
diff --git a/gateways/web/LY.MicroService.ApiGateway/Properties/launchSettings.json b/gateways/web/LY.MicroService.ApiGateway/Properties/launchSettings.json
new file mode 100644
index 000000000..8b13bb14e
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/Properties/launchSettings.json
@@ -0,0 +1,28 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:20890",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "PackageName.CompanyName.ProjectName.HttpApi.Host": {
+ "commandName": "Project",
+ "launchBrowser": false,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "http://localhost:5000",
+ "dotnetRunMessages": "true"
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": false,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/gateways/web/LY.MicroService.ApiGateway/appsettings.Development.json b/gateways/web/LY.MicroService.ApiGateway/appsettings.Development.json
new file mode 100644
index 000000000..edfd81263
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/appsettings.Development.json
@@ -0,0 +1,71 @@
+{
+ "AgileConfig": {
+ "env": "DEV",
+ "appId": "LY.MicroService.ApiGateway",
+ "secret": "1q2w3E*",
+ "nodes": "http://127.0.0.1:5000",
+ "name": "BackendAdmin",
+ "tag": "BackendAdmin"
+ },
+ "App": {
+ "CorsOrigins": "http://127.0.0.1:3100"
+ },
+ "ConnectionStrings": {
+ "Default": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpIdentity": "Server=127.0.0.1;Database=IdentityServer;User Id=root;Password=123456",
+ "AbpIdentityServer": "Server=127.0.0.1;Database=IdentityServer;User Id=root;Password=123456",
+ "AbpSaas": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpFeatureManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpLocalizationManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
+ "AbpTextTemplating": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456"
+ },
+ "AuthServer": {
+ "Authority": "http://127.0.0.1:44385/",
+ "ApiName": "lingyun-abp-application"
+ },
+ "Logging": {
+ "Serilog": {
+ "Elasticsearch": {
+ "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}"
+ }
+ }
+ },
+ "AuditLogging": {
+ "Elasticsearch": {
+ "IndexPrefix": "abp.dev.auditing"
+ }
+ },
+ "Elasticsearch": {
+ "NodeUris": "http://127.0.0.1:9200"
+ },
+ "Serilog": {
+ "MinimumLevel": {
+ "Default": "Debug",
+ "Override": {
+ "System": "Warning",
+ "Microsoft": "Warning",
+ "DotNetCore": "Debug"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "restrictedToMinimumLevel": "Debug",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "Elasticsearch",
+ "Args": {
+ "nodeUris": "http://127.0.0.1:9200",
+ "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}",
+ "autoRegisterTemplate": true,
+ "autoRegisterTemplateVersion": "ESv7"
+ }
+ }
+ ]
+ }
+}
diff --git a/gateways/web/LY.MicroService.ApiGateway/appsettings.json b/gateways/web/LY.MicroService.ApiGateway/appsettings.json
new file mode 100644
index 000000000..e113587b1
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/appsettings.json
@@ -0,0 +1,72 @@
+{
+ "StringEncryption": {
+ "DefaultPassPhrase": "s46c5q55nxpeS8Ra",
+ "InitVectorBytes": "s83ng0abvd02js84",
+ "DefaultSalt": "sf&5)s3#"
+ },
+ "Serilog": {
+ "MinimumLevel": {
+ "Default": "Information",
+ "Override": {
+ "System": "Warning",
+ "Microsoft": "Warning",
+ "DotNetCore": "Information"
+ }
+ },
+ "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ],
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "restrictedToMinimumLevel": "Debug",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/Debug-.log",
+ "restrictedToMinimumLevel": "Debug",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/Info-.log",
+ "restrictedToMinimumLevel": "Information",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/Warn-.log",
+ "restrictedToMinimumLevel": "Warning",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/Error-.log",
+ "restrictedToMinimumLevel": "Error",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/Fatal-.log",
+ "restrictedToMinimumLevel": "Fatal",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
+ }
+ }
+ ]
+ }
+}
diff --git a/gateways/web/LY.MicroService.ApiGateway/yarp.json b/gateways/web/LY.MicroService.ApiGateway/yarp.json
new file mode 100644
index 000000000..a10aca999
--- /dev/null
+++ b/gateways/web/LY.MicroService.ApiGateway/yarp.json
@@ -0,0 +1,130 @@
+{
+ "ReverseProxy": {
+ "Routes": {
+ "Account": {
+ "ClusterId": "accountCluster",
+ "Match": {
+ "Path": "/api/account/{**everything}"
+ }
+ },
+ "Identity": {
+ "ClusterId": "identityCluster",
+ "Match": {
+ "Path": "/api/identity/{**everything}"
+ }
+ },
+ "IdentityServer": {
+ "ClusterId": "identityServerCluster",
+ "Match": {
+ "Path": "/api/identity-server/{**everything}"
+ }
+ },
+ "BackendAdmin": {
+ "ClusterId": "backendAdminCluster",
+ "Match": {
+ "Path": "/api/abp/{**everything}"
+ }
+ },
+ "feature-management-route": {
+ "ClusterId": "feature-management-cluster",
+ "Match": {
+ "Path": "/api/feature-management/{**everything}"
+ }
+ },
+ "permission-management-route": {
+ "ClusterId": "permission-management-cluster",
+ "Match": {
+ "Path": "/api/permission-management/{**everything}"
+ }
+ },
+ "setting-management-route": {
+ "ClusterId": "setting-management-cluster",
+ "Match": {
+ "Path": "/api/setting-management/{**everything}"
+ }
+ },
+ "localization-management-route": {
+ "ClusterId": "localization-management-cluster",
+ "Match": {
+ "Path": "/api/localization/{**everything}"
+ }
+ },
+ "im-route": {
+ "ClusterId": "im-cluster",
+ "Match": {
+ "Path": "/api/im/{**everything}"
+ }
+ },
+ "Catalog Service": {
+ "ClusterId": "catalogCluster",
+ "Match": {
+ "Path": "/api/catalog/{**everything}"
+ }
+ },
+ "Ordering Service": {
+ "ClusterId": "orderingCluster",
+ "Match": {
+ "Path": "/api/ordering/{**everything}"
+ }
+ }
+ },
+ "Clusters": {
+ "accountCluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "http://10.21.15.28:44385"
+ }
+ }
+ },
+ "identityCluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "http://10.21.15.28:30015"
+ }
+ }
+ },
+ "backendAdminCluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "http://10.21.15.28:30010"
+ }
+ }
+ },
+ "feature-management-cluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "https://localhost:44353"
+ }
+ }
+ },
+ "permission-management-cluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "https://localhost:44353"
+ }
+ }
+ },
+ "setting-management-cluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "https://localhost:44353"
+ }
+ }
+ },
+ "catalogCluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "https://localhost:44354"
+ }
+ }
+ },
+ "orderingCluster": {
+ "Destinations": {
+ "destination1": {
+ "Address": "https://localhost:44356"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file