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)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/2wnqJV3KqwVzTotRkBbnOQ