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)

Blazor+Dapr+K8s微服务之服务调用的更多相关文章

  1. Blazor+Dapr+K8s微服务之开发环境调试

    1         安装Dapr开发调试环境 1.1         Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...

  2. Blazor+Dapr+K8s微服务之事件发布订阅

    我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1         在blazo ...

  3. Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

         前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...

  4. Blazor+Dapr+K8s微服务之状态管理

    1         状态管理服务器端接口 1.1         添加Dapr.AspNetCore包 在DaprTest1.Server项目中添加Dapr.AspNetCore包,该包实现了ASP. ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署

    之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...

  7. 从零开始,使用Dapr简化微服务

    序言 现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级. Dapr作为新一代微服务模式,使用sidecar ...

  8. 从服务之间的调用来看 我们为什么需要Dapr

    Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...

  9. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

随机推荐

  1. Tomcat:tomcat部署war包配置SSL访问

    Linux-CentOS7部署 war放置 war放到tomcat的webapps目录内 修改配置 修改tomcat的server.xml文件 HTTP: 找到Connector元素,修改端口 HTT ...

  2. 资源:Intellij IDEA 最新旗舰版注册激活破解*附注册码(2020年亲测)

    永久激活 1. 下载jetbrains-agent.jar包(2020.03.22亲测) 链接: https://pan.baidu.com/s/1BFXPwlROEF03BkhGzGIgEA 提取码 ...

  3. idea中快捷键的设置

    IDEA快捷方式改成eclipse的 File -> Settings -> Keymap 这里选Eclipse 然后Applay 即可: 快速生成main方法设置以及System.out ...

  4. 15 shell for循环

    除了 while 循环和 until 循环,Shell 脚本中还有for 循环,for 循环有两种使用形式:C语言风格的for循环与Python语言风格的for in循环,两种形式的for循环用法对比 ...

  5. Java实验项目三——编程实现Person类,学生类的设计及其继承关系

    Program: 编程实现Person类,学生类的设计及其继承关系 代码如下: 定义抽象类Person 1 /* 2 * Description:建立抽象类 3 * 4 * Written By:Ca ...

  6. mysql 索引介绍与运用

    索引 (1)什么是索引? 是一种提升查询速度的 特殊的存储结构. 它包含了对数据表里的记录的指针,类似于字典的目录. 当我们添加索引时会单独创建一张表来去存储和管理索引,索引比原数据大,会占用更多的资 ...

  7. Python单元测试框架unittest之批量用例管理(discover)

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了.加载用例后,用unittest里面的TextT ...

  8. 「CF526F」 Pudding Monsters

    CF526F Pudding Monsters 传送门 模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列. 转换成排列 ...

  9. Java基础00-形参和返回值22

    1. 形参和返回值 1.1 类名作为形参和返回值 1.2 抽象类名作为形参和返回值 代码示例: 方法的形参是抽象类名 抽象动物类:定义了一个抽象的eat方法 动物的操作类:创建一个useAnimal方 ...

  10. 查看JVM默认参数及微调JVM启动参数

    目录 查看某个JVM进程堆内存信息 微调JVM启动参数 查看JVM的一些默认参数 参考廖雪峰老师的这篇 JVM调优的正确姿势: https://www.liaoxuefeng.com/article/ ...