Skip to content

Commit abd96d2

Browse files
Merge pull request dotnet-architecture#104 from dotnet-architecture/dev
update to latest commit
2 parents 8dc243a + 21dbb98 commit abd96d2

15 files changed

Lines changed: 129 additions & 116 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**.
Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
pool:
2-
vmImage: 'ubuntu-16.04'
31
variables:
42
registryEndpoint: eshop-registry
53
trigger:
@@ -17,34 +15,66 @@ trigger:
1715
exclude:
1816
- src/ApiGateways/Mobile.Bff.Shopping/aggregator/*
1917
- src/ApiGateways/Web.Bff.Shopping/aggregator/*
20-
steps:
21-
- task: DockerCompose@0
22-
displayName: Compose build apigws
23-
inputs:
24-
dockerComposeCommand: 'build mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
25-
containerregistrytype: Container Registry
26-
dockerRegistryEndpoint: $(registryEndpoint)
27-
dockerComposeFile: docker-compose.yml
28-
qualifyImageNames: true
29-
projectName: ""
30-
dockerComposeFileArgs: |
31-
TAG=$(Build.SourceBranchName)
32-
- task: DockerCompose@0
33-
displayName: Compose push apigws
34-
inputs:
35-
dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
36-
containerregistrytype: Container Registry
37-
dockerRegistryEndpoint: $(registryEndpoint)
38-
dockerComposeFile: docker-compose.yml
39-
qualifyImageNames: true
40-
projectName: ""
41-
dockerComposeFileArgs: |
42-
TAG=$(Build.SourceBranchName)
43-
- task: CopyFiles@2
44-
inputs:
45-
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
46-
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
47-
- task: PublishBuildArtifacts@1
48-
inputs:
49-
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
50-
artifactName: helm
18+
jobs:
19+
- job: BuildLinux
20+
pool:
21+
vmImage: 'ubuntu-16.04'
22+
steps:
23+
- task: DockerCompose@0
24+
displayName: Compose build apigws
25+
inputs:
26+
dockerComposeCommand: 'build mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
27+
containerregistrytype: Container Registry
28+
dockerRegistryEndpoint: $(registryEndpoint)
29+
dockerComposeFile: docker-compose.yml
30+
qualifyImageNames: true
31+
projectName: ""
32+
dockerComposeFileArgs: |
33+
TAG=$(Build.SourceBranchName)
34+
- task: DockerCompose@0
35+
displayName: Compose push apigws
36+
inputs:
37+
dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
38+
containerregistrytype: Container Registry
39+
dockerRegistryEndpoint: $(registryEndpoint)
40+
dockerComposeFile: docker-compose.yml
41+
qualifyImageNames: true
42+
projectName: ""
43+
dockerComposeFileArgs: |
44+
TAG=$(Build.SourceBranchName)
45+
- task: CopyFiles@2
46+
inputs:
47+
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
48+
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
49+
- task: PublishBuildArtifacts@1
50+
inputs:
51+
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
52+
artifactName: helm
53+
- job: BuildWindows
54+
pool:
55+
vmImage: 'vs2017-win2016'
56+
steps:
57+
- task: DockerCompose@0
58+
displayName: Compose build apigws
59+
inputs:
60+
dockerComposeCommand: 'build mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
61+
containerregistrytype: Container Registry
62+
dockerRegistryEndpoint: $(registryEndpoint)
63+
dockerComposeFile: docker-compose.yml
64+
qualifyImageNames: true
65+
projectName: ""
66+
dockerComposeFileArgs: |
67+
TAG=$(Build.SourceBranchName)
68+
PLATFORM=win
69+
- task: DockerCompose@0
70+
displayName: Compose push apigws
71+
inputs:
72+
dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
73+
containerregistrytype: Container Registry
74+
dockerRegistryEndpoint: $(registryEndpoint)
75+
dockerComposeFile: docker-compose.yml
76+
qualifyImageNames: true
77+
projectName: ""
78+
dockerComposeFileArgs: |
79+
TAG=$(Build.SourceBranchName)
80+
PLATFORM=win

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/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/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ public static IServiceCollection AddCustomIntegrations(this IServiceCollection s
305305

306306
var factory = new ConnectionFactory()
307307
{
308-
HostName = configuration["EventBusConnection"]
308+
HostName = configuration["EventBusConnection"],
309+
DispatchConsumersAsync = true
309310
};
310311

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

0 commit comments

Comments
 (0)