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

1 安装Dapr开发调试环境

1.1 Dapr 完整安装模式不支持开发调试

在上一篇随笔《Blazor+Dapr+K8s微服务之服务调用》中,我们通过为每个微服务运行dapr run ….dotnet run命令,以自宿主的方式在本地开发环境成功运行了服务调用的例子。

但是,这种运行方式是不支持调试的,我们无法在程序中进行断点。这就很不实用了!

搜索一番,找到这么一篇文章:Simple approach to run and debug multiple .NET Dapr projects (w/o Docker) - DEV Community,根据文章,我们可以不依赖Docker,就可以对我们的Dapr微服务本地进行调试。

其主要原理是:通过Dapr简易安装的Daprd命令,以自宿主方式先启动每个微服务的Dapr SideCar,  指定这些SideCar 监听的每个微服务的Http端口,然后,我们就可以在VS中按照监听端口启动每个微服务,这样我们的微服务就能够和Dapr的SideCar实现通信,从而实现服务调用,状态存储的功能。

1.2 修改Dapr完整安装模式为简易模式

我们需要先卸载我们已经安装好的完整模式,命令如下:

Dapr uninstall

然后安装简易模式,命令如下:

dapr init --slim

 

2 通用Dapr开发调试脚本

我对文章中作者的脚本做了简化处理,实现了一个”通用Dapr 微服务开发调试文件夹”,以方便我们可以利用这个文件夹对任何Dapr微服务进行调试。该文件夹结构如下:

 

2.1         微服务Dapr SideCar启动脚本。

其中start-daprd.ps1为启动每个微服务SideCar的PowerShell脚本,内容如下:

# pre-requisites:
# - initialized with: dapr init --slim
#   so that redis is running as container and placement service is started on demand# --------------------------------------------------------------------------------
# projects
# - appId       = needs to be Dapr id commonly used to address service$configProjects = @(@{appId       = "blazorweb"}@{appId       = "serviceapi1"}
)# --------------------------------------------------------------------------------
# INIT$ErrorActionPreference = "Stop"# stop and remove previous jobs
$jobNamePattern = $configProjects | Join-String -Property appId -Separator "|" -OutputPrefix "(placement|" -OutputSuffix ")"
Get-Job | ? { $_.Name -match $jobNamePattern } | Stop-Job -PassThru | Remove-Job# --------------------------------------------------------------------------------
# MAIN$jobs = @()# start placement service/job
$DAPR_PLACEMENT_PORT = 6050
$jobName = "placement"
Start-Job -Name $jobName -ScriptBlock {param( $port )placement --port $port} -Argument $DAPR_PLACEMENT_PORTWrite-Host "started" $jobName "in background, listening port:"$DAPR_PLACEMENT_PORT
"-" * 80
$jobs += $jobName# start jobs for app and dapr sidecar
$DAPR_HTTP_PORT = 3500
$DAPR_GRPC_PORT = 50001
$METRICS_PORT = 9091
$APP_PORT = 5000foreach ($configProject in $configProjects) {$jobName = $configProject.appId + "-daprd"$componentsPath = "components/"$configFile = "config.yaml"Start-Job -Name $jobName -ScriptBlock {param( $appId, $appPort, $DAPR_HTTP_PORT, $DAPR_GRPC_PORT, $DAPR_PLACEMENT_PORT, $METRICS_PORT, $componentsPath, $configFile)daprd --app-id $appId  `--app-port $appPort `--placement-host-address $("localhost:" + $DAPR_PLACEMENT_PORT) `--log-level debug `--components-path $componentsPath `--config $configFile `--dapr-http-port $DAPR_HTTP_PORT `--dapr-grpc-port $DAPR_GRPC_PORT `--metrics-port $METRICS_PORT} -Argument $configProject.appId, $APP_PORT, $DAPR_HTTP_PORT, $DAPR_GRPC_PORT, $DAPR_PLACEMENT_PORT, $METRICS_PORT, $componentsPath, $configFileWrite-Host "started "$jobName" in background, DAPR_HTTP_PORT: "$DAPR_HTTP_PORT "DAPR_GRPC_PORT:"$DAPR_GRPC_PORT "METRICS_PORT:"$METRICS_PORTWrite-Host "expecting "$configProject.appId" to be started on listening port:"$APP_PORT "-" * 80$jobs += $jobName$DAPR_HTTP_PORT += 10$DAPR_GRPC_PORT += 10$APP_PORT += 10$METRICS_PORT += 1
}# handle menu$running = $truewhile ($running) {Write-Host "s: job status"Write-Host "e: check all logs for errors"Write-Host "q: stop jobs and quit"$jobId = 0foreach ($job in $jobs) {Write-Host $($jobId.ToString() + ": show log of " + $job)$jobId += 1}$option = Read-Host "Enter option"switch ($option.ToUpper()) {"S" {Get-Job | ? { $_.Name -match $jobNamePattern } | Format-Table Name, State}"E" {foreach ($job in $jobs) {$errors = $nullif ($job -match "-app$") {$errors = (Receive-Job -Name $job -Keep) -match "(error|fail)\:"}else {$errors = (Receive-Job -Name $job -Keep) -match "level\=error"}if ($errors) {"-" * 80Write-Host "ERROR IN JOB:" $job -ForegroundColor Red$errors}}}"Q" {Get-Job | ? { $_.Name -match $jobNamePattern } | Stop-Job -PassThru | Remove-Job$running = $false            }default {if ([int32]::TryParse($option , [ref]$jobId )) {if ($jobId -ge 0 -and $jobId -lt $jobs.Count) {Receive-Job -Name $jobs[$jobId] -Keep | code -}}}}
}

对于每个微服务,我们需要在变量configProjects中定义每个微服务的名字/ID,这里使用的是上一节服务调用中的两个微服务的名字 blazorweb和serviceapi1。其它内容不需要变动。

2.2 其它配置文件

其中components文件夹和config.yml 分别定义了SideCar启动需要的组件和配置。组件包括订阅发布组件和状态存储组件,如下:

 

这两个组件的内容很简单,都是连结到一个Redis服务,提供订阅发布需要的消息队列和状态存储需要的缓存。这两个组件的文件和config.yml配置文件其实我是拷贝的完整安装目录(C:\Users\XXX\.dapr)下面的文件。

 

3 调试服务调用

3.1为每个微服务启动Dapr SideCar 服务

启动每个微服务的SideCar:

 

可以看到,我们以Job方式分别启动了三个服务,分别是,placement, blazorweb-daprd 和serviceapi1-daprd,  placement 服务是Dapr用来实现Actor模式的。而blazorweb-daprd 和serviceapi1-daprd则分别是我们两个微服务的Dapr SideCar。两个SideCar分别要求我们的微服务在5000和5010端口启动。

需要说明的是,启动微服务SideCar之前,先要启动Dapr组件需要的Redis服务,我这边启动了一个简易的Windows Redis Server。

 

这时候,我们查看每个服务的状态都是运行状态:

 

3.2 启动每个微服务

我们在VS中,修改每个微服务宿主项目的launchSettings文件,分别在5000端口和5010端口启动我们的两个微服务:

 

 

3.3调试服务调用

访问http://localhost:5000,

 

我们在DaprTest1.ServiceApi1项目的WeatherForecastController.cs文件中打个断点,然后点击Blazor界面中的Fetch Data菜单,可以看到程序停在了我们的断点上。

 

这里需要说明一个问题,我们在做服务调用的时候,在简易安装模式下,Dapr会始终调用127.0.0.1的3500端口,例如http://127.0.0.1:3500/v1.0/invoke/serviceapi1/method/WeatherForecast,并不会调用当前微服务SideCar指定的Dapr Http 端口。其实,我们如果访问http://127.0.0.1:3510/v1.0/invoke/serviceapi1/method/WeatherForecast,也是可以调用微服务的。

 相关代码:iamxiaozhuang/dapr-test (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这10个人,总是牛逼的无话可说

全世界只有3.14 % 的人关注了爆炸吧知识终于迎来知识君最喜欢的工作日了。热爱工作的知识君还是在认真地看书,码字。哈哈哈,有模友知道看得是什么书然而在拍完照片后,还是得想想今晚该写些啥东西。狄拉克 保罗狄拉克(Paul Adrien Maurice …

WebSocket服务器(物联网下行通知神器)

HttpServer是一个轻量级Web服务器,用于在嵌入式设备以及客户端环境中提供简单Web服务,同时也支持标准WebSocket服务。本文例程基于vs2022,基础例程可参考:https://www.yuque.com/smartstone/nx/httpserverWebSocket服务端WebSocke…

继续送假期干货——响应式图片工具smartImg

中午看《众妙之门》看到一个响应式图片处理工具(点此查看)的介绍,然后就心血来潮想着不妨自己写一个基于JQ的吧,于是就又有了这么一个干货给大家。 smartImg 的全部文件可以从我的Github上下载,其实它非常小巧&#xf…

一顿家庭火锅让本不富裕的家庭雪上加霜......

1 从此再也没有人相信你曾是个双眼皮▼2 在家吃火锅让一个本不富裕的家庭雪上加霜▼3 大型翻车现场▼4 各位大爷大伯,我先干了招待不周,还望海涵▼5 老外为了防止用手摸脸导致传染发明出来的新方法 ......但这东西难道不是宠物那啥用的吗&#xff1…

ASP.NET Core 修改开源协议为MIT,.NET全平台 MIT协议开源了

2021年7月23日,.NET开发团队完成了所有的.NET平台的相关框架的MIT协议更改,我们可以通过 https://github.com/dotnet/aspnetcore/issues/18873 看到详细的修改提交,这个协议修改里面主要有2点,具体可以看 https://github.com/dotn…

InstallSield更新包快速入门文档----感谢原作者ㄣ齊¨彡仯乄的无私提供

本文经原作者ㄣ齊彡仯乄特许授权于海洋女神发布,转载请务必注明出处与链接;原作者ㄣ齊彡仯乄和海洋女神保留对该文的一切法律许可下的权益;需要发布在盈利性报刊、网站等请与原作者ㄣ齊彡仯乄或海洋女神联系. 简述 本文主要描述安装程序更新包…

太赞了:中文版开源!这或许是最经典的计算机编程教材

全世界只有3.14 % 的人关注了爆炸吧知识转自 AI 科技大本营《Think Python》是很多计算机初学者的不二入门教材,受到广泛好评。该书原作者是美国 Olin 工程学院的教授 Allen B. Downey,目前该书的原版和中文版本都已免费开源。Allen 称,《Thi…

jBPM专家力作——《深入浅出jBPM》

恭喜本书荣登互动网和当当网畅销排行榜!媒体评论 “这是一本全面介绍jBPM的书,从基础知识到实战开发技巧,作者结合其实际项目开发经验,对国内流程的许多特色要求给出了浅显易懂的解决方案。对于想在项目中应用jBPM的初学者&#x…

WeihanLi.Npoi 1.20.0 Released

WeihanLi.Npoi 1.20.0 ReleasedIntroWeihanLi.Npoi 是一个基于 netstandard2.0 的一个 NPOI 扩展库,主要用于导入导出 Excel 以及CSV,支持通过 Fluent API 的方式来支持非常灵活的导入导出配置,详细使用可以参考文档介绍以及项目示例Updates最…

转:Chrome渲染分析之Timeline工具的使用

概述 这个工具真的很强大,Timeline工具栏提供了对于在装载你的Web应用的过程中,时间花费情况的概览,这些应用包括处理DOM事件, 页面布局渲染或者向屏幕绘制元素。Timeline可以通过事件,框架,和实时内存用量3个方面的数…

数学和物理太难?这些动图让你秒懂抽象概念

数学动图△ 从椭圆的一个焦点射出的光线总会通过另一个焦点。△ 真人版。△ 一图看懂正弦、余弦和正切什么意思。△ 圆的面积。△ 如何理解圆的面积和派的关系。△ 勾股定理演示。直角三角形的两条直角边的平方和(两个小正方形的面积),加起来…

java typereference_记录一下jackson中TypeReference的使用

今天在看到项目中有一段代码是将string字符串转化成对象,需要被转化成对象的类加了TypeReference,随即去百度了下。TypeReference是一个抽象类,继承了Comparable接口。里面的Type是一歌接口。贴上代码:mapper.readValue(station.g…

Docker小白到实战之容器数据卷,整理的明明白白

前言上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失。从隔离性的角度来看,数据就应该和容器共存亡&a…

U9在SQL Server上的性能优化经验(转述) — 之 行版本快照

此文根据用友的文档《基于SQL Server 2008构建SOA大型管理软件技术实践》“翻译”而成,非原创。在baidu上看见此文,觉得写的很好,就将原先的PPT细化一下并除去废话。 第二篇部分将的是行版本快照的隔离。 这是PPT上的图片: 图片上…

程序员崩溃的40个瞬间!!!

全世界只有3.14 % 的人关注了爆炸吧知识说到程序员,在外界眼里,他们是掌控代码的大神,他们是改变世界的王者。其实程序员的工作不容易,不信,就来看看程序员崩溃的各种瞬间——01公司实习生找bug02在调试时,…

java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2

前言:在各类网站论坛上,没有找到与工作比较贴切的技能,所以特此写一些对刚步入工作或者工作中没有重视的技能与问题,各位大牛请及时关闭文章.ps1:文中所有标点都是英文的,看官请不要在意.为了便于平时敲代码,所以中文输入法也默认了英文标点(防止各类因为…

Matlab学习------------带有右键菜单的GUI学习实例

实例步骤: 须要设置UIContextMenu,否则点击右键不显示。 右键点击第一个菜单之后:(在菜单中加入对应的回调函数) function r1_Callback(hObject, eventdata, handles) % hObject handle to r1 (see GCBO) % eventda…

多方位助您快速精准查阅文献和发文章的利器——X-MOL

全世界只有3.14 % 的人关注了爆炸吧知识无论您看文献的习惯是怎样的,X-MOL都有一种为您节省时间的功能:01根据参考文献一键直达全文—— X-MOL文献直达复制文章题录信息(如“PNAS, 2020, 117, 6771-6776”)或DOI, 粘贴到X-MOL首页…

ASP.NET Core端点路由中三种让人困惑的路由函数

早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和路由,其核心目的是将请求落地点与路由寻址方式解耦。《ASP.NET Core端点路由作用原理》这里面有几个容易混淆的函数•MapControllerRoute•MapDefaultControllerRoute•MapControllers有什么不同&#x…

java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

Java 环境变量和路径在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导、设置向导和 Java 控制台才能正常工作。与此类似,要使 Sun Management Center Java 控制台在 Microsoft Windows 上正常工…