Browse Source

refactored the grpc client

features/migration-dotnet3
ericuss 5 years ago
parent
commit
454525d517
4 changed files with 58 additions and 138 deletions
  1. +4
    -41
      src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs
  2. +8
    -31
      src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs
  3. +36
    -34
      src/ApiGateways/Web.Bff.Shopping/aggregator/Services/GrpcCallerService.cs
  4. +10
    -32
      src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderingService.cs

+ 4
- 41
src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs View File

@ -2,41 +2,35 @@
using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Grpc.Net.Client; using Grpc.Net.Client;
using System;
using System.Linq; using System.Linq;
using GrpcBasket; using GrpcBasket;
using Grpc.Core;
using System.Net.Http;
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
{ {
public class BasketService : IBasketService public class BasketService : IBasketService
{ {
private readonly HttpClient _httpClient;
private readonly UrlsConfig _urls; private readonly UrlsConfig _urls;
public readonly HttpClient _httpClient;
private readonly ILogger<BasketService> _logger; private readonly ILogger<BasketService> _logger;
public BasketService(HttpClient httpClient, IOptions<UrlsConfig> config, ILogger<BasketService> logger) public BasketService(HttpClient httpClient, IOptions<UrlsConfig> config, ILogger<BasketService> logger)
{ {
_httpClient = httpClient;
_urls = config.Value; _urls = config.Value;
_httpClient = httpClient;
_logger = logger; _logger = logger;
} }
public async Task<BasketData> GetById(string id) public async Task<BasketData> GetById(string id)
{ {
return await GrpcCallerService.CallService(_urls.GrpcBasket, async httpClient => return await GrpcCallerService.CallService(_urls.GrpcBasket, async httpClient =>
{ {
_logger.LogWarning("######################## grpc client created, request = {@id}", id);
var client = GrpcClient.Create<Basket.BasketClient>(httpClient); var client = GrpcClient.Create<Basket.BasketClient>(httpClient);
_logger.LogDebug("grpc client created, request = {@id}", id); _logger.LogDebug("grpc client created, request = {@id}", id);
var response = await client.GetBasketByIdAsync(new BasketRequest { Id = id }); var response = await client.GetBasketByIdAsync(new BasketRequest { Id = id });
_logger.LogDebug("grpc response {@response}", response); _logger.LogDebug("grpc response {@response}", response);
return MapToBasketData(response); return MapToBasketData(response);
@ -54,37 +48,6 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
return client.UpdateBasketAsync(request); return client.UpdateBasketAsync(request);
}); });
//AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
//AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);
//using (var httpClientHandler = new HttpClientHandler())
//{
// httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
// using (var httpClient = new HttpClient(httpClientHandler))
// {
// httpClient.BaseAddress = new Uri(_urls.GrpcBasket);
// _logger.LogDebug("Creating grpc client for basket {@httpClient.BaseAddress} ", httpClient.BaseAddress);
// var client = GrpcClient.Create<Basket.BasketClient>(httpClient);
// try
// {
// _logger.LogDebug("Grpc update basket currentBasket {@currentBasket}", currentBasket);
// var request = MapToCustomerBasketRequest(currentBasket);
// _logger.LogDebug("Grpc update basket request {@request}", request);
// await client.UpdateBasketAsync(request);
// }
// catch (RpcException e)
// {
// _logger.LogError($"Error calling via grpc: {e.Status} - {e.Message}");
// }
// }
//}
} }
private BasketData MapToBasketData(CustomerBasketResponse customerBasketRequest) private BasketData MapToBasketData(CustomerBasketResponse customerBasketRequest)


+ 8
- 31
src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs View File

@ -2,7 +2,6 @@
using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -11,7 +10,6 @@ using Grpc.Net.Client;
using System; using System;
using static CatalogApi.Catalog; using static CatalogApi.Catalog;
using System.Linq; using System.Linq;
using Grpc.Core;
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
{ {
@ -41,36 +39,15 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
public async Task<IEnumerable<CatalogItem>> GetCatalogItemsAsync(IEnumerable<int> ids) public async Task<IEnumerable<CatalogItem>> GetCatalogItemsAsync(IEnumerable<int> ids)
{ {
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);
using (var httpClientHandler = new HttpClientHandler())
return await GrpcCallerService.CallService(_urls.GrpcCatalog, async httpClient =>
{ {
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
using (var httpClient = new HttpClient(httpClientHandler))
{
httpClient.BaseAddress = new Uri(_urls.GrpcCatalog);
_logger.LogInformation("Creating grpc client for CatalogClient {@httpClient.BaseAddress}, {@httpClient} ", httpClient.BaseAddress, httpClient);
try
{
var client = GrpcClient.Create<CatalogClient>(httpClient);
var request = new CatalogItemsRequest { Ids = string.Join(",", ids), PageIndex = 1, PageSize = 10 };
_logger.LogInformation("grpc client created, request = {@request}", request);
var response = await client.GetItemsByIdsAsync(request);
_logger.LogInformation("grpc response {@response}", response);
return response.Data.Select(this.MapToCatalogItemResponse);
}
catch (RpcException e)
{
_logger.LogError($"Error calling via grpc: {e.Status} - {e.Message}");
}
}
}
return null;
var client = GrpcClient.Create<CatalogClient>(httpClient);
var request = new CatalogItemsRequest { Ids = string.Join(",", ids), PageIndex = 1, PageSize = 10 };
_logger.LogInformation("grpc client created, request = {@request}", request);
var response = await client.GetItemsByIdsAsync(request);
_logger.LogInformation("grpc response {@response}", response);
return response.Data.Select(this.MapToCatalogItemResponse);
});
} }
private CatalogItem MapToCatalogItemResponse(CatalogItemResponse catalogItemResponse) private CatalogItem MapToCatalogItemResponse(CatalogItemResponse catalogItemResponse)


+ 36
- 34
src/ApiGateways/Web.Bff.Shopping/aggregator/Services/GrpcCallerService.cs View File

@ -8,28 +8,30 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
{ {
public static class GrpcCallerService public static class GrpcCallerService
{ {
public static Task<TResponse> CallService<TResponse>(string urlGrpc, Func<HttpClient, Task<TResponse>> func)
public static async Task<TResponse> CallService<TResponse>(string urlGrpc, Func<HttpClient, Task<TResponse>> func)
{ {
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);
using (>n class="kt">var httpClientHandler = new HttpClientHandler())
using var httpClientHandler = new HttpClientHandler
{ {
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
using (var httpClient = new HttpClient(httpClientHandler))
{
httpClient.BaseAddress = new Uri(urlGrpc);
Log.Debug("Creating grpc client base address {@httpClient.BaseAddress} ", httpClient.BaseAddress);
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
};
try
{
return func(httpClient);
}
catch (RpcException e)
{
Log.Error($"Error calling via grpc: {e.Status} - {e.Message}");
}
}
using var httpClient = new HttpClient(httpClientHandler)
{
BaseAddress = new Uri(urlGrpc)
};
Log.Information("Creating grpc client base address urlGrpc ={@urlGrpc}, BaseAddress={@BaseAddress} ", urlGrpc, httpClient.BaseAddress);
try
{
return await func(httpClient);
}
catch (RpcException e)
{
Log.Error($"Error calling via grpc: {e.Status} - {e.Message}");
} }
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", false); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", false);
@ -38,34 +40,34 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
return default; return default;
} }
public static Task CallService(string urlGrpc, Func<HttpClient, Task> func)
public static async Task CallService(string urlGrpc, Func<HttpClient, Task> func)
{ {
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);
using (var httpClientHandler = new HttpClientHandler())
using var httpClientHandler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
};
using var httpClient = new HttpClient(httpClientHandler)
{ {
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
using (var httpClient = new HttpClient(httpClientHandler))
{
httpClient.BaseAddress = new Uri(urlGrpc);
Log.Debug("Creating grpc client base address {@httpClient.BaseAddress} ", httpClient.BaseAddress);
BaseAddress = new Uri(urlGrpc)
};
Log.Debug("Creating grpc client base address {@httpClient.BaseAddress} ", httpClient.BaseAddress);
try
{
return func(httpClient);
}
catch (RpcException e)
{
Log.Error($"Error calling via grpc: {e.Status} - {e.Message}");
}
}
try
{
await func(httpClient);
}
catch (RpcException e)
{
Log.Error($"Error calling via grpc: {e.Status} - {e.Message}");
} }
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", false); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", false);
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", false); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", false);
return default;
} }
} }
} }

+ 10
- 32
src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderingService.cs View File

@ -14,52 +14,30 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services
{ {
public class OrderingService : IOrderingService public class OrderingService : IOrderingService
{ {
private readonly HttpClient _httpClient;
private readonly UrlsConfig _urls; private readonly UrlsConfig _urls;
private readonly ILogger<OrderingService> _logger; private readonly ILogger<OrderingService> _logger;
public readonly HttpClient _httpClient;
public OrderingService(HttpClient httpClient, IOptions<UrlsConfig> config, ILogger<OrderingService> logger) public OrderingService(HttpClient httpClient, IOptions<UrlsConfig> config, ILogger<OrderingService> logger)
{ {
_httpClient = httpClient;
_urls = config.Value; _urls = config.Value;
_httpClient = httpClient;
_logger = logger; _logger = logger;
} }
public async Task<OrderData> GetOrderDraftAsync(BasketData basketData) public async Task<OrderData> GetOrderDraftAsync(BasketData basketData)
{ {
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);
using (var httpClientHandler = new HttpClientHandler())
return await GrpcCallerService.CallService(_urls.GrpcOrdering, async httpClient =>
{ {
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
using (var httpClient = new HttpClient(httpClientHandler))
{
httpClient.BaseAddress = new Uri(_urls.GrpcOrdering);
_logger.LogDebug(" Creating grpc client for ordering {@httpClient.BaseAddress}", httpClient.BaseAddress);
var client = GrpcClient.Create<OrderingGrpc.OrderingGrpcClient>(httpClient);
var client = GrpcClient.Create<OrderingGrpc.OrderingGrpcClient>(httpClient);
_logger.LogDebug(" grpc client created, basketData={@basketData}", basketData);
_logger.LogDebug(" grpc client created, basketData={@basketData}", basketData);
try
{
var command = MapToOrderDraftCommand(basketData);
var response = await client.CreateOrderDraftFromBasketDataAsync(command);
_logger.LogDebug(" grpc response: {@response}", response);
return MapToResponse(response, basketData);
}
catch (RpcException e)
{
_logger.LogError($"Error calling via grpc to ordering: {e.Status} - {e.Message}");
}
}
}
var command = MapToOrderDraftCommand(basketData);
var response = await client.CreateOrderDraftFromBasketDataAsync(command);
_logger.LogDebug(" grpc response: {@response}", response);
return null;
return MapToResponse(response, basketData);
});
} }
private OrderData MapToResponse(GrpcOrdering.OrderDraftDTO orderDraft, BasketData basketData) private OrderData MapToResponse(GrpcOrdering.OrderDraftDTO orderDraft, BasketData basketData)


Loading…
Cancel
Save