日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

總結

以上是生活随笔為你收集整理的Blazor+Dapr+K8s微服务之开发环境调试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。