Dapr + .NET Core實戰(十一)單機Dapr集羣負載均衡

如何單機部署Dapr集羣

第十篇講過了K8S集羣下如何使用Dapr運行程序,但是很多人一直在問如何單機下進行Dapr的負載,這節課我們來聊聊如何單機進行Dapr的負載。

首先要說的是單機下,通過 dapr run --app-id xxxxx這個命令是沒辦法直接運行dapr集羣的,因爲同一個app-id只能通過dapr run運行一次。這時候我們就需要利用docker來實現dapr的單機集羣部署。下面我們就來實現dapr的單機集羣部署。

說在中間,歡迎大家參加4小時Dapr+.NET 5的實戰課程

課程鏈接     https://ke.qq.com/course/4000292?tuin=1271860f

項目拓撲

 

 我們採用在docker內部爲frontend部署一個實例,爲backend部署兩個實例的方法,來實現backend的集羣化負載,另外需要爲frontend和2個backend分別啓動一個sidecar容器。因此此實例一共需要部署6個容器。

項目實戰

首先在BackEnd中新增控制器IpController,並添加獲取backend實例ip的接口

   [Route("api/[controller]")]
    [ApiController]
    public class IpController : ControllerBase
    {
        public ActionResult Get()
        {
            var ip = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces().Select(p => p.GetIPProperties()).SelectMany(p => p.UnicastAddresses)
                      .Where(p => p.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && !System.Net.IPAddress.IsLoopback(p.Address))
                      .FirstOrDefault()?.Address.ToString();

            return Ok(new List<string> { ip });
        }

    }

 

然後需要在FrontEnd的DaprController中添加調用獲取backend ip的接口

        [HttpGet("ip")]
        public async Task<ActionResult> GetIpAsync()
        {
            using var _daprClient = new DaprClientBuilder().Build();
            var result = await _daprClient.InvokeMethodAsync<List<string>>(HttpMethod.Get, "backend", "api/Ip");
            return Ok(result);
        }

 

這樣我們就可以通過訪問frontend的Dapr/ip來驗證backend是不是可以實現負載均衡。

Docker運行

在前面的課程裏我們已經爲backend和frontend建好了Dockerfile,這裏不再談Dockerfile的編寫

backend

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["BackEnd/BackEnd.csproj", "BackEnd/"]
RUN dotnet restore "BackEnd/BackEnd.csproj"
COPY . .
WORKDIR "/src/BackEnd"
RUN dotnet build "BackEnd.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "BackEnd.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BackEnd.dll"]

frontend

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5001

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["FrontEnd/FrontEnd.csproj", "FrontEnd/"]
RUN dotnet restore "FrontEnd/FrontEnd.csproj"
COPY . .
WORKDIR "/src/FrontEnd"
RUN dotnet build "FrontEnd.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FrontEnd.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FrontEnd.dll"]

右鍵backend新增容器適配支持,新增docker-compose支持

 

 修改docker-compose.yaml的內容

version: '3.4'
services:
  backend:
    image: ${DOCKER_REGISTRY-}backend
    build:
      context: .
      dockerfile: BackEnd/Dockerfile
    ports:
      - "51000:50001"

  daprbackend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", "-app-id", "backend", "-app-port", "5000" ]
    depends_on:
      - backend
    network_mode: "service:backend"

  backend2:
    image: ${DOCKER_REGISTRY-}backend2
    build:
      context: .
      dockerfile: BackEnd/Dockerfile
    ports:
      - "53000:50001"

  daprbackend-dapr2:
    image: "daprio/daprd:latest"
    command: [ "./daprd", "-app-id", "backend", "-app-port", "5000" ]
    depends_on:
      - backend2
    network_mode: "service:backend2"

  frontend:
    image: ${DOCKER_REGISTRY-}frontend
    build:
      context: .
      dockerfile: FrontEnd/Dockerfile
    ports:
      - "54000:50001"
      - "5001:5001"

  daprfrontend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", "-app-id", "frontend", "-app-port", "5001" ]
    depends_on:
      - frontend
    network_mode: "service:frontend"

其中我們公開了frontend和backend的50001默認GRPC通信端口,給frontend暴露了一個5001端口,另外給backend和frontend分別啓動了一個daprd容器,通過depends_onnetwork_mode實現綁定。

運行並驗證

我們通過docker-compose up -d 來運行

docker-compose up -d

看到以下內容則啓動成功

Creating dapr-aspnetcore-demo_backend2_1         ... done
Creating dapr-aspnetcore-demo_backend_1  ... done
Creating dapr-aspnetcore-demo_frontend_1          ... done
Creating dapr-aspnetcore-demo_daprbackend-dapr_1  ... done
Creating dapr-aspnetcore-demo_daprbackend-dapr2_1 ... done
Creating dapr-aspnetcore-demo_daprfrontend-dapr_1 ... done

通過postman調用frontend的dapr/ip,發現返回的backend的ip不一致,已成功實現負載均衡

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章