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)
Blazor+Dapr+K8s微服务之服务调用的更多相关文章
- Blazor+Dapr+K8s微服务之开发环境调试
1 安装Dapr开发调试环境 1.1 Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...
- Blazor+Dapr+K8s微服务之事件发布订阅
我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1 在blazo ...
- Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务
前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...
- Blazor+Dapr+K8s微服务之状态管理
1 状态管理服务器端接口 1.1 添加Dapr.AspNetCore包 在DaprTest1.Server项目中添加Dapr.AspNetCore包,该包实现了ASP. ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- 从零开始,使用Dapr简化微服务
序言 现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级. Dapr作为新一代微服务模式,使用sidecar ...
- 从服务之间的调用来看 我们为什么需要Dapr
Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
随机推荐
- 使用Hugo框架搭建博客的过程 - 部署
前言 完成前期的准备工作后,在部署阶段需要配置服务器或对象存储服务. 对象存储和服务器对比 对象存储平台 国内有阿里云OSS.腾讯COS.又拍云.七牛云等.国外有Github Pages.Netlif ...
- 按键控制LED灯-ESP32中断处理
#include <driver/gpio.h> #include <esp_task_wdt.h> #include <freertos/FreeRTOS.h> ...
- 【Spring】Spring中的循环依赖及解决
什么是循环依赖? 就是A对象依赖了B对象,B对象依赖了A对象. 比如: // A依赖了B class A{ public B b; } // B依赖了A class B{ public A a; } ...
- git配置多个ssh key
随着工作的深入,我们通常都会有多个git账户.比如公司gitlab一个账户,github或gitee有一个账户.而平时我们又回通过 配置ssh公私钥认证的方式省去繁琐的登录远程仓库的操作,不同的git ...
- matlab——插值与拟合
@ 目录 前言 一.拟合 1.定义 2.三种判别准则 3.最小二乘法 (1)一般形式 (2)常用函数 (3)matlab实现 二.插值 1.定义 2.方法 (1)分段线性插值 (2)拉格朗日插值多项式 ...
- DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
DWA(动态窗口)算法是用于局部路径规划的算法,已经在ROS中实现,在move_base堆栈中:http://wiki.ros.org/dwa_local_planner DWA算法第一次提出应该是1 ...
- 【剑指offer】03.数组中重复的数组
剑指 Offer 03. 数组中重复的数字 知识点:数组:哈希表:萝卜占坑思想 题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些 ...
- glibc库和glib库
http://ftp.acc.umu.se/pub/GNOME/sources/ ubuntu16上glib的安装包的名是libglibXX XX是版本号 ubuntu上查看glibc的方法 ldd ...
- 完整的URL是怎样的?
完整的URL字段解读: URL:http://localhost:80/MzyPractice/chapter10/testb.php?name=Mei&radio=Test#dowel ht ...
- Python基础之subprocess
前言 subprocess这个函数很好用,类似于控制台执行,功能很多,今天先介绍subprocess调用exe,并行调用两个或两个以上的exe. Subprocess调用exe 调用exe有几种方式, ...