Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Sample Microservices

This program is a sample microservices that implemented via different patterns and architectures. In principle, this program consists of two RESTful services. These two services are completely independent and have its own database. One service for Customers and one service for Orders. Each service survives separately, but when a customer data is updated, then the order information for that customer will also be updated using the event-driven design.

Overview

Both services can use SQL-Server or InMemoryDatabase, and this is determined by the settings in each service. Also in the settings, there are properties related to the event-bus that must be specified. It should be noted that event-bus properties must be configured for both service as same.

Implementation specifications

This program is implemented in C# programming language and uses .NET 5 technology. Below you will find a complete list of technologies, tools, environments, methodologies, and patterns used to implement this program.

  • Languages and Frameworks
    C# 9.0
    .NET 5 (.NET core)
    LINQ

  • Operating System
    Linux Operating System (Ubuntu 18.04 LTS)

  • IDE (Integrated Development Environment)
    VS Code 1.58.2

  • Paradigms
    Object-Oriented Programming (OOP)
    Dependency Injection (DI)

  • Patterns and Architectures
    Repository Pattern
    MediatR (as Mediator Pattern) 9.0.0
    Event-Driven Design (EDD) {RabbitMq and Azure ServiceBus}

  • Databses
    InMemoryDatabase
    SqlServer

  • IDL (Interface description language)
    Swagger 5.6.3

  • Other tools
    FluentValidation 10.3.0
    AspNetCore.Versioning 5.0.0
    Docker

  • Testing tools
    xUnit 2.4.1
    FakeItEasy 7.1.0
    FluentAssertions 5.10.3

Run the Program

A few changes must be made before running.

There is an important property in the appsettings.json file, BaseServiceSettings, that must be specified before running. This property have two sub properties UseInMemoryDatabase and UserabbitMq, which specify the type of database to be used, and whether to use UserabbitMq or AzureServiceBus respectively.

By default, InMemoryDatabase and AzureServiceBus are used. An AzureServiceBus ConnectionString is also set to make running the program with less configurations. Also, if you want to use RabbitMq, just set the UserabbitMq property to true. Additionally, if you need to use SQL-Server, you need to configure ConnectionStrings to your database.

Below you can see the program settings, which is in Json format.

{
"RabbitMq": {
"Hostname": "rabbitmq",
"QueueName": "CustomerQueue",
"UserName": "guest",
"Password": "guest"
},
"ConnectionStrings": {
"CustomerDatabase": ""
},
"BaseServiceSettings": {
"UseInMemoryDatabase": true,
"UserabbitMq": false
},
"AzureServiceBus": {
"ConnectionString": "",
"QueueName": "CustomerQueue"
}
}

This program can also be run as a docker. There are two docker-compose files in the main root of this repository. If the service images have not been created before, you can use the docker-compose.build.yml file. By run this file, service images are created and then executed. On the other hand, if the service images have already been created, the `docker-compose.ymld file can be used to run.

To run this program, first go to the main root of this repository and then run the below commands in the Terminal, Powershell or CMD.

docker-compose -f docker-compose.build.yml up

It is assumed that the docker is installed on your computer.

Perform some operations

To perform the following operations, it is assumed that the cURL tool is installed on your computer. Otherwise you can also use Postman.

Customer Service

Customer service includes some REST methods. These methods include Customer list, new customer registration and customer update. The following commands can be used to call each method.

GET customers list
curl --request GET --url http://localhost:5000/api/v1.0/customer
Register new customer
curl --request POST --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "FirstName":"Johnny", "LastName":"Depp", "Email":"johnny.depp@gmail.com", "BirthDate":"1963-06-09T18:25:43.511Z"}'
Update customer data
curl --request PUT --url http://localhost:5000/api/v1.0/customer --header 'content-type: application/json' -d '{ "Id": "9f35b48d-cb87-4783-bfdb-21e36012930a", "FirstName":"Amin2", "LastName":"Ziagham2", "Email":"amin.ziagham@gmail.com", "BirthDate":"2012-04-23T18:25:43.511Z"}'

Order Service

On the other hand, Order service also have some REST methods.

GET orders list (just payed orders not all)
curl --request GET --url http://localhost:6000/api/v1.0/order
Register new order (Remember to register customer before order registration)
curl --request POST --url 'http://localhost:6000/api/v1.0/order' --header 'content-type: application/json' -d '{ "CustomerGuid": "9264f09c-83f8-4bef-a00b-00d673bb274c", "CustomerFullName": "Johnny Depp"}'
Pay order
curl --request PUT --url http://localhost:6000/api/v1.0/order/pay/c34a25d8-e786-4e00-9b70-6acf2e6187ac --header 'content-type: application/json' -d {}

Future works

ApiGateway (e.g, Ocelot, Azure Api-Management) can also be used for better manage and integrate requests. In addition, the outbox pattern can be used to ensure that events were delivered to eventbus (in some cases that eventbus was not available for a while).