Dapr
Dapr (分布式应用运行时)
1、Dapr介绍和应用场景分析
2、Dapr单机环境部署和应用
3、Dapr核心组件的服务调用RPC和GRPC配置方式
4、Dpar核心组件StateManager
5、Dapr核心组件Pub/sub
6、Dapr核心组件Bindings
1.1 配置DNS
 
进入网站https://ipaddress.com/website/github.com 查询域名对应IP进行本地DNS解析配置> 20.205.243.166 github.com
> 185.199.108.133 githubusercontent.com
> 20.205.243.168 api.github.com
1.2 安装dapr环境
 
下载shell脚本wget https://raw.githubusercontent.com/dapr/cli/master/install/install.sh1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 #!/usr/bin/env bash # ------------------------------------------------------------# Copyright 2021 The Dapr Authors# Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at# http://www.apache.org/licenses/LICENSE-2.0# Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# ------------------------------------------------------------# Dapr CLI location : ${DAPR_INSTALL_DIR:="/usr/local/bin"}# sudo is required to copy binary to DAPR_INSTALL_DIR for linux : ${USE_SUDO:="false"}# Http request CLI DAPR_HTTP_REQUEST_CLI=curl # GitHub Organization and repo name to download release GITHUB_ORG=dapr GITHUB_REPO=cli # Dapr CLI filename DAPR_CLI_FILENAME=dapr DAPR_CLI_FILE="${DAPR_INSTALL_DIR}/${DAPR_CLI_FILENAME}"getSystemInfo() { ARCH=$(uname -m) case $ARCH in armv7*) ARCH="arm";; aarch64) ARCH="arm64";; x86_64) ARCH="amd64";; esac OS=$(echo `uname`|tr '[:upper:]' '[:lower:]') # Most linux distro needs root permission to copy the file to /usr/local/bin if [[ "$OS" == "linux" || "$OS" == "darwin" ]] && [ "$DAPR_INSTALL_DIR" == "/usr/local/bin" ]; then USE_SUDO="true" fi } verifySupported() { releaseTag=$1 local supported=(darwin-amd64 linux-amd64 linux-arm linux-arm64) local current_osarch="${OS}-${ARCH}" for osarch in "${supported[@]}"; do if [ "$osarch" == "$current_osarch" ]; then echo "Your system is ${OS}_${ARCH}" return fi done if [ "$current_osarch" == "darwin-arm64" ]; then if isReleaseAvailable $releaseTag; then return else echo "The darwin_arm64 arch has no native binary for this version of Dapr, however you can use the amd64 version so long as you have rosetta installed" echo "Use 'softwareupdate --install-rosetta' to install rosetta if you don't already have it" ARCH="amd64" return fi fi echo "No prebuilt binary for ${current_osarch}" exit 1 } runAsRoot() { local CMD="$*" if [ $EUID -ne 0 -a $USE_SUDO = "true" ]; then CMD="sudo $CMD" fi $CMD || { echo "Please visit https://docs.dapr.io/getting-started/install-dapr-cli/ for instructions on how to install without sudo." exit 1 } } checkHttpRequestCLI() { if type "curl" > /dev/null; then DAPR_HTTP_REQUEST_CLI=curl elif type "wget" > /dev/null; then DAPR_HTTP_REQUEST_CLI=wget else echo "Either curl or wget is required" exit 1 fi } checkExistingDapr() { if [ -f "$DAPR_CLI_FILE" ]; then echo -e "\nDapr CLI is detected:" $DAPR_CLI_FILE --version echo -e "Reinstalling Dapr CLI - ${DAPR_CLI_FILE}...\n" else echo -e "Installing Dapr CLI...\n" fi } getLatestRelease() { local daprReleaseUrl="https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/releases" local latest_release="" if [ "$DAPR_HTTP_REQUEST_CLI" == "curl" ]; then latest_release=$(curl -s $daprReleaseUrl | grep \"tag_name\" | grep -v rc | awk 'NR==1{print $2}' | sed -n 's/\"\(.*\)\",/\1/p') else latest_release=$(wget -q --header="Accept: application/json" -O - $daprReleaseUrl | grep \"tag_name\" | grep -v rc | awk 'NR==1{print $2}' | sed -n 's/\"\(.*\)\",/\1/p') fi ret_val=$latest_release } downloadFile() { LATEST_RELEASE_TAG=$1 DAPR_CLI_ARTIFACT="${DAPR_CLI_FILENAME}_${OS}_${ARCH}.tar.gz" DOWNLOAD_BASE="https://github.com/${GITHUB_ORG}/${GITHUB_REPO}/releases/download" DOWNLOAD_URL="${DOWNLOAD_BASE}/${LATEST_RELEASE_TAG}/${DAPR_CLI_ARTIFACT}" # Create the temp directory DAPR_TMP_ROOT=$(mktemp -dt dapr-install-XXXXXX) ARTIFACT_TMP_FILE="$DAPR_TMP_ROOT/$DAPR_CLI_ARTIFACT" echo "Downloading $DOWNLOAD_URL ..." if [ "$DAPR_HTTP_REQUEST_CLI" == "curl" ]; then curl -SsL "$DOWNLOAD_URL" -o "$ARTIFACT_TMP_FILE" else wget -q -O "$ARTIFACT_TMP_FILE" "$DOWNLOAD_URL" fi if [ ! -f "$ARTIFACT_TMP_FILE" ]; then echo "failed to download $DOWNLOAD_URL ..." exit 1 fi } isReleaseAvailable() { LATEST_RELEASE_TAG=$1 DAPR_CLI_ARTIFACT="${DAPR_CLI_FILENAME}_${OS}_${ARCH}.tar.gz" DOWNLOAD_BASE="https://github.com/${GITHUB_ORG}/${GITHUB_REPO}/releases/download" DOWNLOAD_URL="${DOWNLOAD_BASE}/${LATEST_RELEASE_TAG}/${DAPR_CLI_ARTIFACT}" if [ "$DAPR_HTTP_REQUEST_CLI" == "curl" ]; then httpstatus=$(curl -sSLI -o /dev/null -w "%{http_code}" "$DOWNLOAD_URL") if [ "$httpstatus" == "200" ]; then return 0 fi else wget -q --spider "$DOWNLOAD_URL" exitstatus=$? if [ $exitstatus -eq 0 ]; then return 0 fi fi return 1 } installFile() { tar xf "$ARTIFACT_TMP_FILE" -C "$DAPR_TMP_ROOT" local tmp_root_dapr_cli="$DAPR_TMP_ROOT/$DAPR_CLI_FILENAME" if [ ! -f "$tmp_root_dapr_cli" ]; then echo "Failed to unpack Dapr CLI executable." exit 1 fi if [ -f "$DAPR_CLI_FILE" ]; then runAsRoot rm "$DAPR_CLI_FILE" fi chmod o+x $tmp_root_dapr_cli runAsRoot cp "$tmp_root_dapr_cli" "$DAPR_INSTALL_DIR" if [ -f "$DAPR_CLI_FILE" ]; then echo "$DAPR_CLI_FILENAME installed into $DAPR_INSTALL_DIR successfully." $DAPR_CLI_FILE --version else echo "Failed to install $DAPR_CLI_FILENAME" exit 1 fi } fail_trap() { result=$? if [ "$result" != "0" ]; then echo "Failed to install Dapr CLI" echo "For support, go to https://dapr.io" fi cleanup exit $result } cleanup() { if [[ -d "${DAPR_TMP_ROOT:-}" ]]; then rm -rf "$DAPR_TMP_ROOT" fi } installCompleted() { echo -e "\nTo get started with Dapr, please visit https://docs.dapr.io/getting-started/" } # ----------------------------------------------------------------------------- # main # ----------------------------------------------------------------------------- trap "fail_trap" EXIT getSystemInfo checkHttpRequestCLI if [ -z "$1" ]; then echo "Getting the latest Dapr CLI..." getLatestRelease else ret_val=v$1 fi verifySupported $ret_val checkExistingDapr echo "Installing $ret_val Dapr CLI..." downloadFile $ret_val installFile cleanup installCompleted 1.3 初始化dapr
dapr init初始化成功截图
1.4 验证是否OK
默认初始化了三个docker容器
 
验证版本是否匹配
 
2.1 服务的调用
准备工作
1 2 3 4 dotnet new webapi -n backend -F net6.0 dotnet new webapi -n frontend -F net6.0 dotnet new sln -n dapr-sln dotnet ./dapr-sln.sln add frontend backend 2.1.1 Dapr的RPC调用
Frontend项目
 
新增Nuget引用
Dapr.AspNetCore<PackageReference Include="Dapr.AspNetCore" Version="1.6.0" />
注册Dapr支持
 
services.AddControllers().AddDapr();
创建DaprController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 // 注入DaprClientprivate readonly ILogger<DaprController> _logger; private readonly DaprClient _daprClient; [ApiController] [Route("[controller]")] public class DaprController : ControllerBase { private readonly ILogger<DaprController> _logger; private readonly DaprClient _daprClient; public DaprController(ILogger<DaprController> logger, DaprClient daprClient) { _logger = logger; _daprClient = daprClient; } /// <summary> /// 新增API,通过HttpClient调用Backend /// </summary> [HttpGet] public async Task<ActionResult> HttpClientAsync() { using var httpClient = DaprClient.CreateInvokeHttpClient(); var result = await httpClient.GetAsync("http://backend/WeatherForecast"); var resultContent = string.Format("result is {0} {1}", result.StatusCode, await result.Content.ReadAsStringAsync()); return Ok(resultContent); } /// <summary> /// 新增接口,通过DaprClient调用BackEnd /// </summary> /// <returns></returns> [HttpGet("dapr_client")] public async Task<ActionResult> DaprClientAsync() { using var daprClient = new DaprClientBuilder().Build(); var result = await daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(HttpMethod.Get, "backend", "WeatherForecast"); return Ok(result); } /// <summary> /// 新增接口,通过注入的daprclient,调用BackEnd /// </summary> /// <returns></returns> [HttpGet("inject_dapr_client")] public async Task<ActionResult> InjectDaprAsync() { var result = await _daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(HttpMethod.Get, "backend", "WeatherForecast"); return Ok(result); } } 部署项目
 
上传本地发布项目文件到Linux服务器
使用dapr环境运行dapr sidecar和项目1 2 3 4 5 dapr run --dapr-http-port 3512 --app-port 5020 --app-id frontend -- dotnet run --urls="http://*:5020"==>mDNS组件dapr run --dapr-http-port 3513 --app-port 5030 --app-id backend -- dotnet run --urls="http://*:5030"1 2 3 4 5 http://localhost:<dapr-port>/v1.0/invoke/<application-id>/method/<method-name> <dapr-port> Dapr 正在侦听的 HTTP 端口。 <application-id> 要调用的服务的应用程序 ID。 <method-name> 要在远程服务上调用的API请求路径。 验证测试
 
访问1 2 http://192.168.3.254:5020/swagger/index.html 基于swagger 测试编写的API http://192.168.3.254:3512/v1.0/invoke/frontend/method/api/ServiceInvocation/dapr_client 基于dapr sidecar 2.1.2 Dapr的GRPC的调用
 
daprgrpc项目引入依赖
 
Dapr.AspNetCore
<PackageReference Include="Dapr.AspNetCore" Version="1.6.0" />
Grpc.AspNetCore<PackageReference Include="Grpc.AspNetCore" Version="2.40.0" />
修改Program文件开启HTTP2协议1 2 3 4 5 builder.WebHost.ConfigureKestrel(options => { options.ListenLocalhost(5050, o => o.Protocols = HttpProtocols.Http2); });
新增Protos/greet.proto1 2 3 4 5 6 7 8 9 10 11 12 syntax = "proto3"; option csharp_namespace = "GrpcGreeter"; package greet; message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
修改csproj文件1 2 3 <ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /></ItemGroup>
新增Services/HelloService1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class HelloService : AppCallback.AppCallbackBase { public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context) { var response = new InvokeResponse(); switch (request.Method) { case "grpc": var input = request.Data.Unpack<HelloRequest>(); response.Data = Any.Pack(new HelloReply { Message ="ok"}); break; } return response; } }
注册GRPC1 2 3 4 5 // 注册GRPC services.AddGrpc(); // 添加终端映射 endpoints.MapGrpcService<HelloService>();
Frontend引入依赖
 
Google.Protobuf
 
Grpc.Net.Client
 
Grpc.Tools
1 2 3 <PackageReference Include="Google.Protobuf" Version="3.19.4" /><PackageReference Include="Grpc.Net.Client" Version="2.42.0" /><PackageReference Include="Grpc.Tools" Version="2.44.0" />
Frontend新增Protos/greet.proto1 2 3 4 5 6 7 8 9 10 11 syntax = "proto3"; option csharp_namespace = "GrpcGreeter"; package greet; message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
修改Frontend项目csproj文件1 2 3 <ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /></ItemGroup>
Frontend项目中新增调用GRPC的接口1 2 3 4 5 6 7 8 [HttpGet("grpc")] public async Task<ActionResult> GrpcAsync(){ using var daprClient = new DaprClientBuilder().Build(); var result = await daprClient.InvokeMethodGrpcAsync<HelloRequest, HelloReply>("backend", "grpc", new HelloRequest { Name = "Gerry Grpc" }); return Ok(result); }
重新部署项目 测试GRPC服务1 2 3 dapr run --app-port 5050 --app-id grpcbackend --app-protocol grpc -- dotnet rundapr run --dapr-http-port 3512 --app-port 5020 --app-id frontend -- dotnet run --urls="http://*:5020"2.1.3 服务调用原理分析
 
服务 A 对服务 B 发起HTTP/gRPC的调用。
 
Dapr使用在给定主机平台上运行的名称解析组件发现服务B的位置。
 
Dapr 将消息转发至服务 B的 Dapr 边车
: Dapr 边车之间的所有调用考虑到性能都优先使用 gRPC。 仅服务与 Dapr 边车之间的调用可以是 HTTP 或 gRPC
 
服务 B的 Dapr 边车将请求转发至服务 B 上的特定端点 (或方法) 。 服务 B 随后运行其业务逻辑代码。
 
服务 B 发送响应给服务 A。 响应将转至服务 B 的边车。
 
Dapr 将消息转发至服务 A 的 Dapr 边车。
 
服务 A 接收响应。
2.2 状态管理
2.2.1 编写状态组件配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore spec: type: state.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: "" - name: actorStateStore value: "true"2.2.2 项目演示
仍然使用FrontEnd项目,新建StateController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 using Dapr; using Dapr.Client; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Frontend.Controllers{ [Route("[controller]")] [ApiController] public class StateController : ControllerBase { private readonly ILogger<StateController> _logger; private readonly DaprClient _daprClient; public StateController(ILogger<StateController> logger, DaprClient daprClient) { _logger = logger; _daprClient = daprClient; } // 获取一个值 [HttpGet] public async Task<ActionResult> GetAsync() { var result = await _daprClient.GetStateAsync<string>("statestore", "guid"); return Ok(result); } //保存一个值 [HttpPost] public async Task<ActionResult> PostAsync() { await _daprClient.SaveStateAsync<string>("statestore", "guid", Guid.NewGuid().ToString(), new StateOptions() { Consistency = ConsistencyMode.Strong }); return Ok("done"); } //删除一个值 [HttpDelete] public async Task<ActionResult> DeleteAsync() { await _daprClient.DeleteStateAsync("statestore", "guid"); return Ok("done"); } //通过tag防止并发冲突,保存一个值 [HttpPost("withtag")] public async Task<ActionResult> PostWithTagAsync() { var (_, etag) = await _daprClient.GetStateAndETagAsync<string>("statestore", "guid"); await _daprClient.TrySaveStateAsync("statestore", "guid", Guid.NewGuid().ToString(), etag); return Ok("done"); } //通过tag防止并发冲突,删除一个值 [HttpDelete("withtag")] public async Task<ActionResult> DeleteWithTagAsync() { var (_, etag) = await _daprClient.GetStateAndETagAsync<string>("statestore", "guid"); return Ok(await _daprClient.TryDeleteStateAsync("statestore", "guid", etag)); } // 从绑定获取一个值,健值name从路由模板获取 [HttpGet("frombinding/{name}")] public ActionResult GetFromBindingAsync([FromState("statestore", "name")] StateEntry<string> state) { return Ok(state.Value); } // 根据绑定获取并修改值,健值name从路由模板获取 [HttpPost("withbinding/{name}")] public async Task<ActionResult> PostWithBindingAsync([FromState("statestore", "name")] StateEntry<string> state) { state.Value = Guid.NewGuid().ToString(); return Ok(await state.TrySaveAsync()); } // 获取多个个值 [HttpGet("list")] public async Task<ActionResult> GetListAsync() { var result = await _daprClient.GetBulkStateAsync("statestore", new List<string> { "guid" }, 10); return Ok(result); } // 删除多个个值 [HttpDelete("list")] public async Task<ActionResult> DeleteListAsync() { var data = await _daprClient.GetBulkStateAsync("statestore", new List<string> { "guid" }, 10); var removeList = new List<BulkDeleteStateItem>(); foreach (var item in data) { removeList.Add(new BulkDeleteStateItem(item.Key, item.ETag)); } await _daprClient.DeleteBulkStateAsync("statestore", removeList); return Ok("done"); } } } cmd运行
dapr run --dapr-http-port 3512 --app-port 5020 --app-id frontend -- dotnet run --urls "http://*:5020"2.2.3 切换其它状态存储
切换状态组件为MySQL,新建statestore-mysql.yaml
1 2 3 4 5 6 7 8 9 10 apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore spec: type: state.mysql version: v1 metadata: - name: connectionString value: "root:123456@tcp(192.168.3.205:3306)/?allowNativePasswords=true"2.2.4 工作原理
应用程序与 Dapr sidecar 交互,以存储和检索键/值数据。 在底层,sidecar API 使用**可配置的状态存储组件**来保存数据。 开发人员可以从不断增长的受支持状态存储集合中选择,其中包括 Azure Cosmos DB、SQL Server 和 Cassandra。
可以使用 HTTP 或 gRPC 调用 API。 使用以下 URL 调用 HTTP API:
http://localhost:<dapr-port>/v1.0/state/<store-name>/
<dapr-port>:Dapr 侦听的 HTTP 端口。
<store-name>:使用的状态存储组件的名称。2.3 发布订阅
2.3.1 什么是发布-订阅
发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的**服务间通信,高并发削峰**等情况。但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现**不同的实现类**,虽然是明智的决策,但必须编写和维护抽象及其基础实现。 此方法需要**复杂、重复且容易出错**的自定义代码。
Dapr为了解决这种问题,提供**开箱即用的消息传送抽象和实现**,封装在 Dapr 构建基块中。业务系统只需调用跟据Dapr的要求实现订阅发布即可。
2.3.2 设置发布订阅组件
1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: ""2.3.3 在FrontEnd中新建TestPubSubController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using Dapr.Client; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.IO; using System.Text; using System.Threading.Tasks; namespace FrontEnd.Controllers { [Route("api/[controller]")] [ApiController] public class PubsubController : ControllerBase { private DaprClient _daprClient; private ILogger<PubsubController> _logger; public PubsubController(DaprClient daprClient, ILogger<PubsubController> logger) { _daprClient = daprClient; _logger = logger; } /// <summary> /// 发布消息的方法 /// </summary> /// <returns></returns> [HttpPost] [Route("pub")] public async Task<IActionResult> PublishMessage() { _logger.LogInformation(">>>>>>>>>>>>>>>>>>>>>> 发布消息"); var data = new UserInfo(40001,"张三",43); await _daprClient.PublishEventAsync("pubsub", "user_topic",data); return Ok("发布消息成功~"); } } } 2.3.4 在Backend中新建SubController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 using Dapr; using DaprSamples1115.Controllers; using Microsoft.AspNetCore.Mvc; namespace DaprBackend.Controllers { [ApiController] [Route("[controller]")] public class SubController : ControllerBase { private ILogger<SubController> _logger; public SubController(ILogger<SubController> logger) { _logger = logger; } [HttpPost("sub")] [Topic("pubsub", "user_topic")] public IActionResult ConsumerMessage(UserInfo user) { _logger.LogInformation(">>>>>>>>>>>>>>>>>>>>>>>消费消息"); Console.WriteLine($"userId:{user.UserId} userName:{user.UserName}"); return Ok(); } } } 2.3.5 修改Program.cs文件
1 2 3 app.UseCloudEvents(); // 添加订阅映射终端 app.MapSubscribeHandler(); 2.3.6 发布订阅原理
Dapr 发布&订阅构建基块提供了一个与平台无关的 API 框架来发送和接收消息。
服务将消息发布到指定主题, 业务服务订阅主题以使用消息。
服务在 Dapr sidecar 上调用 pub/sub API。 然后,sidecar 调用预定义 Dapr pub/sub 组件。
任何编程平台都可以使用 Dapr 本机 API 通过 HTTP 或 gRPC 调用构建基块。 若要发布消息,请进行以下 API 调用:
http://localhost:<dapr-port>/v1.0/publish/<pub-sub-name>/<topic>上述调用中有几个特定于 Dapr 的 URL 段:
 
<dapr-port> 提供 Dapr sidecar 侦听的端口号。
<pub-sub-name> 提供所选 Dapr pub/sub 组件的名称。
<topic> 提供消息发布到的主题的名称。2.3.7 切换组件
部署RabbitMQ
docker run -it -d --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management编写新增pubsub-rabbitmq.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub namespace: defaultspec: type: pubsub.rabbitmq version: v1 metadata: - name: host value: "amqp://guest:guest@192.168.3.254:5672" - name: durable value: "false" - name: deletedWhenUnused value: "false" - name: autoAck value: "false" - name: deliveryMode value: "0" - name: requeueInFailure value: "false" - name: prefetchCount value: "0" - name: reconnectWait value: "0" - name: concurrencyMode value: parallel - name: backOffPolicy value: "exponential" - name: backOffInitialInterval value: "100" - name: backOffMaxRetries value: "16"2.4 组件绑定
 
 
 
 
 
 
 
 
 
 
 
2023-03-07
浏览83
📑技术文章
登录后评论
评论
分享