From 4c264cff4b07d1b3cb5d27c77babcbbae7886c19 Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Sun, 11 Sep 2022 20:52:30 +0700 Subject: [PATCH 1/2] Add docker container for all service --- ReadMe.md | 2 + aspnetcore-microservices.sln | 26 ++++---- src/docker-compose.override.yml | 103 ++++++++++++++++++++++++++++++++ src/docker-compose.yml | 67 +++++++++++++++++++++ 4 files changed, 188 insertions(+), 10 deletions(-) create mode 100644 src/docker-compose.override.yml create mode 100644 src/docker-compose.yml diff --git a/ReadMe.md b/ReadMe.md index 572f86b..e10ecb8 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,5 @@ ## AspnetCore Microservices Tutorial **Development Environment** +Cd to folder contains dockerxxx.yml file and run this cmd: + docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d --remove-orphans \ No newline at end of file diff --git a/aspnetcore-microservices.sln b/aspnetcore-microservices.sln index d12b149..56c5a98 100644 --- a/aspnetcore-microservices.sln +++ b/aspnetcore-microservices.sln @@ -5,12 +5,18 @@ VisualStudioVersion = 17.1.32328.378 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4F1182A4-9FDC-4032-A8F4-F654E9650106}" ProjectSection(SolutionItems) = preProject + src\docker-compose.override.yml = src\docker-compose.override.yml + src\docker-compose.yml = src\docker-compose.yml global.json = global.json Microservices-Solution-Architect.png = Microservices-Solution-Architect.png ReadMe.md = ReadMe.md EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D8FD53B8-8215-461C-9ACF-67F76E71C475}" + ProjectSection(SolutionItems) = preProject + src\docker-compose.override.yml = src\docker-compose.override.yml + src\docker-compose.yml = src\docker-compose.yml + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{2E42E344-B63A-436D-A1DC-9CB814A4D04F}" EndProject @@ -40,25 +46,25 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ScheduledJob", "ScheduledJo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHealthStatus", "src\WebApps\WebHealthStatus\WebHealthStatus.csproj", "{5E3E8638-71C6-458B-8EB6-B3261D11F4BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Basket.API", "src\Services\Basket.API\Basket.API.csproj", "{9CA4A74D-4851-4F41-8FA2-77E7E690A915}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Basket.API", "src\Services\Basket.API\Basket.API.csproj", "{9CA4A74D-4851-4F41-8FA2-77E7E690A915}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Customer.API", "src\Services\Customer.API\Customer.API.csproj", "{37C8580F-C254-42B0-AA5C-B80C2A36AF63}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Customer.API", "src\Services\Customer.API\Customer.API.csproj", "{37C8580F-C254-42B0-AA5C-B80C2A36AF63}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Inventory.Product.API", "src\Services\Inventory.Product.API\Inventory.Product.API.csproj", "{88056BF8-2D57-4AA0-B9CA-8D5E5D7BE2FA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Inventory.Product.API", "src\Services\Inventory.Product.API\Inventory.Product.API.csproj", "{88056BF8-2D57-4AA0-B9CA-8D5E5D7BE2FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ordering.API", "src\Services\Ordering.API\Ordering.API.csproj", "{87888A51-E7F1-4BBE-BEEA-55F9D42C54EA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.API", "src\Services\Ordering.API\Ordering.API.csproj", "{87888A51-E7F1-4BBE-BEEA-55F9D42C54EA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Product.API", "src\Services\Product.API\Product.API.csproj", "{ED7183A5-A53F-48E0-A733-EA0A0A54B9B8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Product.API", "src\Services\Product.API\Product.API.csproj", "{ED7183A5-A53F-48E0-A733-EA0A0A54B9B8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hangfire.API", "src\Services\Hangfire.API\Hangfire.API.csproj", "{99A44BCA-5B71-4794-913D-1D53EE9223F0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hangfire.API", "src\Services\Hangfire.API\Hangfire.API.csproj", "{99A44BCA-5B71-4794-913D-1D53EE9223F0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contracts", "src\BuildingBlocks\Contracts\Contracts.csproj", "{29D4A030-74D1-464D-8FF7-B00E3A21D1B1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Contracts", "src\BuildingBlocks\Contracts\Contracts.csproj", "{29D4A030-74D1-464D-8FF7-B00E3A21D1B1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Infrastructure", "src\BuildingBlocks\Infrastructure\Infrastructure.csproj", "{C474057E-7B3A-4A98-9DBC-FC678980624F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "src\BuildingBlocks\Infrastructure\Infrastructure.csproj", "{C474057E-7B3A-4A98-9DBC-FC678980624F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "src\BuildingBlocks\Shared\Shared.csproj", "{B554B61E-7856-4413-BEAF-D46911AB5228}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "src\BuildingBlocks\Shared\Shared.csproj", "{B554B61E-7856-4413-BEAF-D46911AB5228}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OcelotApiGw", "src\ApiGateways\OcelotApiGw\OcelotApiGw.csproj", "{8E41849C-6B54-4DF4-AC95-F687B81EE91A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\ApiGateways\OcelotApiGw\OcelotApiGw.csproj", "{8E41849C-6B54-4DF4-AC95-F687B81EE91A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml new file mode 100644 index 0000000..ad8abe3 --- /dev/null +++ b/src/docker-compose.override.yml @@ -0,0 +1,103 @@ +version: '3.8' + +services: + #order db : sql server + orderdb: + container_name: orderdb + environment: + SA_PASSWORD: "Abc12345" + ACCEPT_EULA: "Y" + restart: always + volumes: + - sqlserver_data:/var/lib/sqlserver/data + ports: + - "1435:1433" + + #product db : mysql + productdb: + container_name: productdb + environment: + MYSQL_ROOT_PASSWORD: "Abc12345" + restart: always + volumes: + - mysql_data:/var/lib/mysql + ports: + - "3306:3306" + + #customerdb : postgres + customerdb: + container_name: customerdb + environment: + - POSTGRES_USER=admin + - POSTGRES_PASSWORD=Abc12345 + - POSTGRES_DB=DiscountDb + restart: always + ports: + - "5433:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + #basket db : redis + basketdb: + container_name: basketdb + restart: always + ports: + - "6379:6379" + + #inventorydb : mongo + inventorydb: + container_name: inventorydb + restart: always + ports: + - "27017:27017" + volumes: + - mongo_data:/data/db + +#infrastructure section + rabbitmq: + container_name: rabbitmq + restart: always + ports: + - "5672:5672" + - "15672:15672" + + pgadmin: + container_name: pgadmin + environment: + - PGADMIN_DEFAULT_EMAIL=admin@tedu_microservice.com + - PGADMIN_DEFAULT_PASSWORD=Abc12345 + restart: always + ports: + - "5050:80" + volumes: + - pgadmin_data:/root/.pgadmin + + portainer: + container_name: portainer + restart: always + ports: + - "8080:8000" + - "9000:9000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer_data:/data + + elasticsearch: + container_name: elasticsearch + environment: + - xpack.monitoring.enabled=true + - xpack.watcher.enabled=false + - "ES_JAVA_OPTS=-Xms512m - Xmx512m" + - discovery.type=signle-node + ports: + - "9200:9200" + volumes: + - elasticsearch_data:/usr/share/elasticsearch/data + + kibana: + container_name: kibana + environment: + - ELASTICSEARCH_URL=http://elasticsearch:9200 + depends_on: + - elasticsearch + ports: + - "5601:5601" diff --git a/src/docker-compose.yml b/src/docker-compose.yml new file mode 100644 index 0000000..0252bd7 --- /dev/null +++ b/src/docker-compose.yml @@ -0,0 +1,67 @@ +version: '3.8' + +services: + #database section + orderdb: + image: mcr.microsoft.com/mssql/server:2019-latest + + productdb: + image: mysql:8.0.29 + + customerdb: + image: postgres:alpine3.16 + + basketdb: + image: redis:alpine + + inventorydb: + image: mongo + + #infrastructure section + rabbitmq: + image: rabbitmq:3-management-alpine + + pgadmin: + image: dpage/pgadmin4 + + portainer: + image: portainer/portainer-ce + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.17.2 + + kibana: + image: docker.elastic.co/kibana/kibana:7.17.2 + +#network section +#De cho de cau hinh cac server thi cho chung network +networks: + default: + name: td_microservices + driver: bridge + +#volumes section +volumes: + sqlserver_data: + name: sqlserver_data + + mysql_data: + name: mysql_data + + postgres_data: + name: postgres_data + + portainer_data: + name: portainer_data + + elasticsearch_data: + name: elasticsearch_data + + jaeger_data: + name: jaeger_data + + mongo_data: + name: mongo_data + + pgadmin_data: + name: pgadmin_data From c8b8ebcb8a66a0293789215f49274e615e233b44 Mon Sep 17 00:00:00 2001 From: HoaNguyen Date: Sun, 11 Dec 2022 21:16:48 +0700 Subject: [PATCH 2/2] chinh sua version cua elasticsearch /add serilog to productAPI --- ReadMe.md | 36 +++++++++++-- src/Services/Product.API/Product.API.csproj | 3 +- src/Services/Product.API/Program.cs | 58 +++++++++++++++------ src/docker-compose.override.yml | 6 +-- src/docker-compose.yml | 4 +- 5 files changed, 83 insertions(+), 24 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index e10ecb8..3db7ff0 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,5 +1,35 @@ ## AspnetCore Microservices Tutorial -**Development Environment** -Cd to folder contains dockerxxx.yml file and run this cmd: - docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d --remove-orphans \ No newline at end of file +## Chuan bi moi truong +* Install dotnet core version in the file `global.json` +* Visual studio CE 2022+ + +## How to run project + +Run command for build project + +```powershell +dotnet build +``` +Goto folder contain file `docker-compose` + +1. Using docker-compose + +```Powershell + +docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d --remove-orphans + +``` +## Application URLs - LOCAL enviroment ( Docker container) + +## Docker Application URLs -LOCAL enviroment ( Docker Container) + +- Portainer : http://localhost:9000 - user : admin / pass : Abc12345 +- Kibana : http://localhost:5601 - user : admin / pass : Abc12345 +- RabbitMQ : http://localhost:15672 - user : admin / pass : Abc12345 + +2. Using Visual Studio 2022 +- Open aspnetcore-microservices-td\aspnetcore-microservices.sln +- Run compound to start multi projects + +## Application URLs - DEVELOPMENT Env diff --git a/src/Services/Product.API/Product.API.csproj b/src/Services/Product.API/Product.API.csproj index 60bf9ea..77c83ff 100644 --- a/src/Services/Product.API/Product.API.csproj +++ b/src/Services/Product.API/Product.API.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -7,6 +7,7 @@ + diff --git a/src/Services/Product.API/Program.cs b/src/Services/Product.API/Program.cs index df2434c..7f54017 100644 --- a/src/Services/Product.API/Program.cs +++ b/src/Services/Product.API/Program.cs @@ -1,23 +1,51 @@ -var builder = WebApplication.CreateBuilder(args); -// Add services to the container. +using Serilog; -builder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +Log.Logger = new LoggerConfiguration() + .WriteTo.Console() + .CreateBootstrapLogger(); -var app = builder.Build(); +Log.Information("Starting Product API up"); -// Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) +try { - app.UseSwagger(); - app.UseSwaggerUI(); -} + var builder = WebApplication.CreateBuilder(args); + + builder.Host.UseSerilog((ctx, lc) => lc + .WriteTo.Console( + outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}") + .Enrich.FromLogContext() + .ReadFrom.Configuration(ctx.Configuration + )); + + // Add services to the container. + + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } -app.UseAuthorization(); + app.UseAuthorization(); -app.MapControllers(); + app.MapControllers(); + + app.Run(); +}catch(Exception ex) +{ + Log.Fatal(ex, "Unhandled exception"); +} +finally +{ + Log.Information("Shutdown Product API complete"); + Log.CloseAndFlush(); +} -app.Run(); diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index ad8abe3..69c161a 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -63,7 +63,7 @@ services: pgadmin: container_name: pgadmin environment: - - PGADMIN_DEFAULT_EMAIL=admin@tedu_microservice.com + - PGADMIN_DEFAULT_EMAIL=codedao.io@gmail.com - PGADMIN_DEFAULT_PASSWORD=Abc12345 restart: always ports: @@ -86,8 +86,8 @@ services: environment: - xpack.monitoring.enabled=true - xpack.watcher.enabled=false - - "ES_JAVA_OPTS=-Xms512m - Xmx512m" - - discovery.type=signle-node + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - discovery.type=single-node ports: - "9200:9200" volumes: diff --git a/src/docker-compose.yml b/src/docker-compose.yml index 0252bd7..a8813eb 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -28,10 +28,10 @@ services: image: portainer/portainer-ce elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:7.17.2 + image: docker.elastic.co/elasticsearch/elasticsearch:7.17.6 kibana: - image: docker.elastic.co/kibana/kibana:7.17.2 + image: docker.elastic.co/kibana/kibana:7.17.6 #network section #De cho de cau hinh cac server thi cho chung network