Browse Source

api-gateway add provider for file in memory

pull/897/head
Erik Pique 6 years ago
parent
commit
69f0b4393d
13 changed files with 101 additions and 37 deletions
  1. +7
    -7
      ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Controllers/ConfigurationController.cs
  2. +1
    -1
      ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/Channel.cs
  3. +1
    -1
      ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ChannelType.cs
  4. +7
    -7
      ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Controllers/ConfigurationController.cs
  5. +1
    -1
      ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/Channel.cs
  6. +1
    -1
      ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/ChannelType.cs
  7. +13
    -0
      src/ApiGateways/ApiGw-Base/Models/ServiceFabricSettings.cs
  8. +1
    -7
      src/ApiGateways/ApiGw-Base/Orchestrators/Kubernetes.cs
  9. +5
    -0
      src/ApiGateways/ApiGw-Base/Orchestrators/ServiceFabric.cs
  10. +28
    -0
      src/ApiGateways/ApiGw-Base/Providers/InMemoryFile.cs
  11. +18
    -0
      src/ApiGateways/ApiGw-Base/Providers/InMemoryFileProvider.cs
  12. +13
    -12
      src/ApiGateways/ApiGw-Base/Services/SettingService.cs
  13. +5
    -0
      src/ApiGateways/ApiGw-Base/Startup.cs

+ 7
- 7
ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Controllers/ConfigurationController.cs View File

@ -11,20 +11,20 @@ namespace ApiGw_Base.Controllers
public class ConfigurationController : ControllerBase public class ConfigurationController : ControllerBase
{ {
[HttpGet("mobile/marketing")] [HttpGet("mobile/marketing")]
public IActionResult MobileMarketing() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Marketing);
public IActionResult MobileMarketing() => ReadConfigurationFile(Channel.Mobile, ChannelType.Marketing);
[HttpGet("mobile/shopping")] [HttpGet("mobile/shopping")]
public IActionResult MobileShopping() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Shopping);
public IActionResult MobileShopping() => ReadConfigurationFile(Channel.Mobile, ChannelType.Shopping);
[HttpGet("web/marketing")] [HttpGet("web/marketing")]
public IActionResult WebMarketing() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Marketing);
public IActionResult WebMarketing() => ReadConfigurationFile(Channel.Web, ChannelType.Marketing);
[HttpGet("web/shopping")] [HttpGet("web/shopping")]
public IActionResult WebShopping() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Shopping);
public IActionResult WebShopping() => ReadConfigurationFile(Channel.Web, ChannelType.Shopping);
private IActionResult ReadConfigurationFile(ConfigurationType configurationType, ConfigurationBffType configurationBffType)
private IActionResult ReadConfigurationFile(Channel channel, ChannelType channelType)
{ {
var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{configurationType}.Bff.{configurationBffType}.json";
var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{channel}.Bff.{channelType}.json";
using (var streamReader = new StreamReader(path, Encoding.UTF8)) using (var streamReader = new StreamReader(path, Encoding.UTF8))
{ {
@ -32,7 +32,7 @@ namespace ApiGw_Base.Controllers
if (string.IsNullOrWhiteSpace(jsonString)) if (string.IsNullOrWhiteSpace(jsonString))
{ {
return BadRequest($"Configuration file 'configuration.{configurationType}.Bff.{configurationBffType}.json' not found");
return BadRequest($"Configuration file 'configuration.{channel}.Bff.{channelType}.json' not found");
} }
return Ok(jsonString); return Ok(jsonString);


ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationType.cs → ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/Channel.cs View File

@ -1,6 +1,6 @@
namespace ApiGw_Base.Enums namespace ApiGw_Base.Enums
{ {
public enum ConfigurationType
public enum Channel
{ {
Web, Web,
Mobile Mobile

ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationBffType.cs → ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ChannelType.cs View File

@ -1,6 +1,6 @@
namespace ApiGw_Base.Enums namespace ApiGw_Base.Enums
{ {
public enum ConfigurationBffType
public enum ChannelType
{ {
Marketing, Marketing,
Shopping Shopping

+ 7
- 7
ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Controllers/ConfigurationController.cs View File

@ -11,20 +11,20 @@ namespace ApiGw_Base.Controllers
public class ConfigurationController : ControllerBase public class ConfigurationController : ControllerBase
{ {
[HttpGet("mobile/marketing")] [HttpGet("mobile/marketing")]
public IActionResult MobileMarketing() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Marketing);
public IActionResult MobileMarketing() => ReadConfigurationFile(Channel.Mobile, ChannelType.Marketing);
[HttpGet("mobile/shopping")] [HttpGet("mobile/shopping")]
public IActionResult MobileShopping() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Shopping);
public IActionResult MobileShopping() => ReadConfigurationFile(Channel.Mobile, ChannelType.Shopping);
[HttpGet("web/marketing")] [HttpGet("web/marketing")]
public IActionResult WebMarketing() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Marketing);
public IActionResult WebMarketing() => ReadConfigurationFile(Channel.Web, ChannelType.Marketing);
[HttpGet("web/shopping")] [HttpGet("web/shopping")]
public IActionResult WebShopping() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Shopping);
public IActionResult WebShopping() => ReadConfigurationFile(Channel.Web, ChannelType.Shopping);
private IActionResult ReadConfigurationFile(ConfigurationType configurationType, ConfigurationBffType configurationBffType)
private IActionResult ReadConfigurationFile(Channel channel, ChannelType channelType)
{ {
var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{configurationType}.Bff.{configurationBffType}.json";
var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{channel}.Bff.{channelType}.json";
using (var streamReader = new StreamReader(path, Encoding.UTF8)) using (var streamReader = new StreamReader(path, Encoding.UTF8))
{ {
@ -32,7 +32,7 @@ namespace ApiGw_Base.Controllers
if (string.IsNullOrWhiteSpace(jsonString)) if (string.IsNullOrWhiteSpace(jsonString))
{ {
return BadRequest($"Configuration file 'configuration.{configurationType}.Bff.{configurationBffType}.json' not found");
return BadRequest($"Configuration file 'configuration.{channel}.Bff.{channelType}.json' not found");
} }
return Ok(jsonString); return Ok(jsonString);


ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/ConfigurationType.cs → ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/Channel.cs View File

@ -1,6 +1,6 @@
namespace ApiGw_Base.Enums namespace ApiGw_Base.Enums
{ {
public enum ConfigurationType
public enum Channel
{ {
Web, Web,
Mobile Mobile

ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/ConfigurationBffType.cs → ServiceFabric/Windows/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApiGw_Base/Enums/ChannelType.cs View File

@ -1,6 +1,6 @@
namespace ApiGw_Base.Enums namespace ApiGw_Base.Enums
{ {
public enum ConfigurationBffType
public enum ChannelType
{ {
Marketing, Marketing,
Shopping Shopping

+ 13
- 0
src/ApiGateways/ApiGw-Base/Models/ServiceFabricSettings.cs View File

@ -0,0 +1,13 @@
namespace OcelotApiGw.Models
{
public class ServiceFabricSettings
{
public string UrlMobilMarketing { get; set; }
public string UrlMobilShopping { get; set; }
public string UrlWebMarketing { get; set; }
public string UrlWebShopping { get; set; }
}
}

+ 1
- 7
src/ApiGateways/ApiGw-Base/Orchestrators/Kubernetes.cs View File

@ -1,6 +1,5 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using OcelotApiGw.Enums; using OcelotApiGw.Enums;
using System.IO;
namespace OcelotApiGw.Orchestrators namespace OcelotApiGw.Orchestrators
{ {
@ -8,11 +7,6 @@ namespace OcelotApiGw.Orchestrators
{ {
public OrchestratorType OrchestratorType => OrchestratorType.K8S; public OrchestratorType OrchestratorType => OrchestratorType.K8S;
public IConfigurationBuilder ConfigureOrchestrator(IConfigurationBuilder builder)
{
builder.AddJsonFile(Path.Combine("configuration", "configuration.json"));
return builder;
}
public IConfigurationBuilder ConfigureOrchestrator(IConfigurationBuilder builder) => builder;
} }
} }

+ 5
- 0
src/ApiGateways/ApiGw-Base/Orchestrators/ServiceFabric.cs View File

@ -1,5 +1,6 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using OcelotApiGw.Enums; using OcelotApiGw.Enums;
using OcelotApiGw.Providers;
using OcelotApiGw.Services; using OcelotApiGw.Services;
namespace OcelotApiGw.Orchestrators namespace OcelotApiGw.Orchestrators
@ -19,6 +20,10 @@ namespace OcelotApiGw.Orchestrators
{ {
var config = _settingService.GetConfiguration(); var config = _settingService.GetConfiguration();
var memoryFileProvider = new InMemoryFileProvider(config);
builder.AddJsonFile(memoryFileProvider, string.Empty, false, false);
return builder; return builder;
} }
} }


+ 28
- 0
src/ApiGateways/ApiGw-Base/Providers/InMemoryFile.cs View File

@ -0,0 +1,28 @@
using Microsoft.Extensions.FileProviders;
using System;
using System.IO;
using System.Text;
namespace OcelotApiGw.Providers
{
public class InMemoryFile : IFileInfo
{
private readonly byte[] _data;
public InMemoryFile(string data) => _data = Encoding.UTF8.GetBytes(data);
public Stream CreateReadStream() => new MemoryStream(_data);
public bool Exists { get; } = true;
public long Length => _data.Length;
public string PhysicalPath { get; } = string.Empty;
public string Name { get; } = string.Empty;
public DateTimeOffset LastModified { get; } = DateTimeOffset.UtcNow;
public bool IsDirectory { get; } = false;
}
}

+ 18
- 0
src/ApiGateways/ApiGw-Base/Providers/InMemoryFileProvider.cs View File

@ -0,0 +1,18 @@
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
namespace OcelotApiGw.Providers
{
public class InMemoryFileProvider : IFileProvider
{
private readonly IFileInfo _fileInfo;
public InMemoryFileProvider(string data) => _fileInfo = new InMemoryFile(data);
public IFileInfo GetFileInfo(string subpath) => _fileInfo;
public IDirectoryContents GetDirectoryContents(string subpath) => null;
public IChangeToken Watch(string filter) => NullChangeToken.Singleton;
}
}

+ 13
- 12
src/ApiGateways/ApiGw-Base/Services/SettingService.cs View File

@ -1,4 +1,5 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using OcelotApiGw.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -10,12 +11,12 @@ namespace OcelotApiGw.Services
public class SettingService : ISettingService public class SettingService : ISettingService
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
private readonly IConfiguration _configuration;
private readonly ServiceFabricSettings _serviceFabricSettings;
public SettingService(HttpClient httpClient, IConfiguration configuration)
public SettingService(HttpClient httpClient, IOptions<ServiceFabricSettings> serviceFabricSettings)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_configuration = configuration;
_serviceFabricSettings = serviceFabricSettings.Value;
} }
public string GetConfiguration() public string GetConfiguration()
@ -25,20 +26,20 @@ namespace OcelotApiGw.Services
var tasks = new Func<Task>[] var tasks = new Func<Task>[]
{ {
async () => { async () => {
var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("MobilMarketing"));
strings.Add(res);
var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlMobilMarketing);
strings.Add(configuration);
}, },
async () => { async () => {
var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("MobilShopping"));
strings.Add(res);
var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlMobilShopping);
strings.Add(configuration);
}, },
async () => { async () => {
var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("WebMarketing"));
strings.Add(res);
var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlWebMarketing);
strings.Add(configuration);
}, },
async () => { async () => {
var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("WebShopping"));
strings.Add(res);
var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlWebShopping);
strings.Add(configuration);
} }
}; };


+ 5
- 0
src/ApiGateways/ApiGw-Base/Startup.cs View File

@ -2,11 +2,14 @@
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Ocelot.DependencyInjection; using Ocelot.DependencyInjection;
using Ocelot.Middleware; using Ocelot.Middleware;
using OcelotApiGw.Enums; using OcelotApiGw.Enums;
using OcelotApiGw.Models;
using OcelotApiGw.Orchestrators; using OcelotApiGw.Orchestrators;
using OcelotApiGw.Providers;
using OcelotApiGw.Services; using OcelotApiGw.Services;
using System.Linq; using System.Linq;
@ -36,6 +39,7 @@ namespace OcelotApiGw
}) })
.AddTransient<IOrchestratorStrategy, Kubernetes>() .AddTransient<IOrchestratorStrategy, Kubernetes>()
.AddTransient<IOrchestratorStrategy, ServiceFabric>() .AddTransient<IOrchestratorStrategy, ServiceFabric>()
.AddTransient<IFileProvider, InMemoryFileProvider>()
.AddAuthentication() .AddAuthentication()
.AddJwtBearer(authenticationProviderKey, options => .AddJwtBearer(authenticationProviderKey, options =>
{ {
@ -47,6 +51,7 @@ namespace OcelotApiGw
}; };
}); });
services.Configure<ServiceFabricSettings>(_configuration);
services.AddHttpClient<ISettingService, SettingService>(); services.AddHttpClient<ISettingService, SettingService>();
var orchestratorType = _configuration.GetValue<OrchestratorType>("OrchestratorType"); var orchestratorType = _configuration.GetValue<OrchestratorType>("OrchestratorType");


Loading…
Cancel
Save