Blazor+Dapr+K8s微服務之服務調用

1.1         Dapr環境配置

1.1.1        在開發機安裝Docker Desktop並啓用Kubernetes

安裝過程略,安裝好後效果如下:(左下角兩個綠色指示Docker和K8s正在運行)

 

1.1.2        在開發機安裝Dapr Cli

安裝命令:

powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"

將會安裝到如下目錄:

 

驗證安裝命令:

dapr

 

1.1.3        爲開發機配置Dapr

配置命令:

dapr init

驗證命令:

dapr --version

命令:docker ps 可以看到多了Dapr自動加了三個容器:

 

1.1.4        爲K8s配置Dapr

配置命令:

dapr init -k

驗證命令:

kubectl get pods --namespace dapr-system

 

可通過命令: 

kubectl port-forward deploy/dapr-dashboard --namespace dapr-system 8080:8080

訪問Dapr Dashbord

 

1.2         創建項目

1.2.1        創建Blazor WebAssembly項目

注意選擇Asp.net Core hosted

 

1.2.2        向解決方案添加Asp.net Core WebApi項目

添加完如圖,我增加了兩個解決方案文件夾BlazorWeb和ServiceAPI以方便區分前端和後端。

 

啓動DaprTest1.Server Project運行:啓動端口配置爲8000

 

1.3         直接調用微服務

當前解決方案中,DaprTest1.Client Blazor 項目的Fetch data 功能會調用DaprTest1.Server項目的WeatherForecastController.cs  中的Get接口以獲取天氣預報信息。

我們需要修改爲:在DaprTest1.Server項目的的Get接口不再直接返回天氣預報信息,而是調用DaprTest1.ServiceApi1項目的WeatherForecastController中的Get 接口獲取天氣預報。

1.3.1         引用Refit包

在項目DaprTest1.Server中安裝Refit 包。

 

1.3.2        修改相關代碼

在項目DaprTest1.ServiceApi1中引用DaprTest1.Shared項目,並刪除原來的Wheatherforcast.cs實體類。

 

在項目DaprTest1.Server 中新增文件ICallServiceApi1.cs,並添加如下代碼:

public interface ICallServiceApi1
    {
[Get(
"/WeatherForecast")] Task<IEnumerable<WeatherForecast>> GetWeatherForecast(); }

 

在項目DaprTest1.Server 的Startup.cs 中新增如下代碼,其中http://localhost:8001 是ServiceApi1接口訪問地址

// 注入httpClient

            services.AddHttpClient("HttpClient")

            .AddTypedClient(client =>

            {

                client.BaseAddress = new Uri("http://localhost:8001");

                return RestService.For<ICallServiceApi1>(client);

            });

 

修改項目DaprTest1.Server  WeatherForecastController.cs  中的Get接口如下:

 public class WeatherForecastController : ControllerBase
    {

        private readonly ILogger<WeatherForecastController> _logger;

        private readonly ICallServiceApi1 _callServiceApi1;
 
        public WeatherForecastController(ILogger<WeatherForecastController> logger, ICallServiceApi1 callServiceApi1)
        {
            _logger = logger;

            _callServiceApi1 = callServiceApi1;
        }

 

        [HttpGet]

        public async Task<IEnumerable<WeatherForecast>> Get()
        {

            return await _callServiceApi1.GetWeatherForecast();

        }

    }

 

分別啓動DaprTest1.Server 和 DaprTest1.ServiceApi1項目,訪問http://localhost:8000/ 可看到效果, 效果圖略。

1.4         通過Dapr調用微服務

我們需要修改爲:在DaprTest1.Server中不直接調用DaprTest1.ServiceApi1的接口地址獲取天氣預報信息,而是通過Dapr調用DaprTest1.ServiceApi1 的服務ID來獲取天氣預報信息.

1.4.1        引用Dapr.Client包

在項目DaprTest1.Server中安裝Dapr.Client包

 

1.4.2        修改相關代碼

在項目DaprTest1.Server 的Startup.cs 中修改如下代碼: 本代碼參考了 張善友大神的

Dapr 客戶端 搭配 WebApiClientCore 玩耍服務調用

services.AddScoped<InvocationHandler>();

            // 注入httpClient

            services.AddHttpClient("HttpClient").AddHttpMessageHandler<InvocationHandler>()

            .AddTypedClient(client =>

            {

                client.BaseAddress = new Uri("http://serviceapi1");

                return RestService.For<ICallServiceApi1>(client);

            });

 

1.4.3        在Dapr中運行項目

分別在DaprTest1.Server和DaprTest1.ServiceApi1項目中添加文件dapr-selfhosted.ps1

文件內容分別爲:

dapr run `

    --app-id blazorweb `

    --app-port 8000 `

    --dapr-http-port 3600 `

    --dapr-grpc-port 60000 `

dotnet run
dapr run `

    --app-id serviceapi1 `

    --app-port 8001 `

    --dapr-http-port 3601 `

    --dapr-grpc-port 60001 `

    dotnet run

 

PowerShell分別啓動DaprTest1.Server 和 DaprTest1.ServiceApi1項目下面的dapr-selfhosted.ps1文件, 訪問 http://localhost:8000/ 即可看到效果

 

 

1.5         在K8s中運行項目

1.5.1        添加Docker文件生成鏡像

分別在DaprTest1.Server和DaprTest1.ServiceApi1項目中添加Docker文件dockerfile, 並修改文件內容如下:

ARG NET_IMAGE=5.0-buster-slim

FROM mcr.microsoft.com/dotnet/aspnet:${NET_IMAGE} AS base

WORKDIR /app

EXPOSE 5000

 

FROM mcr.microsoft.com/dotnet/sdk:${NET_IMAGE} AS build

WORKDIR /src

COPY ["Server/DaprTest1.Server.csproj", "Server/"]

COPY ["Shared/DaprTest1.Shared.csproj", "Shared/"]

COPY ["Client/DaprTest1.Client.csproj", "Client/"]

RUN dotnet restore "Server/DaprTest1.Server.csproj"

COPY . .

WORKDIR "/src/Server"

RUN dotnet build "DaprTest1.Server.csproj" -c Release -o /app/build

 

FROM build AS publish

RUN dotnet publish "DaprTest1.Server.csproj" -c Release -o /app/publish

 

FROM base AS final

WORKDIR /app

COPY --from=publish /app/publish .

ENTRYPOINT ["dotnet", "DaprTest1.Server.dll"]
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

ARG NET_IMAGE=5.0-buster-slim
FROM mcr.microsoft.com/dotnet/aspnet:${NET_IMAGE} AS base
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:${NET_IMAGE} AS build
WORKDIR /src
COPY ["ServiceApi/DaprTest1.ServiceApi1/DaprTest1.ServiceApi1.csproj", "ServiceApi/DaprTest1.ServiceApi1/"]
COPY ["Shared/DaprTest1.Shared.csproj", "Shared/"]
RUN dotnet restore "ServiceApi/DaprTest1.ServiceApi1/DaprTest1.ServiceApi1.csproj"
COPY . .
WORKDIR "/src/ServiceApi/DaprTest1.ServiceApi1"
RUN dotnet build "DaprTest1.ServiceApi1.csproj" -c Release -o /app/build

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

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

 

 

在解決方案根目錄增加文件build-docker-images.ps1 以生成Docker image,文件內容如下:

docker build -t dapr-test1/blazorweb:1.0 -f Server/Dockerfile .

docker build -t dapr-test1/serviceapi1:1.0 -f ServiceApi/DaprTest1.ServiceApi1/Dockerfile .

 

在解決方案根目錄執行build-docker-images.ps1後, 可看到生成的兩個鏡像:

 

1.5.2        部署Docker鏡像到K8s

在解決方案根目錄新建文件夾 Deploy, 放置k8s部署文件

 

其中deploy.ps1 爲部署命令,內容如下:

kubectl apply `

    -f namespace.yaml `

    -f dapr-config.yaml `

    -f blazorweb.yaml `

-f serviceapi1.yaml

 

部署完成後,可通過端口轉發給node看到效果.

 

 

代碼地址:iamxiaozhuang/dapr-test (github.com)

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