Skip to content

Commit 21dbb98

Browse files
committed
2 parents a793608 + 6396e0f commit 21dbb98

16 files changed

Lines changed: 71 additions & 86 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,4 @@ pub/
269269
.mfractor
270270

271271
# Ignore HealthCheckdb
272-
*healthchecksdb*
272+
*healthchecksdb*

README.md

Lines changed: 12 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,66 +5,21 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplif
55

66
Dev branch contains the latest "stable" code, and their images are tagged with `:dev` in our [Docker Hub](https://cloud.docker.com/u/eshop/repository/list):
77

8-
Api Gateways base image
8+
| Basket API | Catalog API | Identity API | Location API |
9+
| ------------- | ------------- | ------------- | ------------- |
10+
| [![Basket API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/basket?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=199&branchName=dev) | [![Catalog API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/catalog?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=197&branchName=dev) | [![Identity API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/identity?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=200&branchName=dev) | [![Location API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/location?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=202&branchName=dev) |
911

10-
[![Api Gateways base image](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/apigws?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=201&branchName=dev)
12+
| Marketing API | Ordering API | Payment API | Api Gateways base image |
13+
| ------------- | ------------- | ------------- | ------------- |
14+
| [![Marketing API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/marketing?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=203&branchName=dev) | [![Ordering API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/ordering?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=198&branchName=dev) | [![Payment API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/payment?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=205&branchName=dev) | [![Api Gateways base image](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/apigws?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=201&branchName=dev)
1115

12-
Basket API
13-
14-
[![Basket API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/basket?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=199&branchName=dev)
15-
16-
Catalog API
17-
18-
[![Catalog API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/catalog?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=197&branchName=dev)
19-
20-
Identity API
21-
22-
[![Identity API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/identity?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=200&branchName=dev)
23-
24-
Location API
25-
26-
[![Location API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/location?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=202&branchName=dev)
27-
28-
Marketing API
29-
30-
[![Marketing API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/marketing?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=203&branchName=dev)
31-
32-
Ordering API
33-
34-
[![Ordering API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/ordering?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=198&branchName=dev)
35-
36-
Payment API
37-
38-
[![Payment API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/payment?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=205&branchName=dev)
39-
40-
Webhooks API
41-
42-
[![Webhooks API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=207&branchName=dev)
43-
44-
Web Shopping Aggregator
45-
46-
[![Web Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/web-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=206&branchName=dev)
47-
48-
Mobile Shopping Aggregator
49-
50-
[![Mobile Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/mobile-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=204&branchName=dev)
51-
52-
Webbhooks demo client
53-
54-
[![Webhooks demo client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks-client?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=208&branchName=dev)
55-
56-
WebMVC Client
57-
58-
[![WebMVC Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webmvc?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=209&branchName=dev)
59-
60-
WebSPA Client
61-
62-
[![WebSPA Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webspa?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=210&branchName=dev)
63-
64-
Web Status
65-
66-
[![Web Status](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webstatus?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=211&branchName=dev)
16+
| Web Shopping Aggregator | Mobile Shopping Aggregator | WebMVC Client | WebSPA Client |
17+
| ------------- | ------------- | ------------- | ------------- |
18+
| [![Web Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/web-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=206&branchName=dev) | [![Mobile Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/mobile-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=204&branchName=dev) | [![WebMVC Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webmvc?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=209&branchName=dev) | [![WebSPA Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webspa?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=210&branchName=dev) |
6719

20+
| Web Status | Webhooks API | Webbhooks demo client |
21+
| ------------- | ------------- | ------------- |
22+
[![Web Status](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webstatus?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=211&branchName=dev) | [![Webhooks API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=207&branchName=dev) | [![Webhooks demo client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks-client?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=208&branchName=dev) |
6823

6924
## IMPORTANT NOTES!
7025
**You can use either the latest version of Visual Studio or simply Docker CLI and .NET CLI for Windows, Mac and Linux**.

src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -178,27 +178,46 @@ private void StartBasicConsume()
178178
{
179179
if (_consumerChannel != null)
180180
{
181-
var consumer = new EventingBasicConsumer(_consumerChannel);
182-
consumer.Received += async (model, ea) =>
183-
{
184-
var eventName = ea.RoutingKey;
185-
var message = Encoding.UTF8.GetString(ea.Body);
186-
187-
await ProcessEvent(eventName, message);
181+
var consumer = new AsyncEventingBasicConsumer(_consumerChannel);
188182

189-
_consumerChannel.BasicAck(ea.DeliveryTag, multiple: false);
190-
};
183+
consumer.Received += Consumer_Received;
191184

192-
_consumerChannel.BasicConsume(queue: _queueName,
193-
autoAck: false,
194-
consumer: consumer);
185+
_consumerChannel.BasicConsume(
186+
queue: _queueName,
187+
autoAck: false,
188+
consumer: consumer);
195189
}
196190
else
197191
{
198-
_logger.LogError("StartBasicConsume can not call on _consumerChannelCreated == false");
192+
_logger.LogError("StartBasicConsume can't call on _consumerChannel == null");
199193
}
200194
}
201195

196+
private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventArgs)
197+
{
198+
var eventName = eventArgs.RoutingKey;
199+
var message = Encoding.UTF8.GetString(eventArgs.Body);
200+
201+
try
202+
{
203+
if (message.ToLowerInvariant().Contains("throw-fake-exception"))
204+
{
205+
throw new InvalidOperationException($"Fake exception requested: \"{message}\"");
206+
}
207+
208+
await ProcessEvent(eventName, message);
209+
}
210+
catch (Exception ex)
211+
{
212+
_logger.LogWarning(ex, "----- ERROR Processing message \"{Message}\"", message);
213+
}
214+
215+
// Even on exception we take the message off the queue.
216+
// in a REAL WORLD app this should be handled with a Dead Letter Exchange (DLX).
217+
// For more information see: https://www.rabbitmq.com/dlx.html
218+
_consumerChannel.BasicAck(eventArgs.DeliveryTag, multiple: false);
219+
}
220+
202221
private IModel CreateConsumerChannel()
203222
{
204223
if (!_persistentConnection.IsConnected)
@@ -209,7 +228,7 @@ private IModel CreateConsumerChannel()
209228
var channel = _persistentConnection.CreateModel();
210229

211230
channel.ExchangeDeclare(exchange: BROKER_NAME,
212-
type: "direct");
231+
type: "direct");
213232

214233
channel.QueueDeclare(queue: _queueName,
215234
durable: true,

src/Services/Basket/Basket.API/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
105105

106106
var factory = new ConnectionFactory()
107107
{
108-
HostName = Configuration["EventBusConnection"]
108+
HostName = Configuration["EventBusConnection"],
109+
DispatchConsumersAsync = true
109110
};
110111

111112
if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))

src/Services/Catalog/Catalog.API/Model/CatalogItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public int RemoveStock(int quantityDesired)
6464

6565
if (quantityDesired <= 0)
6666
{
67-
throw new CatalogDomainException($"Item units desired should be greater than cero");
67+
throw new CatalogDomainException($"Item units desired should be greater than zero");
6868
}
6969

7070
int removed = Math.Min(quantityDesired, this.AvailableStock);

src/Services/Catalog/Catalog.API/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ public static IServiceCollection AddIntegrationServices(this IServiceCollection
297297

298298
var factory = new ConnectionFactory()
299299
{
300-
HostName = configuration["EventBusConnection"]
300+
HostName = configuration["EventBusConnection"],
301+
DispatchConsumersAsync = true
301302
};
302303

303304
if (!string.IsNullOrEmpty(configuration["EventBusUserName"]))

src/Services/Identity/Identity.API/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
Sample reference containerized application, cross-platform and microservices architecture.
33
Powered by Microsoft
44

5-
#Overview
5+
## Overview
66
This sample runs a microservices oriented application and a .net core Mvc application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution.
77

8-
#Setup
8+
## Setup
99
This service is a identity provider or STS (Security Token Service) currently implemented with IdentityServer 4 wrapping ASP.NET Identity underneath.
1010

1111
Check procedures on how to get the sample app started at the Wiki:

src/Services/Location/Locations.API/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
7777

7878
var factory = new ConnectionFactory()
7979
{
80-
HostName = Configuration["EventBusConnection"]
80+
HostName = Configuration["EventBusConnection"],
81+
DispatchConsumersAsync = true
8182
};
8283

8384
if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))

src/Services/Marketing/Marketing.API/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
101101

102102
var factory = new ConnectionFactory()
103103
{
104-
HostName = Configuration["EventBusConnection"]
104+
HostName = Configuration["EventBusConnection"],
105+
DispatchConsumersAsync = true
105106
};
106107

107108
if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))

src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ public async Task<ActionResult> GetOrderAsync(int orderId)
105105
{
106106
try
107107
{
108+
//Todo: It's good idea to take advantage of GetOrderByIdQuery and handle by GetCustomerByIdQueryHandler
109+
//var order customer = await _mediator.Send(new GetOrderByIdQuery(orderId));
108110
var order = await _orderQueries.GetOrderAsync(orderId);
109111

110112
return Ok(order);
@@ -149,4 +151,4 @@ public async Task<ActionResult<OrderDraftDTO>> CreateOrderDraftFromBasketDataAsy
149151
return await _mediator.Send(createOrderDraftCommand);
150152
}
151153
}
152-
}
154+
}

0 commit comments

Comments
 (0)