這是設計好的微服務架構。
這是 DDD with Clean Architecture 的專案架構。
# 創建資料夾
mkdir src
cd src
mkdir Todo
mkdir Account
mkdir BFF
mkdir WebApp
mkdir Common
cd Todo
# 建立 library projects
dotnet new classlib -n Todo.Domain
dotnet new classlib -n Todo.Application
dotnet new classlib -n Todo.Infrastructure
# 建立 gRPC project
dotnet new grpc -n Todo.Grpc
# 加入 references
dotnet add .\Todo.Application\Todo.Application.csproj reference .\Todo.Domain\Todo.Domain.csproj
dotnet add .\Todo.Infrastructure\Todo.Infrastructure.csproj reference .\Todo.Application\Todo.Application.csproj
dotnet add .\Todo.Grpc\Todo.Grpc.csproj reference .\Todo.Application\Todo.Application.csproj
dotnet add .\Todo.Grpc\Todo.Grpc.csproj reference .\Todo.Infrastructure\Todo.Infrastructure.csproj
# 回到 src
cd ..
cd Account
# 建立 library projects
dotnet new classlib -n Account.Domain
dotnet new classlib -n Account.Application
dotnet new classlib -n Account.Infrastructure
# 建立 gRPC project
dotnet new grpc -n Account.Grpc
# 加入 references
dotnet add .\Account.Application\Account.Application.csproj reference .\Account.Domain\Account.Domain.csproj
dotnet add .\Account.Infrastructure\Account.Infrastructure.csproj reference .\Account.Application\Account.Application.csproj
dotnet add .\Account.Grpc\Account.Grpc.csproj reference .\Account.Application\Account.Application.csproj
dotnet add .\Account.Grpc\Account.Grpc.csproj reference .\Account.Infrastructure\Account.Infrastructure.csproj
# 回到 src
cd ..
創建一個所有專案都會依賴的公共庫,裡面可以放一些全域可以共用的 Code,這可以有效避免每個微服務都要寫一份。
cd Common
dotnet new classlib -n Common.Library
cd ..
BFF 說白了就是一個 Web API 專案,裡面使用 gRPC Client 來呼叫內部服務。
cd BFF
dotnet new webapi -n BFF.Gateway
cd ..
在 ./src 底下創建 sln 檔案。
# 創建 .sln
dotnet new sln -n TodoMicroservices
# 加入內部所有 projects
dotnet sln add (ls -r **/*.csproj)
接著我們要使用 Docker Compose 建立包含兩個 MSSQL 服務和一個 RabbitMQ 服務。但在這之前,先介紹一下基本概念。
Docker Compose 是一個工具,讓你可以使用 YAML 檔案來定義和運行多個 Docker 容器。你可以通過一個簡單的命令來啟動、停止和管理多個容器,這樣可以簡化容器管理過程。
我們在 ./src
底下建立 docker-compose.yml
如下。
version: '3.8'
services:
account_db:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Passw0rd!
ports:
- "1433:1433"
volumes:
- account_data:/var/opt/mssql
networks:
- app-network
todo_db:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Passw0rd!
ports:
- "1434:1433"
volumes:
- todo_data:/var/opt/mssql
networks:
- app-network
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
networks:
- app-network
volumes:
account_data:
todo_data:
networks:
app-network:
account_db
和 todo_db
使用 Microsoft SQL Server image,rabbitmq
使用 RabbitMQ image。app-network
中,以便它們之間可以互相通信。確定背景有開啟 Docker Desktop。
在 docker-compose.yml
所在的目錄中運行以下命令來啟停服務:
# 啟用所有 Services
docker compose up -d
# 停止並移除容器
docker compose down
如果想要移除所有相關下載的 images,可以使用 docker compose down --rmi all
。
Account Database Connection String
Server=localhost,1433;Database=master;User Id=sa;Password=Passw0rd!;
Todo Database Connection String
Server=localhost,1434;Database=master;User Id=sa;Password=Passw0rd!;
這樣就完成了 MSSQL 和 RabbitMQ 的容器建置。