iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0

複習一下先前的成果

這是設計好的微服務架構。

https://ithelp.ithome.com.tw/upload/images/20240922/20168953za7g2g2CDG.png

這是 DDD with Clean Architecture 的專案架構。

Flat DDD Clean Architecture

建立專案資料夾

# 創建資料夾
mkdir src
cd src
mkdir Todo
mkdir Account
mkdir BFF
mkdir WebApp
mkdir Common

Todo Service 專案架構

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 ..

https://ithelp.ithome.com.tw/upload/images/20240924/20168953o1g7awlWX1.png

Account Service 專案架構

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 ..

https://ithelp.ithome.com.tw/upload/images/20240924/20168953NAMhM9fy2F.png

Common Library 專案

創建一個所有專案都會依賴的公共庫,裡面可以放一些全域可以共用的 Code,這可以有效避免每個微服務都要寫一份。

cd Common
dotnet new classlib -n Common.Library
cd ..

https://ithelp.ithome.com.tw/upload/images/20240924/20168953UdqnnINSDu.png

BFF Gateway 專案

BFF 說白了就是一個 Web API 專案,裡面使用 gRPC Client 來呼叫內部服務。

cd BFF
dotnet new webapi -n BFF.Gateway
cd ..

https://ithelp.ithome.com.tw/upload/images/20240924/20168953tKhhJANh8c.png

創建 Solution

在 ./src 底下創建 sln 檔案。

# 創建 .sln
dotnet new sln -n TodoMicroservices
# 加入內部所有 projects
dotnet sln add (ls -r **/*.csproj)

建置 docker-compose

接著我們要使用 Docker Compose 建立包含兩個 MSSQL 服務和一個 RabbitMQ 服務。但在這之前,先介紹一下基本概念。

Docker Compose 簡介

Docker Compose 是一個工具,讓你可以使用 YAML 檔案來定義和運行多個 Docker 容器。你可以通過一個簡單的命令來啟動、停止和管理多個容器,這樣可以簡化容器管理過程。

docker-compose.yml 建立

我們在 ./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:

說明

  • services: 定義了三個服務,account_dbtodo_db 使用 Microsoft SQL Server image,rabbitmq 使用 RabbitMQ image。
  • environment: 設定 SQL Server 的環境變數,包括接受使用者協議和設置強密碼。
  • ports: 對應容器的端口到主機的端口,以便你可以從主機訪問這些服務。
  • volumes: 使用 Docker volumes 來持久化 MSSQL 的數據。
  • networks: 所有服務都在同一個自定義網絡 app-network 中,以便它們之間可以互相通信。

使用方法

  1. 確定背景有開啟 Docker Desktop。

  2. docker-compose.yml 所在的目錄中運行以下命令來啟停服務:

    # 啟用所有 Services
    docker compose up -d
    # 停止並移除容器
    docker compose down
    
  3. 如果想要移除所有相關下載的 images,可以使用 docker compose down --rmi all

  4. Account Database Connection String

    Server=localhost,1433;Database=master;User Id=sa;Password=Passw0rd!;
    
  5. Todo Database Connection String

    Server=localhost,1434;Database=master;User Id=sa;Password=Passw0rd!;
    

這樣就完成了 MSSQL 和 RabbitMQ 的容器建置。

完整架構圖

https://ithelp.ithome.com.tw/upload/images/20240924/20168953ihzgRG5egT.png


上一篇
Day 09 - 開發工具
下一篇
Day 11 - DDD Seedwork 實作
系列文
DDD? Clean Architecture? Microservices? 帶你用.NET實作打造一個現代化微服務!12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言