Browse Source

Updated and refactored

pull/235/head
Galip Tolga Erdem 3 years ago
parent
commit
5ba78f7c32
  1. 5
      gateways/web/src/EShopOnAbp.WebGateway/Aggregations/Localization/CachedLocalizationService.cs
  2. 56
      gateways/web/src/EShopOnAbp.WebGateway/Aggregations/LocalizationAggregation.cs
  3. 2
      gateways/web/src/EShopOnAbp.WebGateway/EShopOnAbpWebGatewayModule.cs
  4. 7
      gateways/web/src/EShopOnAbp.WebGateway/ReverseProxyBuilderExtensions.cs

5
gateways/web/src/EShopOnAbp.WebGateway/Aggregations/Localization/CachedLocalizationService.cs

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq; using System.Linq;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -10,7 +9,7 @@ namespace EShopOnAbp.WebGateway.Aggregations.Localization;
public class CachedLocalizationService : ISingletonDependency public class CachedLocalizationService : ISingletonDependency
{ {
protected ConcurrentDictionary<string, ApplicationLocalizationDto> LocalizationDictionary { get; } protected static ConcurrentDictionary<string, ApplicationLocalizationDto> LocalizationDictionary { get; private set; }
public CachedLocalizationService() public CachedLocalizationService()
{ {
@ -32,6 +31,6 @@ public class CachedLocalizationService : ISingletonDependency
{ {
return LocalizationDictionary return LocalizationDictionary
.Where(kv => serviceNamesWithCulture.Contains(kv.Key)) .Where(kv => serviceNamesWithCulture.Contains(kv.Key))
.ToImmutableDictionary(); .ToDictionary();
} }
} }

56
gateways/web/src/EShopOnAbp.WebGateway/Aggregations/LocalizationAggregation.cs

@ -1,14 +1,9 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks; using System.Threading.Tasks;
using EShopOnAbp.WebGateway.Aggregations.Localization; using EShopOnAbp.WebGateway.Aggregations.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
namespace EShopOnAbp.WebGateway.Aggregations; namespace EShopOnAbp.WebGateway.Aggregations;
@ -29,36 +24,51 @@ public class LocalizationAggregation : ILocalizationAggregation
public async Task<ApplicationLocalizationDto> GetLocalizationAsync(LocalizationRequest input) public async Task<ApplicationLocalizationDto> GetLocalizationAsync(LocalizationRequest input)
{ {
//Temp list // Check the cache service
Dictionary<string, string> services = new Dictionary<string, string>() var cachedLocalization = _cachedLocalizationService.GetMultipleLocalizationsAsync(input.LocalizationEndpoints.Keys.ToArray());
{
{ "Administration_tr", "https://localhost:44353/api/abp/application-localization?cultureName=tr&onlyDynamics=false" },
{ "Catalog_tr", "https://localhost:44354/api/abp/application-localization?cultureName=tr&onlyDynamics=false" }
};
// Check the cache
var cachedLocalization = _cachedLocalizationService.GetMultipleLocalizationsAsync(services.Keys.ToArray());
// Compare cache with input service list // Compare cache with input service list
var missingLocalizationKeys = GetMissingLocalizations(cachedLocalization, input.LocalizationEndpoints);
// Make request to remote localization service if (missingLocalizationKeys.Count != 0)
var remoteLocalizationResults = await _remoteLocalizationService.GetMultipleLocalizationsAsync(services); {
// Make request to remote localization service
var remoteLocalizationResults = await _remoteLocalizationService
.GetMultipleLocalizationsAsync(input.LocalizationEndpoints
.Where(kv=> missingLocalizationKeys.Contains(kv.Key))
.ToDictionary(k=>k.Key,v=>v.Value));
foreach (var result in remoteLocalizationResults)
{
_cachedLocalizationService.AddOrUpdate(result.Key, result.Value);
}
cachedLocalization = _cachedLocalizationService.GetMultipleLocalizationsAsync(input.LocalizationEndpoints.Keys.ToArray());
}
//merge result //merge result
ApplicationLocalizationDto mergedResult = MergeLocalizations(remoteLocalizationResults); ApplicationLocalizationDto mergedResult = MergeLocalizations(cachedLocalization);
//return result //return result
return mergedResult; return mergedResult;
} }
private ApplicationLocalizationDto MergeLocalizations(Dictionary<string, ApplicationLocalizationDto> localizationResults) private List<string> GetMissingLocalizations(IDictionary<string,ApplicationLocalizationDto> serviceNameWithLocalization, Dictionary<string,string> serviceNameWithUrls)
{
List<string> missingKeysInCache = serviceNameWithUrls.Keys.Except(serviceNameWithLocalization.Keys).ToList();
List<string> missingKeysInUrls = serviceNameWithLocalization.Keys.Except(serviceNameWithUrls.Keys).ToList();
return missingKeysInCache.Concat(missingKeysInUrls).ToList();
}
private ApplicationLocalizationDto MergeLocalizations(IDictionary<string, ApplicationLocalizationDto> localizationResults)
{ {
var localizationDto = new ApplicationLocalizationDto(); var localizationDto = new ApplicationLocalizationDto();
//TODO: fix
foreach (var localizationResult in localizationResults) foreach (var localization in localizationResults)
{ {
localizationDto.Resources.AddIfNotContains(localizationResult.Value.Resources); foreach (var resource in localization.Value.Resources)
{
localizationDto.Resources.TryAdd(resource.Key, resource.Value);
}
} }
return localizationDto; return localizationDto;

2
gateways/web/src/EShopOnAbp.WebGateway/EShopOnAbpWebGatewayModule.cs

@ -8,6 +8,7 @@ using Microsoft.Extensions.Hosting;
using System; using System;
using System.Linq; using System.Linq;
using EShopOnAbp.WebGateway.Aggregations; using EShopOnAbp.WebGateway.Aggregations;
using EShopOnAbp.WebGateway.Aggregations.Localization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
@ -69,6 +70,7 @@ public class EShopOnAbpWebGatewayModule : AbpModule
} }
app.UseCorrelationId(); app.UseCorrelationId();
app.UseCors();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseAuthorization(); app.UseAuthorization();

7
gateways/web/src/EShopOnAbp.WebGateway/ReverseProxyBuilderExtensions.cs

@ -1,21 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Text.Json; using System.Text.Json;
using EShopOnAbp.WebGateway.Aggregations; using EShopOnAbp.WebGateway.Aggregations;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Yarp.ReverseProxy.Configuration; using Yarp.ReverseProxy.Configuration;
namespace EShopOnAbp.WebGateway; namespace EShopOnAbp.WebGateway;
public static class ReverseProxyBuilderExtensions public static class ReverseProxyBuilderExtensions
{ {
public static string LocalizationPath = "/api/abp/application-localization?cultureName=tr&onlyDynamics=false"; public static string LocalizationPath = "api/abp/application-localization";
public static ReverseProxyConventionBuilder MapReverseProxyWithLocalization(this IEndpointRouteBuilder endpoints) public static ReverseProxyConventionBuilder MapReverseProxyWithLocalization(this IEndpointRouteBuilder endpoints)
{ {
@ -53,11 +51,12 @@ public static class ReverseProxyBuilderExtensions
context.Request.Query.TryGetValue("CultureName", out var cultureName); context.Request.Query.TryGetValue("CultureName", out var cultureName);
var input = new LocalizationRequest(cultureName); var input = new LocalizationRequest(cultureName);
string path = $"{LocalizationPath}?cultureName={cultureName}&onlyDynamics=false";
var clusterList = GetClusters(proxyConfig); var clusterList = GetClusters(proxyConfig);
foreach (var cluster in clusterList) foreach (var cluster in clusterList)
{ {
var hostUrl = new Uri(cluster.Value.Address) + $"{LocalizationPath}"; var hostUrl = new Uri(cluster.Value.Address) + $"{path}";
input.LocalizationEndpoints.Add($"{cluster.Key}_{cultureName}", hostUrl); input.LocalizationEndpoints.Add($"{cluster.Key}_{cultureName}", hostUrl);
} }

Loading…
Cancel
Save