Dapr 0.10.0 版本发布深度解析:多 Pub/Sub、状态 Bulk Get 与事务 API、Kubernetes 生产升级指南
【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr
导读
本文基于 Dapr 官方发布的 v0.10.0 版本说明(见 docs/release_notes/v0.10.0.md),系统梳理该版本在 Dapr Runtime、CLI、组件生态与各语言 SDK 中的关键演进,重点剖析三项影响深远的破坏性变更——多 Pub/Sub 组件支持、状态重试选项移除、Java SDK 服务调用签名变化——并结合当前仓库源码(如 pkg/api/http/http.go、pkg/api/grpc/grpc.go)印证其底层实现。读完本文,你将掌握从旧版本平滑升级到 0.10.0 的完整操作路径(自托管与 Kubernetes 双场景),理解新版发布 API 与状态 API 的调用形态,并能够正确迁移你的应用代码。
版本定位:v0.10.0 是 Dapr 走向 v1.0 前的重要里程碑。从该版本开始,发布重心明显转向生产环境中的稳定性、可靠性与可升级性(upgradability)等运维议题,同时持续吸纳社区与用户的反馈并修复缺陷。
一、版本亮点总览
v0.10.0 在距离上一个版本六周后发布,核心亮点如下:
- 多 Pub/Sub 组件支持:可以在同一个应用中同时发布/订阅来自多个不同 pub/sub 组件的主题,发布端与订阅端 API 均发生变更(见下文破坏性变更章节);
- Windows 容器支持:Dapr 运行时开始支持在 Windows 容器中运行,适用于 Kubernetes 混合集群场景;
- 状态存储新增 Bulk Get API:一次性按批量键读取状态,显著降低多次往返开销;
- 状态存储新增事务(Transactions)API:在支持事务的状态组件上以原子方式执行多键操作;
- Kubernetes 控制平面高可用(HA):Helm Chart 新增 HA 选项,控制平面可多副本运行;
- Kubernetes 生产部署与升级指南:官方文档新增生产环境部署与升级最佳实践;
- 各语言 SDK 增强:Go、Python SDK 能力大幅提升,Dashboard 也新增多项特性;
- CLI 新增命令:查看根证书到期时间、导出 TLS 证书、
init -k支持自定义命名空间; - 新组件:InfluxDB 输出绑定、非交互式 OAuth2 中间件(client credentials 授权)、Azure Blob Storage 状态存储。
二、Dapr Runtime 新特性与源码佐证
2.1 多 Pub/Sub 组件支持
0.10.0 之前,Dapr 运行时同一时间只能加载一个 pub/sub 组件;0.10.0 之后支持同时加载多个 pub/sub 组件,应用可针对不同组件发布与订阅。
从当前仓库源码可以印证这一点。在 pkg/runtime/compstore/subscriptions.go 中,订阅结构NamedSubscription显式携带PubsubName字段(PubsubName: comp.Spec.Pubsubname),用于标识该订阅属于哪个 pub/sub 组件;同文件后续代码(如sub.PubsubName + "||" + sub.Topic的键构造)说明订阅在内部以「组件名 + 主题」为维度去重与路由,这正是多组件并存的数据结构基础。
在运行时组件加载侧,pkg/runtime/processor/pubsub/pubsub.go 通过pubsubName := comp.Name将每个组件以其配置名注册进compStore,多个组件可各自独立注册,互不干扰。
2.2 状态存储 Bulk Get API
Bulk Get 允许一次请求读取多个键的状态,gRPC 与 HTTP 两个通道均已支持。
- gRPC:服务端点注册见 pkg/api/grpc/endpoints.go(
v1.Dapr/GetBulkState)。其核心实现位于 pkg/api/grpc/grpc.go:将请求中的键数组批量转换为state.GetRequest,通过store.BulkGet(ctx, reqs, state.BulkGetOpts{Parallelism: ...})调用底层状态组件,返回的每个条目包含键、数据、ETag 与可选的单键错误;若状态存储启用了加密,还会对每个条目单独尝试解密(encryption.TryDecryptValue)。 - HTTP:路由注册见 pkg/api/http/http.go:
POST/PUT /v1.0/state/{storeName}/bulk,处理器为onBulkGetState(pkg/api/http/http.go),同样通过store.BulkGet执行并挂载弹性策略(resiliency policy)与组件监控指标。
2.3 状态存储事务(Transactions)API
事务 API 让支持事务的状态组件(如 Redis、SQL Server 等)能够以原子方式在一次调用中执行多个 upsert/delete 操作。
- gRPC:端点
v1.Dapr/ExecuteStateTransaction注册于 pkg/api/grpc/endpoints.go,实现位于 pkg/api/grpc/grpc.go,底层判断存储是否实现state.TransactionalStore接口并调用其Multi方法(参见 pkg/api/http/http.go 中 HTTP 侧onPostStateTransaction的同类逻辑)。 - HTTP:路由注册见 pkg/api/http/http.go:
POST/PUT /v1.0/state/{storeName}/transaction。
2.4 其他运行时改进
- Kubernetes Operator 重构:使用 Kubebuilder 重构,支持多副本协调(multi-replica reconciliation),为控制平面高可用奠定基础(感谢贡献者 @yittg);
- Windows 容器支持:运行时可在 Windows 容器中运行,并新增了对应的 Windows e2e 测试;
- 稳定性修复:修复高 RPS 下的 actor 稳定性 bug、actor 提醒(reminder)重复触发与覆盖(overwrite)bug、actor 定时器(timer)的竞态条件;
- 可观测性:新增 stdout 日志导出器(感谢 @brendandburns);修复
grpc_client_method与grpc_client_status指标标签恒为空的问题(感谢 @kirk91);Grafana 仪表盘随发布资产一起提供;gRPC 调用新增traceparent头以支持 W3C 分布式追踪; - 安全:启用 API 认证令牌时,sidecar 启动会打印相应日志条目;
- 协议与规范:Pub/Sub 云事件(CloudEvents)升级至 1.0 规范,并在规范中新增
topic字段(感谢 @allymparker);组件定义引入版本化机制(versioning scheme); - 工程化:Go 版本升级到 1.15;移除 glog 依赖与冗余命令行参数;移除状态重试选项(见破坏性变更章节);修复 sidecar 首次安装后无法解析密钥(secrets)的问题。
三、Dapr CLI 新能力
0.10.0 的 CLI(dapr命令)围绕多 pub/sub、证书管理与安装体验做了如下变更:
publish命令支持多 pub/sub:新增必填参数--pubsub指定目标组件,例如:dapr publish --pubsub pubsub --topic myevent --data '{ "name": "yoda" }'新增导出 Kubernetes 集群中现有 TLS 证书的命令;
新增查看 TLS 根证书到期日期的命令;
dapr init -k(Kubernetes 初始化)支持自定义命名空间、HA 模式以及启用/禁用 TLS;CLI 命令行参数调整为与
daprd保持一致;修复 standalone/Kubernetes 两种模式下版本标志不一致的问题;
自托管模式下
init与uninstall行为调整(详见升级章节的说明)。
四、组件生态新增与修复
- 新增 OAuth2 客户端授权中间件(client credentials 授权模式,非交互式,感谢 @h2floh);
- 新增 Azure Blob Storage 状态存储(感谢 @ksivamuthu);
- 新增 InfluxDB 输出绑定(感谢 @gbaeke);
- MQTT pub/sub 新增 TLS 支持(感谢 @kumaya);
- 修复SQL Server 在 gRPC 下的数据序列化问题与连接泄漏问题;修复 RabbitMQ pub/sub 消费者独占性(consumer exclusivity)bug;
- 输出绑定(output binding)操作列表更新;事务性状态请求新增
Metadata字段;Kubernetes events 输入绑定支持新的负载格式。
五、各语言 SDK 同步演进
多 pub/sub 是所有 SDK 的共同主线,同时每个 SDK 各有侧重:
| SDK | 主要变更 |
|---|---|
| Java | 多 pub/sub 支持;invokeService增加HttpExtension参数(破坏性变更,见下文);移除状态重试选项;修复 gRPC manager 无法关闭的问题 |
| .NET | 多 pub/sub 支持;新增 Bulk Get API 与 API 令牌注入;proto 包改用Any类型(感谢 @akkie);修复无 model binder 时的空引用异常(感谢 @altinoren) |
| Go | 多 pub/sub 支持;新增 Bulk Get API 与状态事务 API;新增服务端回调包装器;移除状态重试选项 |
| Python | 多 pub/sub 支持;新增状态存储、密钥、pub/sub、bindings API 的包装方法;新增 gRPC 包装层与 app 回调服务端包装;支持基于 FastAPI 的 actor 服务;支持 API 令牌认证 |
| Rust | 多 pub/sub 支持 |
| JavaScript | 多 pub/sub 支持 |
各 SDK 的订阅结构均已新增
pubsubName字段,publish 方法也统一接收pubsubName参数。升级到 0.10.0 时务必同步升级你所使用的 SDK 版本。
六、破坏性变更详解
本版本包含若干破坏性变更(breaking changes),升级前请务必阅读本节。
6.1 多 Pub/Sub 带来的 API 变更
发布端(Publisher)
发布 API 路径新增了 pub/sub 组件名参数:
旧:POST http://localhost:<daprPort>/v1.0/publish/<topic> 新:POST http://localhost:<daprPort>/v1.0/publish/<pubsubname>/<topic>从当前仓库源码可以印证新路径的形态:pkg/api/http/http.go 将发布路由注册为publish/{pubsubname}/*(处理器onPublish),并在 pkg/api/http/http.go 的onPublish实现中通过validateAndGetPubsubAndTopic解析组件名与主题。测试用例同样验证了该路径约定,见 pkg/api/http/http_test.go(apiPath := apiVersionV1 + "/publish/pubsubname/topic")。
订阅端(Subscriber)
订阅负载中新增了pubsubName字段,用于声明该订阅属于哪个 pub/sub 组件。以下示例以 JavaScript 为例,其他语言同样适用:
// 旧 app.get('/dapr/subscribe', (req, res) => { res.json([ { topic: "newOrder", route: "orders", } ]); }) // 新 app.get('/dapr/subscribe', (req, res) => { res.json([ { topic: "newOrder", route: "orders", pubsubName: "messagebus" } ]); })CLI publish 命令
dapr publish现在要求必填--pubsub参数:
dapr publish --pubsub pubsub --topic myevent --data '{ "name": "yoda" }'6.2 状态重试选项移除
状态操作的重试(retry)选项被移除。如果此前从未使用过重试选项,则该变更对你不构成影响。官方状态 API 参考文档已同步更新(移除重试相关参数)。仓库中 gRPC 状态相关实现(如 pkg/api/grpc/grpc.go 的GetBulkState、GetState等)已不再包含重试参数,重试能力统一交由全局的弹性策略(resiliency policy)承载。
6.3 Java SDK 服务调用签名变更
Service Invocation 方法现在必须接收一个HttpExtension参数:
// 旧 client.invokeService(serviceAppId, method, message); // 新 client.invokeService(serviceAppId, method, message, HttpExtension.NONE);6.4 CLI 安装路径变更
dapr init现在将运行时二进制daprd安装到:
- Mac/Linux:
$HOME/.dapr/bin - Windows:
%USERPROFILE%\.dapr\
同时,dapr init与dapr uninstall命令中的--install-path参数已被移除。
七、升级到 Dapr 0.10.0 指南
官方说明特别提示:本版本包含数个破坏性变更(见上文),请按照以下步骤执行,避免在终端看到红色报错。
7.1 自托管(Local Machine / Self-hosted)升级
第一步,使用当前已安装的 CLI 卸载 Dapr。该操作会删除默认的$HOME/.dapr目录、二进制文件以及dapr_redis、dapr_placement、dapr_zipkin容器。Linux 用户若将二进制安装到了默认路径/usr/local/bin/,或 docker 命令需要 sudo,则需要使用 sudo 执行:
dapr uninstall --all第二步,获取最新版 CLI(下载后将dapr二进制放入 PATH)。
第三步,初始化:
dapr init等待更新完成后,通过以下命令确认运行时版本为 0.10.0:
dapr --version7.2 Kubernetes 升级
从 0.9.0 升级(使用 Helm 安装)
如果此前使用 Helm 安装,从本版本开始支持直接升级 Dapr 到新版本;如果此前使用 CLI 安装,请直接跳到「从零开始(Starting fresh)」小节。
特别说明:仅在本版本中,由于 Go 1.15 的破坏性变更(Go 1.15 中 CommonName 相关变更),旧证书将不会延续使用,升级后需要重新签发证书。
第一步:获取最新 CLI
按上文方式获取最新版 Dapr CLI 并放入 PATH。
第二步:执行升级
更新 Helm 仓库:
helm repo update执行升级命令(使用--reset-values以重置为 Chart 默认值):
helm upgrade dapr dapr/dapr --version 0.10.0 --namespace dapr-system --reset-values等待所有 Pod 进入 Running 状态:
kubectl get pods -w -n dapr-system验证控制平面已更新且健康:
dapr status -k最后,对启用 Dapr 的 Deployment 执行滚动重启,使新 Pod 拉起新版本 sidecar:
kubectl rollout restart deploy/<DEPLOYMENT-NAME>从零开始(Starting fresh)
如果此前使用 Dapr CLI 安装,请使用现有 CLI 卸载(可忽略出现的任何错误):
dapr uninstall --kubernetes如果此前使用Helm 2.X安装:
helm del --purge dapr如果此前使用Helm 3.X安装:
helm uninstall dapr -n dapr-system更新 Helm 仓库:
helm repo update若你使用 Helm 将 Dapr 安装到了
dapr-system之外的命名空间,请相应调整卸载命令中的命名空间。
随后可按官方安装指南使用 Helm 3 重新安装,或直接使用 CLI:
dapr init --kubernetes安装后验证
验证控制平面 Pod 正在运行且健康:
dapr status -k预期输出示例(四个控制平面服务均处于 Running 状态且版本为 0.10.0):
dapr-sentry dapr-system True Running 0.10.0 1d 2020-08-18 10:15.21 dapr-operator dapr-system True Running 0.10.0 1d 2020-08-18 10:15.21 dapr-sidecar-injector dapr-system True Running 0.10.0 1d 2020-08-18 10:15.21 dapr-placement dapr-system True Running 0.10.0 1d 2020-08-18 10:15.21安装完成后,对部署执行滚动重启以拉取新版本 sidecar:
kubectl rollout restart deploy/<deployment-name>八、与当前仓库的对应关系
v0.10.0 中引入的核心能力在当前仓库代码中均有对应实现,可供读者深入研读:
- 多 pub/sub 组件:订阅结构携带
PubsubName见 pkg/runtime/compstore/subscriptions.go;组件按名注册见 pkg/runtime/processor/pubsub/pubsub.go; - 发布 API(含组件名路径):路由注册 pkg/api/http/http.go、处理器实现 pkg/api/http/http.go、gRPC 校验逻辑 pkg/api/grpc/grpc.go、路径测试 pkg/api/http/http_test.go;
- 状态 Bulk Get:gRPC 端点 pkg/api/grpc/endpoints.go、实现 pkg/api/grpc/grpc.go、HTTP 路由与处理器 pkg/api/http/http.go 与 pkg/api/http/http.go;
- 状态事务 API:gRPC 端点 pkg/api/grpc/endpoints.go、实现 pkg/api/grpc/grpc.go、HTTP 路由 pkg/api/http/http.go、底层
TransactionalStore.Multi调用 pkg/api/http/http.go。
结语
Dapr v0.10.0 是 v1.0 前夕的一次重要能力整合:多 pub/sub 组件让消息路由的拓扑表达能力大幅提升,状态 Bulk Get 与事务 API 补齐了高性能与原子操作两大关键诉求,Kubernetes 控制平面高可用与生产升级指南则标志着 Dapr 正式向生产环境迈进。对于开发者而言,升级的核心动作可归纳为三点:发布/订阅 API 补上组件名、移除状态重试相关配置、Java 服务调用补上HttpExtension参数。完成这三处适配后,即可按本文的升级步骤平滑迁移到 0.10.0。
【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考