Blazor+Dapr+K8s微服务之服务调用

631 篇文章 16 订阅
68 篇文章 5 订阅

 

目录

1.1  Dapr环境配置

1.1.1        在开发机安装Docker Desktop并启用Kubernetes

1.1.2        在开发机安装Dapr Cli

1.1.3        为开发机配置Dapr

1.1.4        为K8s配置Dapr

1.2         创建项目

1.2.1        创建Blazor WebAssembly项目

1.2.2        向解决方案添加Asp.net Core WebApi项目

1.3         直接调用微服务

1.3.1         引用Refit包

1.3.2        修改相关代码

1.4         通过Dapr调用微服务

1.4.1        引用Dapr.Client包

1.4.2        修改相关代码

1.4.3        在Dapr中运行项目

1.5         在K8s中运行项目

1.5.1        添加Docker文件生成镜像

1.5.2        部署Docker镜像到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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值