From 63e20bb07f4edb88766eb503fea45bdfbbd43c77 Mon Sep 17 00:00:00 2001 From: ericuss Date: Wed, 28 Aug 2019 14:12:57 +0200 Subject: [PATCH] refactor mobile bff --- docker-compose.override.yml | 1 + .../aggregator/Config/UrlsConfig.cs | 1 + .../aggregator/Services/BasketService.cs | 52 ++++--------- .../aggregator/Services/CatalogService.cs | 26 ++++--- .../aggregator/Services/GrpcCallerService.cs | 73 +++++++++++++++++++ .../aggregator/Services/OrderingService.cs | 43 +++-------- .../aggregator/appsettings.json | 5 -- .../aggregator/appsettings.localhost.json | 1 + .../aggregator/Services/CatalogService.cs | 16 ++-- 9 files changed, 125 insertions(+), 93 deletions(-) create mode 100644 src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/GrpcCallerService.cs diff --git a/docker-compose.override.yml b/docker-compose.override.yml index a8fce70ba..8bd11cb91 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -286,6 +286,7 @@ services: - urls__orders=http://ordering.api - urls__identity=http://identity.api - urls__grpcBasket=http://10.0.75.1:5580 + - urls__grpcCatalog=http://10.0.75.1:9101 - urls__grpcOrdering=http://10.0.75.1:5581 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs index 7fd7cb5f3..c0bb9502e 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs @@ -28,6 +28,7 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config public string Catalog { get; set; } public string Orders { get; set; } public string GrpcBasket { get; set; } + public string GrpcCatalog { get; set; } public string GrpcOrdering { get; set; } } } diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs index fa1fc9ffe..80846ca3d 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs @@ -27,50 +27,28 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services public async Task GetById(string id) { - 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.GrpcBasket, async httpClient => { - httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }; - using (var httpClient = new HttpClient(httpClientHandler)) - { - //httpClient.BaseAddress = new Uri("http://10.0.75.1:5580"); - httpClient.BaseAddress = new Uri(_urls.GrpcBasket); - - _logger.LogDebug("Creating grpc client for basket {@httpClient.BaseAddress} ", httpClient.BaseAddress); - - var client = GrpcClient.Create(httpClient); - - _logger.LogDebug("grpc client created, request = {@id}", id); - - try - { - - var response = await client.GetBasketByIdAsync(new BasketRequest { Id = id }); + var client = GrpcClient.Create(httpClient); + _logger.LogDebug("grpc client created, request = {@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); - } - catch (RpcException e) - { - _logger.LogError($"Error calling via grpc: {e.Status} - {e.Message}"); - } - } - } - - return null; + return MapToBasketData(response); + }); } public async Task UpdateAsync(BasketData currentBasket) { - _httpClient.BaseAddress = new Uri(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket()); - - var client = GrpcClient.Create(_httpClient); - var request = MapToCustomerBasketRequest(currentBasket); + await GrpcCallerService.CallService(_urls.GrpcBasket, async httpClient => + { + var client = GrpcClient.Create(httpClient); + _logger.LogDebug("Grpc update basket currentBasket {@currentBasket}", currentBasket); + var request = MapToCustomerBasketRequest(currentBasket); + _logger.LogDebug("Grpc update basket request {@request}", request); - await client.UpdateBasketAsync(request); + return client.UpdateBasketAsync(request); + }); } private BasketData MapToBasketData(CustomerBasketResponse customerBasketRequest) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs index fbcc8349b..b03ad9bab 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs @@ -3,9 +3,8 @@ using Grpc.Net.Client; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using System; using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Threading.Tasks; using static CatalogApi.Catalog; @@ -25,21 +24,26 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services public async Task GetCatalogItemAsync(int id) { - _httpClient.BaseAddress = new Uri(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); - var client = GrpcClient.Create(_httpClient); - var request = new CatalogItemRequest { Id = id }; - var response = await client.GetItemByIdAsync(request); - - return MapToCatalogItemResponse(response); + return await GrpcCallerService.CallService(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id), async httpClient => + { + var client = GrpcClient.Create(_httpClient); + var request = new CatalogItemRequest { Id = id }; + var response = await client.GetItemByIdAsync(request); + return MapToCatalogItemResponse(response); + }); } public async Task> GetCatalogItemsAsync(IEnumerable ids) { - var stringContent = await _httpClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); - var catalogItems = JsonConvert.DeserializeObject(stringContent); - return catalogItems; + return await GrpcCallerService.CallService(_urls.GrpcCatalog, async httpClient => + { + var client = GrpcClient.Create(httpClient); + var request = new CatalogItemsRequest { Ids = string.Join(",", ids), PageIndex = 1, PageSize = 10 }; + var response = await client.GetItemsByIdsAsync(request); + return response.Data.Select(this.MapToCatalogItemResponse); + }); } private CatalogItem MapToCatalogItemResponse(CatalogItemResponse catalogItemResponse) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/GrpcCallerService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/GrpcCallerService.cs new file mode 100644 index 000000000..e730be327 --- /dev/null +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/GrpcCallerService.cs @@ -0,0 +1,73 @@ +using System.Net.Http; +using System.Threading.Tasks; +using System; +using Grpc.Core; +using Serilog; + +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services +{ + public static class GrpcCallerService + { + public static async Task CallService(string urlGrpc, Func> func) + { + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); + + using var httpClientHandler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; } + }; + + 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.Http2Support", false); + + return default; + } + + public static async Task CallService(string urlGrpc, Func func) + { + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); + + using var httpClientHandler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; } + }; + + using var httpClient = new HttpClient(httpClientHandler) + { + BaseAddress = new Uri(urlGrpc) + }; + + Log.Debug("Creating grpc client base address {@httpClient.BaseAddress} ", httpClient.BaseAddress); + + 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.Http2Support", false); + } + } +} diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderingService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderingService.cs index f1e56c2ef..d42c14344 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderingService.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderingService.cs @@ -3,12 +3,10 @@ using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using System; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using GrpcOrdering; -using Grpc.Core; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { @@ -27,43 +25,21 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services public async Task 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); + var client = GrpcClient.Create(httpClient); + _logger.LogDebug(" grpc client created, basketData={@basketData}", basketData); - _logger.LogDebug(" Creating grpc client for ordering {@httpClient.BaseAddress}", httpClient.BaseAddress); + var command = MapToOrderDraftCommand(basketData); + var response = await client.CreateOrderDraftFromBasketDataAsync(command); + _logger.LogDebug(" grpc response: {@response}", response); - var client = GrpcClient.Create(httpClient); - - _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); - } - catch (RpcException e) - { - _logger.LogError($"Error calling via grpc to ordering: {e.Status} - {e.Message}"); - } - } - } - - return null; + return MapToResponse(response, basketData); + }); } - private OrderData MapToResponse(GrpcOrdering.OrderDraftDTO orderDraft) + private OrderData MapToResponse(GrpcOrdering.OrderDraftDTO orderDraft, BasketData basketData) { if (orderDraft == null) { @@ -72,6 +48,7 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services var data = new OrderData { + Buyer = basketData.BuyerId, Total = (decimal)orderDraft.Total, }; diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json index 95b8bad4c..26bb0ac7a 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json @@ -1,9 +1,4 @@ { - "Kestrel": { - "EndpointDefaults": { - "Protocols": "Http2" - } - }, "Logging": { "IncludeScopes": false, "Debug": { diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json index f14ca24b9..86fd1541d 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json @@ -5,6 +5,7 @@ "orders": "http://localhost:55102", "identity": "http://localhost:55105", "grpcBasket": "http://localhost:5580", + "grpcCatalog": "http://localhost:81", "grpcOrdering": "http://localhost:5581" }, "IdentityUrlExternal": "http://localhost:5105", diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs index 5e3e4e2f0..a03c67db2 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs @@ -28,13 +28,15 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services public async Task GetCatalogItemAsync(int id) { - _httpClient.BaseAddress = new Uri(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); - - var client = GrpcClient.Create(_httpClient); - var request = new CatalogItemRequest { Id = id }; - var response = await client.GetItemByIdAsync(request); - - return MapToCatalogItemResponse(response); + return await GrpcCallerService.CallService(_urls.GrpcCatalog, async httpClient => + { + var client = GrpcClient.Create(httpClient); + var request = new CatalogItemRequest { Id = id }; + _logger.LogInformation("grpc client created, request = {@request}", request); + var response = await client.GetItemByIdAsync(request); + _logger.LogInformation("grpc response {@response}", response); + return MapToCatalogItemResponse(response); + }); } public async Task> GetCatalogItemsAsync(IEnumerable ids)