发布日期: 2026-06-10
版本号: v1.18.0

Dapr 1.18发布,此版本以工作流为核心,重点增强了安全性、持久性和可扩展性。工作流历史现在可选择性地进行加密签名和验证,支持篡改检测。引入了新的WorkflowAccessPolicy资源,用于控制应用程序对工作流的调用权限。工作流可以将历史片段传递给其调度的子工作流或活动。调度器新增了全局和按名称的并发限制功能。此外,Jobs API现已稳定,组件热重载功能默认启用,Sidecar注入器支持Kubernetes原生sidecar容器。新引入的MCPServer资源可将Model Context Protocol工具调用作为持久化Dapr工作流暴露。控制平面稳定性得到提升,包括可选的合并窗口、硬性反亲和性、IPv6支持等。值得注意的变更包括Sentry现在使用Ed25519生成工作负载身份密钥,因此不能安全回滚到1.17.7之前的版本。

更新内容 (中文)

Dapr 1.18

我们很高兴地宣布发布 Dapr 1.18!这主要是工作流(Workflows)的发布,聚焦于安全性、持久性和规模。工作流历史记录现在可以选择性地进行加密签名和验证,每次加载状态时都会进行,因此篡改会在读取状态的瞬间被发现。同样的保护也扩展到跨应用边界:子工作流和活动的完成会在应用之间进行证明。新的 WorkflowAccessPolicy 资源控制哪些应用ID可以调用哪些工作流和活动。工作流现在也可以将其历史记录的部分片段传播给它们调度的子级,让子级可以基于上游上下文行动,而无需从状态存储中读取它。此外,调度器(Scheduler)增加了全局和按名称的并发限制,用于限制集群中同时运行的工作流或活动数量。

在工作流之外,Jobs API 升级为稳定版,组件和其他资源的热重载现在已成为正式功能(GA)且默认开启。边车注入器(sidecar injector)现在理解 Kubernetes 原生边车容器。此发布还引入了新的 MCPServer 资源,它将模型上下文协议(Model Context Protocol)工具调用暴露为持久化 Dapr 工作流。多项变更使控制平面在负载下更稳定:一个可选的合并窗口(coalesce window)在大规模扩容期间折叠冗余的放置传播(placement dissemination)轮次,放置(placement)和调度器(scheduler)支持硬性反亲和性(hard anti-affinity),主机解析现在支持 IPv6 和双栈(dual-stack),并且发布/订阅(pub/sub)在优雅关闭时会排空(drain)进行中的消息,而不是丢弃它们。

在升级之前,请注意 Sentry 中的一个变更。它现在使用 Ed25519 而不是 ECDSA 生成工作负载身份密钥。在全新安装或正常升级时,这是不可见的,但这意味着您不能安全地回滚到 1.17.7 以下版本。有关安全的回滚路径,请参阅新的 降级 部分。

感谢所有帮助实现此发布的新的和现有的贡献者。

如果您是 Dapr 新用户,请访问 入门 页面并熟悉 Dapr。

文档已更新,包含此发布的所有新功能和更改。要开始使用此发布引入的新功能,请转到 概念开发应用程序

注意:此发布包含几个不兼容变更

转到 升级 Dapr 部分了解升级到版本 1.18 的步骤。

致谢

感谢所有使此发布成为可能的人!

@1Ninad, @acroca, @alekhrycaiko, @antontroshin, @artur-ciocanu, @aviralgarg05, @bibryam, @CasperGN, @cerebrixos, @cicoyle, @Copilot, @cyphercodes, @Eckii24, @erj826, @erwinkramer, @famarting, @gaganhr94, @imneov, @ja-sg, @javier-aliaga, @Jeevansm25, @jjcollinge, @jmfloreszazo, @JoshVanL, @lrascao, @marcduiker, @matheusandre1, @MichaelHindley, @middt, @mikeee, @mohitpalsingh, @MukundaKatta, @MyMirelHub, @nelson-parente, @nikitasarawgi, @officialasishkumar, @olitomlinson, @pablochacin, @Pittu-Sharma, @pravinpushkar, @Rishabh-git10, @salaboy, @seherv, @sicoyle, @siri-varma, @spolom, @stywzn, @vaibhavatlan, @WhitWaldo, @yaron2, @ZeynelKoca

亮点

以下是 v1.18 版本的亮点:

WorkflowAccessPolicy

WorkflowAccessPolicy 是一个新的 Kubernetes CRD,它控制哪些 Dapr 应用 ID 被允许操作运行在目标应用上的哪些工作流。在 v1.18 之前,同一信任域中的任何调用者都可以调度、终止或查询任何其他应用的工作流。这对于单团队集群是可以接受的,但在共享或多租户集群中则是一个真正的问题,尤其是当工作流可以分支到远程应用时,不受限制的跨应用调用存在安全风险。

该策略是一个纯允许列表(pure allow-list)

  • 如果没有为目标应用加载策略,则所有调用都被允许——默认开放,因此现有部署不受影响。
  • 如果加载了一个或多个策略,则目标默认为拒绝,只有匹配规则的调用才被允许。
  • 自调用(Self-calls)(调用者的应用ID等于目标ID)始终被允许,不需要规则。

调用者身份来自远程调用的 mTLS 证书中的 SPIFFE 身份,以及同一边车调用的本地应用 ID。面向用户请求上不受信任的身份头在评估前会被剥离,因此一个应用无法伪造另一个应用的身份。

规则按操作表达。工作流支持所有八种操作——scheduleterminateraisepauseresumepurgegetrerun——而活动仅支持 schedule。名称可以是精确匹配或 glob 模式(*?[abc])。

示例:

apiVersion: dapr.io/v1alpha1
kind: WorkflowAccessPolicy
metadata:
  name: orders-policy
  namespace: production
scopes:
  # 加载和执行此策略的目标应用
  - orders-target
spec:
  rules:
    # 前端和运维控制台可以调度和终止 OrderWF。
    - callers:
        - appID: frontend
        - appID: ops-console
      workflows:
        - name: OrderWF
          operations: [schedule, terminate]

    # 前端也可以直接调度 ChargePayment 活动。
    - callers:
        - appID: frontend
      activities:
        - name: ChargePayment
        - name: "RefundEvent*"

当调用被拒绝时,调用者会收到一个不透明的错误(access denied by workflow access policy),该错误不会透露匹配了哪条规则或策略原本允许什么。

有关配置和示例,请参阅 操作指南:应用工作流访问策略WorkflowAccessPolicy 规范。有关背景信息,请参阅安全概念中的 工作流访问控制

工作流历史记录篡改检测

工作流历史记录事件现在可以选择性地进行加密签名和验证。每个步骤的签名在边车的 mTLS X.509 SPIFFE 身份下产生,并链接到前一个签名,创建一个可审计的签名链,在每次加载状态时都会检查。

每个工作流执行步骤产生一批历史事件,这些事件被签名并链接到前一个签名:

  ┌─────────────────────────────────────────────────────────────┐
  │                    工作流历史记录                             │
  │  事件 0 ─ 事件 1 ─ 事件 2 ─ 事件 3 ─ 事件 4 ─ 事件 5  │
  └─────┬──────────┬─────────┬──────────┬─────────┬──────────┬──┘
        ▼          ▼         ▼          ▼         ▼          ▼
  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐
  │    签名 0        │  │    签名 1        │  │    签名 2        │
  │  事件 [0,2)      │  │  事件 [2,4)      │  │  事件 [4,6)      │
  │  prevDigest: nil ├─►│ prevDigest: d0   ├─►│  prevDigest: d1  │
  └──────────────────┘  └──────────────────┘  └──────────────────┘

每次加载状态时,运行时会验证:

  • 签名之间的链接(prevDigest),
  • 事件连续性([start, end) 范围内没有间隙),
  • 摘要重新计算与签名摘要匹配,
  • 签名本身,
  • 事件发生时证书的有效性,以及
  • 签名应用的 SPIFFE 身份与工作流所属应用 ID 匹配。

如果验证失败,参与者会附加一个带有众所周知错误类型 DAPR_WORKFLOW_HISTORY_TAMPERED 的终止事件 ExecutionCompleted终止进行中的工作流,并保留原始(不受信任的)状态以供取证检查。

另外两层将相同的完整性保证扩展到跨应用边界:

  • 子工作流和活动完成证明——在子工作流或活动向其父级报告之前,执行器会签署一个 ChildCompletionAttestation / ActivityCompletionAttestation,承诺父实例ID、父任务调度ID、规范输入/输出摘要(SHA-256,基于与传输格式无关、NFC 规范化的编码,因此摘要在语言 SDK 之间稳定)、签名者的证书链摘要和终止状态。父级在接收时验证证明,并将外部签名者的证书存储在 ext-sigcert 表中,以证书链摘要为键。
  • 传播历史记录的加密验证——每个传播历史片段现在都携带其片段局部签名和 DER 证书链,由片段所属应用在分发时产生。接收者根据 Sentry 信任锚点验证每个片段,并检查叶 SPIFFE ID 的应用组件是否与 chunk.appId 匹配。

签名是一个单向决策。一旦启用了签名创建工作流,其历史记录必须保持签名状态——为该工作流禁用签名(或为一个从未签名的工作流启用签名)会导致硬验证错误,且无法对现有事件进行延迟签名。在集群范围启用签名之前,请让任何进行中的未签名工作流完成或清除它们。该功能由 WorkflowHistorySigning 配置功能标志控制,需要 mTLS 处于活动状态(daprd 在启用签名但 mTLS 关闭时拒绝启动),并且在 v1.18 中默认禁用。

参见 工作流历史记录签名 了解如何启用签名、验证模型以及跨应用证明保证。

工作流历史记录上下文传播

工作流现在可以将其历史记录的部分片段传播给子工作流和活动,消费者可以通过名称查询它。

支持两种可选的传播模式:

  • Lineage——工作流历史的完整祖先链传播给子级。
  • OwnHistory——仅将当前工作流自己的历史记录传播给其直接子级。

传播是按调用进行的:调用者在调度子工作流或活动时决定是否——以及什么——进行传播,消费者通过类型化查询 API(例如,按工作流名称和活动名称获取先前完成的活动的结果)读回它。这避免了通过输入传递状态或访问状态存储,后者会破坏工作流的确定性。

参见 工作流历史记录传播 了解 LineageOwnHistory 模式以及类型化查询 API。

工作流并发限制

工作流和活动的并发现在可以在调度器(scheduler)上限制,跨所有边车副本,与现有的每边车限制并存。您可以为所有工作流或活动设置一个全局最大值,以及为特定的工作流或活动名称设置按名称限制。

当达到限制时,调度器会将触发器保留在待处理队列中,并在现有 ACK 协议中通过释放的槽位进行分发。全局限制在调度器实例之间确定性地分片:每个副本执行其应分担的限制份额,余数分配给最低索引的副本,以使集群范围的总量与您配置的匹配。按名称限制作为独立的门运行,触发器必须通过每个适用的门才能被分发。存在一个边缘情况:如果全局限制设置为低于调度器副本的数量,每个副本仍允许一个并发调用以避免饥饿,因此有效限制可能会超过配置的值。

spec:
  workflow:
    globalMaxConcurrentWorkflowInvocations: 50
    globalMaxConcurrentActivityInvocations: 200
    activityConcurrencyLimits:
      - name: SendEmail
        maxConcurrent: 5
    workflowConcurrencyLimits:
      - name: OrderProcess
        maxConcurrent: 20

参见 工作流并发限制 了解如何配置全局和按名称限制。

超大工作流有效载荷的优雅停滞

以前,工作流的有效载荷(PastEvents + NewEvents + PropagatedHistory)超过 Dapr API gRPC 服务器的 MaxSendMsgSize(= --max-body-size,默认 4 MiB)时,会导致 GetWorkItems 服务器流上的 stream.Send 返回 ResourceExhausted。整个流被关闭,取消了在其上等待的所有其他工作流。SDK 将重新连接,而有问题的同一工作流会再次失败,形成一个循环。

在 v1.18 中,编排器预计算工作流(或活动)调度的 proto 大小,并将其与 --max-body-size 的 95% 进行比较。5% 的余量覆盖了引擎注入的 WorkflowStarted 事件以及 gRPC 帧。任何超过阈值的内容都会优雅地停滞在可恢复状态,而不影响流的其余部分。运行时会将有效载荷大小作为限制的比例发出,以便操作员可以观察分布情况,并且一旦您提高 --max-body-size 并重启 daprd,停滞的实例就会恢复。没有任何实例会丢失。

参见 工作流有效载荷大小限制 了解停滞行为、有效载荷大小比例指标以及如何恢复停滞的实例。

工作流外部事件计时器

以前,没有超时的 WaitForExternalEvent 等待对运行时是不可见的:从外部看,无法知道一个实例被什么阻塞了。在 v1.18 中,这种无限期等待会生成一个合成计时器(其触发时间设定在未来足够远,以至于它永远不会真正触发),并标记一个 origin,记录正在等待的事件的名称。使用现有的 RaiseEvent API,这使得审批门控和其他人在回路中(human-in-the-loop)的工作流变得可操作。相同的 timer-origin 字段也区分作为活动和子工作流重试延迟创建的计时器,因此工作流历史记录中的每个计时器现在都记录了其创建原因。

参见 外部事件外部系统交互模式 了解如何使用 WaitForExternalEventRaiseEvent 编写审批门控和其他人在回路中工作流。

Jobs API 现已稳定

Jobs API 在 v1.18 中升级为稳定版。作为稳定工作的一部分,添加了性能回归测试以防止未来的回归。

您应将应用程序代码迁移到稳定的 ScheduleJob / GetJob / DeleteJob 端点和 OnJobEvent 回调。Alpha RPC(ScheduleJobAlpha1 等)现已弃用但仍然完全可用,并且过渡不需要协调:1.18 边车仍然为旧客户端提供 alpha RPC,更新的 SDK 客户端在检测到旧边车时会自动回退到 alpha RPC。您可以分别升级运行时和迁移应用程序代码。

热重载现已正式发布(GA)

配置和组件的热重载 在 v1.18 中升级为 GA 并且默认开启。以下资源可以在不重启边车的情况下进行热重载:

  • 组件
  • 订阅
  • MCPServer
  • 配置
  • HTTPEndpoint
  • 弹性(Resiliencies)
  • WorkflowAccessPolicy

订阅协调器现在会在传入的 Subscription 事件与已加载的事件功能相同时跳过关闭+重新打开。这修复了一个启动竞争,即启动时加载器和操作员流同时传递相同的订阅,以前会导致临时的订阅者重叠以及偶尔的消息重复或丢失。

希望恢复 1.18 之前行为的操作员可以通过禁用 Dapr Configuration 中的 HotReload 功能来选择退出——在 spec.features 中添加 enabled: false

MCPServer 资源——用于 MCP 的内置工作流编排

一个新的 MCPServer Kubernetes CRD,加上一个内置的工作流编排引擎,通过标准的 Dapr 工作流 API 暴露模型上下文协议(MCP)服务器。

当边车加载一个或多个 MCPServer 资源时,daprd 会注册内置的 dapr.internal.mcp.<server>.ListToolsdapr.internal.mcp.<server>.CallTool.<toolName> 工作流编排。这些将 MCP 协议调用执行为持久化活动,因此应用程序代码无需导入 MCP SDK、管理连接或处理凭据。运行时处理所有这些,提供与任何 Dapr 工作流相同的持久性保证。

  • 传输层: streamable_httpssestdio
  • 认证: 静态头注入、OAuth2 客户端凭据(在调用时从 Dapr 密钥存储获取密钥,具有可重试错误处理)、SPIFFE JWT SVID 注入。
  • 符合规范: ListTools 和 CallTool 都遵循 MCP 规范。ListTools 严格按照服务器公布的名称、描述和 inputSchema 返回每个工具,不进行扁平化、重命名或重写 schema。CallTool 保留完整的 CallToolResult 形状,包括 content 联合类型(text、带有 base64 + mimeType 的 image、带有 base64 + mimeType 的 audio、带有 URI 和 metadata 的 resource_link、以及内联文本或 blob 的 embedded resource)、isError 标志以及任何服务器提供的元数据。JSON-RPC 信封未经修改地传递。未知或未来的内容类型会回退到结构化的 JSON 信封,而不是被丢弃,因此路径与新的 MCP 修订版兼容。
  • 生命周期钩子: beforeCallToolafterCallToolbeforeListToolsafterListTools,每个都可以修改参数/结果。
  • 仅在使用时加载: MCP 执行器仅在加载至少一个 MCPServer 资源时才被连接,因此没有 MCP 资源的边车不会产生与 MCP 相关的分配。

在 GA 之前移除了预览功能门控;加载 CRD 现在是唯一的启用方式(#9838)。

Placement:合并窗口(Coalesce Window)+ 稳定的调度器重载

对大规模下放置传播行为的两项改进:

  • 稳定的调度器重载(始终开启)。 actorTable.Types() 返回的参与者类型列表是通过遍历映射构建的,因此其顺序是非确定性的。scheduler.ReloadActorTypes 将该列表与上次看到的列表进行比较以决定是否重新连接,而仅重新排序就使其看起来发生了变化——在实际上没有任何变化的轮次上触发了虚假的重新连接。它现在会对列表进行排序,并在排序后的集合不变时跳过重新连接。
  • 轮次后合并窗口(可选启用)。 一个新的 --disseminate-coalesce-window 标志(默认 0 = 禁用)。设置后,在分发轮次完成并且有排队的主机注册/断开连接后,分发器会启动一个一次性计时器,而不是立即开始下一轮。在该窗口内到达的其他主机事件会累积并合并到单个后续轮次中。在空闲状态下到达的第一个事件仍会立即触发轮次,因此冷启动和孤立变更仍保持响应;只有持续的突发才会支付(可配置的)延迟以节省轮次。

对于 100+ 副本扩容或滚动重启,合并窗口将原本 O(N) 的后续轮次压缩为 O(1),从命名空间中每个现有 daprd 中移除 N-1 轮的排空+停止开销。对于频繁快速变更的集群,建议值为 100–250 毫秒。默认值 0 保留现有行为。

Placement 和调度器:硬性反亲和性(Hard Anti-Affinity)

在 Helm 图表中为 placement 和调度器 StatefulSet 提供可配置的高可用 Pod 反亲和性策略:

  • preferredDuringSchedulingIgnoredDuringExecution(默认):软反亲和性;Kubernetes 调度器尝试分散副本,但在容量有限时仍可以放置 Pod。
  • requiredDuringSchedulingIgnoredDuringExecution:硬反亲和性;强制副本分离,如果无法满足约束可能会使 Pod 处于等待状态。

通过 global.ha.podAntiAffinityPolicy 配置,并可与 global.ha.topologyKey 组合以选择分散域(例如 topology.kubernetes.io/zonekubernetes.io/hostname)。其他控制平面组件(operator、sentry、injector)继续使用软策略。

参见生产指南中的 分散 Placement 和 Scheduler 副本 了解如何配置 global.ha.podAntiAffinityPolicyglobal.ha.topologyKey

Actor API:应用发起的 gRPC 流

Actor 主机(应用程序端)现在可以通过 SubscribeActorEventsAlpha1 向 daprd 打开一个双向 gRPC 流,并在一个连接上接收所有四种回调类型——调用、提醒、计时器和停用。应用程序不再需要为 daprd 调入暴露 HTTP 或 gRPC 服务器端口;连接流向 应用 → 边车,反映了发布/订阅订阅、配置监视和调度器作业流的工作方式。

这也使得 actor 主机可以部署在更严格的防火墙和 NetworkPolicy 规则之后,因为没有需要允许的入站端口。

边车探针(Probe)默认值针对生产环境调整

存活探针(Liveness probe)仅作为您不拥有的软件的最后重启机制是合适的。对于 Dapr 拥有的进程,短的存活窗口会将临时故障(GC 暂停、启动工作、短暂停滞)转变为重启循环。就绪探针(Readiness probe)是将流量路由到不健康副本的正确杠杆。

v1.18 将存活时间设置得远超任何合理的实际停滞(在 kubelet 重启前约 230 秒),同时使就绪探针响应更灵敏:

存活探针(控制平面 + 注入的边车):
  initialDelaySeconds: 180
  periodSeconds:        10
  failureThreshold:      5     (重启前约 230 秒)

就绪探针(控制平面,副本少——故障时快速弹出):
  initialDelaySeconds: 1
  periodSeconds:       1
  failureThreshold:    3       (弹出约 3 秒)

就绪探针(daprd 边车,对用户工作负载更宽容):
  initialDelaySeconds: 1
  periodSeconds:       1
  timeoutSeconds:      1
  failureThreshold:    5       (弹出约 5 秒;吸收短暂的 GC / CPU 停滞)

参见 边车健康检查 了解探针默认值,以及 参数和注解参考 了解用于覆盖它们的 dapr.io/sidecar-liveness-probe-*dapr.io/sidecar-readiness-probe-* 注解。

Sentry:Ed25519 工作负载身份密钥

Sentry 和工作负载现在使用 Ed25519 而不是 ECDSA P-256 生成所有工作负载身份的 X.509 证书密钥。迁移在全新安装或正常升级时是不可见的。

  • 根 CA 和颁发者 CA 密钥现在是 Ed25519;X.509 签名算法从 ECDSAWithSHA256 变为 PureEd25519
  • Sentry 的 CA 接受任何受支持算法的 CSR(Ed25519、RSA、ECDSA),因此在滚动升级期间支持混合版本集群——呈现 ECDSA CSR 的 1.17.x daprd 仍将由 1.18 sentry 签名。
  • JWT 签名保持 RSA-2048 以兼容云提供商 OIDC。
  • 注入器(Injector)和操作员(Operator) 继续使用 RSA 密钥为其 webhook 服务 证书(#9873),因为某些托管 Kubernetes 分配在准入 webhook 上拒绝 Ed25519。

降级影响。 1.17.7 之前的 Sentry 版本无法解析 1.18 写入 dapr-trust-bundle 密钥的 Ed25519 键控的信任捆绑包,并会在启动时崩溃并显示 unsupported key type ed25519.PrivateKey。有关安全的回滚路径,请参阅新的 降级到早期版本 部分。Dapr 1.17.7 包含 dapr/kit PEM 解码器修复(dapr/dapr#9904),使 1.17.x 向前兼容 1.18 颁发的捆绑包。

参见安全概念中的 工作负载身份密钥算法 了解完整原理、兼容性矩阵、FIPS 指南和 1.17.7 降级下限。操作视图在 mTLS

组件改进

本周期的组件亮点包括:

  • 配置存储:新的 ConfigMap 配置存储,同时支持获取和订阅选项(#4275)——对于 Dapr 代理(Dapr Agents),这对于热重载操作员主导的配置非常有价值;PostgreSQL 修复以从组件规范读取 pgNotifyChannel,而不是要求客户端代码传递它(#4241);Azure App Configuration 在元数据中显示 contentType 和 label(#4338)。
  • Pulsar 发布/订阅:用于 advertisedListeners 支持的 listenerName 元数据字段,在 CloudEvents 信封上注册 Avro schema,针对 schema 验证 JSON 有效载荷,在订阅路径上解码 Avro 有效载荷,以及 processMode 异步背压(#4244、#4266、#4302、#4305、#4309、#4386,以及立即批量订阅 #4364)。
  • Kafka 发布/订阅:可暂停订阅者接口(PausableSubscriber)和优雅关闭加固(#4366),每消息分区支持(#4298),批量刷新计时器重置(#4378)。
  • RabbitMQ 发布/订阅:唯一的消费者标签(consumer tags)以防止重启时订阅中断(#4326)。
  • 状态存储:SQL Server v2 原生批量 BulkGet(#4365),Oracle BulkGet 分块(#4341),MongoDB KeysLiker(#4278),CockroachDB 镜像更新(#4291),RavenDB 状态存储在运行时注册(dapr/dapr#9654)。
  • 绑定(Bindings):Azure Blob Storage 预签名操作 + 批量操作(#4299、#4295);AWS S3 批量文件传输(#4292)。
  • 对话 API(Conversation API):在 Microsoft Foundry 上支持 Anthropic(#4374),在响应中显示 LLM 模型(#4331),当必需的工具调用未完成时返回错误(#4277),Ollama 端点元数据字段(#4314)。
  • TLS 加固:redis common 不再无条件跳过 TLS 证书验证(#4261)——见下文更改。

其余内容请参见下方每个仓库的完整 PR 列表

SDK 改进

Go SDK

主要功能是工作流历史记录上下文传播#823):工作流可以将其执行历史的片段交给它调度的子工作流和活动,而不是通过输入或状态存储传递该状态。传播是按调用可选的。生产者通过 workflow.WithHistoryPropagation(workflow.PropagateLineage())(完整祖先链)或 …PropagateOwnHistory()(仅自身事件)传递给 ctx.CallChildWorkflow(...) / ctx.CallActivity(...),消费者通过类型化 API 读回:ctx.GetPropagatedHistory() 返回一个 *workflow.PropagatedHistory,然后 GetLastWorkflowByName(...).GetLastActivityByName(...) 通过名称检索已完成的结果。一个可运行的 workflow-history-propagation 示例 随 SDK 一起提供。

Jobs API 升级为稳定版#824)。ScheduleJobGetJobDeleteJob 调用稳定的 RPC,并在针对旧边车时回退到 alpha,因此一个 SDK 构建可以在 1.17 和 1.18 上运行,无需代码更改。*Alpha1 客户端方法现已弃用,并委托给稳定方法;服务回调现在是 OnJobEventOnJobEventAlpha1 保留用于旧边车。

除了这两个之外,此发布修复了当提供不带 DNS 方案的连接字符串时的 gRPC 端点解析,并对齐了依赖项和安全基线:durabletask-go 升级到 v0.12.1,运行时 protos 升级到 v1.18.0-rc.4,gRPC 更新以解决 CVE-2026-33186。

版本映射:Go SDK v1.15 与 Dapr 1.18 一起发布。

.NET SDK

自 Dapr 运行时的 v1.17.0 版本发布以来,.NET SDK 继续围绕单个构建块进行模块化,在它们自己的 NuGet 包中引入了两个新客户端:Dapr.SecretsManagementDapr.StateManagement,分别用于机密和状态管理操作。除了产生更小、更专注的依赖项之外,将这些客户端从 DaprClient 中拆分出来允许每个包采用更现代的 .NET 实践,并为其构建块提供工具(例如源代码生成器、分析器和代码修复),而不是受单个整体客户端的限制。

此发布还整合了 Dapr.Workflow 包。单独的 Dapr.Workflow.VersioningDapr.Workflow.Analyzers 包不再需要——两者现在都捆绑在 Dapr.Workflow 本身中。无需重构,但您应删除指向已弃用包的现已过时的包引用。

在 v1.17 引入的自动工作流注册的基础上,现在为工作流和活动都处理注册,这意味着两者都不需要在启动时通过依赖注入进行注册,因为 SDK 会为您处理。升级到 1.18 时无需立即清除现有的 DI 注册块,因为 SDK 将优雅地继续接受手动和重复注册,但自此发布起,此类注册完全不必要。

最后,此发布提供了几个新的分析器,用于验证工作流和活动输入/输出之间的类型一致性,在构建时而不是运行时显示不匹配。

Python SDK

此版本的 Python SDK 将 durabletask-python 项目合并到主 SDK 中,因此工作流原语现在作为单个包与 Dapr 运行时版本对齐提供。MCP 表面现在通过专用的工作流客户端暴露,让工作流可以编排 MCP 工具调用,而无需单独设置 MCP SDK。

工作流历史记录上下文传播在子工作流和活动上都可用,调用者可以选择传播自己的历史记录或完整血统(lineage);消费者通过类型化查询 API 检索传播的历史记录。工作流和活动也接受 Pydantic 模型作为输入,消除了以前手工编写转换的需要。

此发布还解决了几个粗糙点:工作流 gRPC 连接现在遵循标准 API 超时环境变量,默认的 60 秒排空超时已移除,最大入站 gRPC 消息大小可通过环境变量配置,并且 worker 会无限期等待运行时就绪而不是快速失败。

现在支持批量发布/订阅,支持 Python 3.14(并移除了最后的 Python 3.9 残留),Jobs API 与运行时一起升级为稳定版。包布局已简化——移除了不必要的开发包,并将版本元数据集中到单个文件中。

Java SDK

最重大的更改在构建级别。最低 Java 版本现在是 17#1721);Java 11 不再受支持。Spring Boot 基线从 3.4 移到 3.5(根 springboot.version3.4.13 变为 3.5.12),同时支持 Spring Boot 4,因此任一条线上的项目都得到覆盖。SDK 现在还发布了一个 dapr-sdk-bom 构件(#1722),您可以导入它以将所有 Dapr 依赖项保持在单一、一致的版本上。

在工作流方面,主要功能是历史记录上下文传播#1739),与其他 SDK 匹配。生产者通过 WorkflowTaskOptions.withHistoryPropagation(scope)(或 propagateLineage() / propagateOwnHistory() 快捷方式)在子工作流和活动调用时按调用选择启用,其中 scopeHistoryPropagationScopeLINEAGEOWN_HISTORY。消费者通过 WorkflowContext.getPropagatedHistory()WorkflowActivityContext.getPropagatedHistory() 读回,它们返回一个 Optional<PropagatedHistory>,带有类型化查找(通过工作流名称、应用 ID 或实例 ID,然后按工作流深入到最后一个活动或子工作流)。工作流还获得了一个计时器来源字段(#1733),因此外部事件等待从外部可见,并且 DurableTaskGrpcWorker 现在通过跳出 gRPC worker 循环干净地关闭而不是挂起(#1727)。

对于服务调用,新的 DaprClient.invokeHttpClient(appId) 工厂#1742)返回一个 SDK 原生的 HTTP 客户端,该客户端预配置为调用目标应用,与 .NET 的 CreateInvokeHttpClient 镜像。它是现已弃用的 invokeMethod API 的推荐替代品。流式订阅增加了死信主题支持#1746):subscribeToTopic 现在接受一个 deadLetterTopic,失败的消息将被转发到该主题。还支持信封(Baggage)#1659)和本地观测中的跟踪传播#1724)。

在测试方面,SDK从 Testcontainers 1.21.4 迁移到 2.0.5,并从 JUnit 4 迁移到 JUnit 5#1736)。

JS SDK

此发布主要是为 SDK 追赶上其他包中最近引入的功能奠定基础。未来,包版本号将无限期保持在主版本 3,次要版本将跟踪 Dapr 运行时发布,补丁值将反映任何不具有新运行时依赖项的中期 SDK 发布。因此,随着 1.18 Dapr 运行时的发布,该包发布为 v3.18.0。

在之前的 3.17.0 版本中,CommonJS 模块作为彻底改造 gRPC 生成器的副作用而被意外停止,转而支持 ESM。此模块打包更改已撤回,我们没有计划弃用对 CommonJS 的依赖。如果情况发生变化,将通过这些发行说明提前宣传。

NPM 上的 dapr-client 包已被标记为弃用一段时间,但仍收到更新,但版本 3.6.1 将是该包的最后一个版本。所有未来的更新将应用于 @dapr/dapr

工作流客户端方法已重命名,以与其他 SDK 保持命名法一致性(例如 “orchestrators” -> “workflows”)。目前这不是硬性中断。旧名称作为 ‘@deprecated’ 别名保留并将继续工作,删除计划在 Dapr 1.20 版本发布时进行,因此您可以按自己的节奏迁移。

Rust SDK

随着 Rust SDK 版本 v0.19.0 的发布,在总体稳定性和与其他 SDK 的对齐方面做出了重大更改,包括使用 EnvVars 和参数初始化客户端。

在此版本中,已添加工作流支持,为几乎所有 Dapr API / 构建块提供了近乎完整的支持。预计在获得更多信息后将进行重大更改,以确保开发者体验得到改进。

不兼容变更 / 弃用

此 SDK 仍处于 alpha 阶段,每次发布通常都会有不兼容变更。在此版本中,MSRV(支持的最低 Rust 版本)使用 2024 版提高到了 1.88。

请按照 示例 中的文档迁移到新的客户端实现。

本次发布解决的问题列表

Dapr Runtime

  • ADDED 为 gRPC 实现 actor API 927
  • RESOLVED 在 go.mod 中添加 replace 8868
  • ADDED 在 Dapr 控制平面图表中支持 Spread Constraints 和严格亲和性规则以确保法定人数弹性。9223
  • RESOLVED 将 Dapr Jobs API 提升为稳定版 9257
  • RESOLVED 版本偏差: 1.16-1.17 9315
  • RESOLVED 文档: 链接到安全选项卡 9356
  • FIXED 功能: 通过添加 req.ActorKey() 改进 ErrActorNoAddress 的输出消息 9360
  • ADDED Sentry: 支持按受众令牌 SVID 9381
  • RESOLVED 将 actions/checkout 从 3 升级到 6 9418
  • ADDED 支持 Kubernetes 原生边车容器 9422
  • RESOLVED 使用作用域密封接口约束循环事件类型 9423
  • ADDED 边车注入器支持原生边车 9450
  • RESOLVED 将 github.com/lestrrat-go/jwx/v2 从 2.0.21 升级到 2.1.6 9454
  • RESOLVED 功能门控: WorkflowsRemoteActivityReminder 9456
  • RESOLVED components-contrib: 修复 redis 没有 key 9476
  • RESOLVED 修复 pubsub e2e flake 9478
  • RESOLVED diagridio/go-etcd-cron: v0.12.3 9489
  • RESOLVED 将 backport action 指向特定提交 9491
  • RESOLVED 使用 contrib 的最新版本 9496
  • ADDED [1.18] 为 placement 和 scheduler 添加硬性反亲和性策略选项 9498
  • RESOLVED fix(ollama): 移除 ollama 的旧解决方法 9499
  • RESOLVED 在 1.17 性能图表中挑选提交 9501
  • RESOLVED [FORWARD_PORT]: 为配置 otel 头添加 secretRef (#9399) 9523
  • RESOLVED 为 Copilot 编码代理添加 .github/copilot-instructions.md 9534
  • RESOLVED 集成测试: 拆分弹性应用测试 9544
  • RESOLVED 杂务: 使用 dapr-bot 创建 backport PR 9547
  • RESOLVED 使 pubsub_azure_servicebus_queues 稳定 9550
  • RESOLVED 集成测试: 基本终止测试 9557
  • RESOLVED 更新 kit & contrib v17 9568
  • REFACTOR Operator: 将更新流重构为循环 9570
  • RESOLVED fix(ci): 修复 update-longhauls 工作流中的 gh api 命令 9571
  • RESOLVED 将 Go 升级到 1.26.0 并修复 golangci-lint modernize/prealloc 失败 9573
  • REFACTOR hotreload: 简化磁盘加载器触发器并将协调器移至事件循环 9574
  • UPDATED 组件热重载现已正式发布 (GA) 9577
  • ADDED daprds: 添加 SIGHUP 处理程序重载器 9579
  • RESOLVED 集成测试: 构建 stablecomponents 9580
  • ADDED hotreload: 配置、HTTPEndpoint 和弹性 (Resiliency) 9582
  • RESOLVED 停滞工作流保留期删除 9588
  • FIXED 对没有 actor 类型的 daprd 主机进行不必要的放置传播 9591
  • ADDED 允许服务账户名称使用通配符 9596
  • ADDED Sentry: 使用 Ed25519 生成 X.509 证书密钥 9598
  • RESOLVED 修复 TestStartInternalCallbackSpan 采样率测试的 flaky 9599
  • RESOLVED 发行说明添加重置批量订阅计时器 9603
  • CHORE 将 Go 升级到 1.26.1 9608
  • RESOLVED 修复损坏的性能测试套件 9609
  • FIXED 修复: 在 invoke method 请求/响应中将深层 proto.Clone 替换为浅层副本 9610
  • RESOLVED 测试: 通过避免在多范围场景中使用 codes.Canceled 修复 flaky retryGRPCProxy 测试 9616
  • FIXED 修复: 竞争条件导致调度器作业在主机重新连接期间多次触发 9617
  • FIXED 修复: 防止 pub/sub 消息在优雅关闭期间被 NACK 9619
  • RESOLVED 测试: 通过轮询而非固定睡眠修复 flaky actor reminder e2e 测试 9620
  • ADDED 功能(helm): 在 scheduler 图表中添加 overrideBroadcastHostPort 选项 9629
  • FIXED ci: 修复过度的 GitHub 工作流令牌权限 9631
  • FIXED 修复 actor placement 版本检查 9639
  • RESOLVED 修复版本偏差测试 9640
  • RESOLVED #9606 的发行说明 9646
  • RESOLVED 测试: 修复批量传播后 flaky 的 placement 版本断言 9648
  • ADDED 功能(comp): 注册 ravendb 状态组件 9654
  • RESOLVED 将 RavenDB 状态存储组件添加到 v1.17.2 发行说明 9657
  • RESOLVED 集成测试: 修复工作流测试竞争 9660
  • RESOLVED CoPilot: 减少顶级审查评论 9663
  • ADDED 添加了对计时器来源的支持 9665
  • RESOLVED 集成测试: 增加 flaky 集成测试的超时时间 9671
  • RESOLVED 使用共享工作流和操作 9683
  • ADDED 功能(mcp): 添加初始化 mcp server 资源 9685
  • FIXED 调度器修复由于控制器重复注册导致的服务器重启致命崩溃 9688
  • FIXED 修复 placement 连接和传播抖动 9689
  • FIXED 调度器: 修复负载下 quorum 变更时的静默 cron 退出 9696
  • RESOLVED 移除 release-1.17 的冗余版本偏差补丁 9700
  • ADDED 支持 glob 服务账户 9704
  • RESOLVED 为 docker manifest 命令添加 –amend 和 –purge 标志 9705
  • UPDATED Jobs API 稳定 9706
  • TEST Jobs API 稳定 — 性能测试 9711
  • RESOLVED 修复 actor 测试的 peerShared 清理 9714
  • TEST 添加 pod kill 后调度器 quorum 恢复的 e2e 测试 9717
  • RESOLVED [工作流] 上下文传播 9721
  • ADDED [工作流] 人在回路中支持 9722
  • RESOLVED [工作流] 历史记录签名 9723
  • ADDED MCP 服务器对 Dapr API 的支持 9724
  • ADDED [工作流] 访问策略 9725
  • ADDED 将 DurableTask 仓库迁移到相应的 SDK 仓库 9726
  • FIXED 批量订阅 + 同步模式导致高未确认计数 9727
  • FIXED dapr 工作流列表在 1.17 中与 MongoDB actor 状态存储一起不工作 9728
  • ADDED 工作流状态管理改进(清除、归档) 9730
  • ADDED 功能(mcp): 为 mcpserver crd 添加内置 mcp 工作流编排引擎 9731
  • RESOLVED 挑选提交 9718 9737
  • UPDATED 基于 durabletask proto 变更的更新 9739
  • ADDED 功能(mcp): 为 cli mcp 命令添加 crd clientset 9742
  • FIXED fix(placement): 在 VirtualNodesCache.setHashes 中重用现有 hashMap 9753
  • RESOLVED 修复跨应用工作流测试的版本偏差 9756
  • RESOLVED 修复 flaky 跨活动工作流集成测试 9757
  • FIXED 容忍操作员 informer 中缺少的 CRD 9765
  • RESOLVED CI: 重试瞬时 docker push 和 crane.Copy 失败 9766
  • CHORE Go: 更新到 v1.26.2 9767
  • FIXED 工作流: 修复 ContinueAsNew 的 carry over events 9769
  • FIXED 修复 daprd 边车 placement 传播超时处理 9770
  • TEST 为重试计时器来源字段添加测试 9771
  • ADDED 工作流: 添加全局和按名称并发限制 9775
  • ADDED 添加工作流历史记录签名用于篡改检测 9778
  • ADDED 调度器: 更多指标 9787
  • ADDED 运行时: 为调度器 & placement 重新连接添加抖动 9788
  • UPDATED 工作流: 默认 WorkflowsRemoteActivityReminder 为 true 9789
  • ADDED 工作流: 添加 WorkflowAccessPolicy 9790
  • FIXED fix(pubsub): 通过 drain-and-flush 立即刷新批量订阅批次 9792
  • DOCS 记录 allowedServiceAccounts 中的更改 9793
  • RESOLVED 版本偏差: 修复 9794
  • ADDED [P1] 添加工作流全局和按名称并发限制 9796
  • RESOLVED 修复 scheduler.proto 注释中的 ‘sucessful’ 错别字 9798
  • RESOLVED 测试: flaky 9799
  • RESOLVED 功能: 添加 config map 配置存储组件 9801
  • SECURITY 修复服务调用路径遍历 ACL 绕过 9805
  • RESOLVED 添加缺失的发行说明 9806
  • RESOLVED 修复 dapr-standalone-validation 中的 flaky 内存检查 9808
  • RESOLVED 集成测试: 修复更多 flaky 9809
  • ADDED 工作流历史记录上下文传播 9810
  • UPDATED hotreload: 默认启用 HotReload (GA) 9811
  • ADDED Actors: 应用发起的 gRPC 流用于 actor 回调 9812
  • SECURITY 修复: 将 golang.org/x/image 升级到 v0.39.0 以解决 GO-2026-4962 9815
  • UPDATED 扩展存活探针并收紧就绪探针默认值 9818
  • RESOLVED 集成测试: 修复 stream dep jobs 的 flaky 9819
  • RESOLVED 修复多个许可证头中的错别字 9821
  • RESOLVED 集成测试: 工作流: 调度器磁盘耗尽测试 9823
  • FIXED 工作流: 终止篡改的进行中工作流 9825
  • FIXED 批量订阅将消息批量分组,最多 maxMessagesCountmaxAwaitDurationMs,以先到者为准,并在每次刷新时重启等待时间计时器,以便剩余消息加入下一个待处理批次并获得一个新窗口。声明 pubsub.FeatureBulkSubscribeImmediate (Pulsar) 的组件采用到达即刷新路径,因此每条消息在到达时即被确认。 9826
  • ADDED 工作流: 子工作流 & 活动证明 9831
  • FIXED 工作流: 修复递归跨应用清除和终止 9832
  • ADDED placement: 轮次后合并窗口 + 稳定的调度器重载 9837
  • REMOVED 移除 MCPServerResource 和 WorkflowAccessPolicy 功能门控 9838
  • RESOLVED 修复: 从 AKS 测试集群中移除可用区要求 9840
  • FIXED 工作流: 优雅地停滞在超大有效载荷上 9847
  • CHORE go-etcd-cron: 更新到 origin HEAD 9849
  • UPDATED WorkflowAccessPolicy: 扩展到所有工作流操作 9850
  • RESOLVED 集成测试: 加速测试 9854
  • UPDATED WorkflowAccessPolicy: 具有自调用豁免的纯允许列表 9870
  • UPDATED 注入器/操作员: 使用 RSA 密钥作为 webhook 服务证书 9873
  • FIXED 工作流: 在参与者收件箱处去重重复的完成事件 9875
  • FIXED fix(placement): 总是在轮次后启动合并计时器以修复传播竞争 9876
  • RESOLVED 集成测试: 通过元数据 API 轮询和调整修复 flaky 测试 9877
  • FIXED 修复: Proto 文件必须具有不同的 java 外部类名 9878
  • CHORE 更新 go-jose & OpenTelemetry 9882
  • ADDED 工作流: 加密验证历史记录传播 9890
  • ADDED 为工作流元数据添加开始时间 9898
  • RESOLVED 文档: 为 RabbitMQ 消费者标签修复添加 1.17.7 发行说明 9926
  • RESOLVED 集成测试: stdio 辅助二进制文件和移动辅助工具。 9932
  • ADDED 功能: 为控制平面 Helm 图表添加 initContainers 和 extraContainers 支持 9939
  • FIXED MCPServer: 修正工作流 actor 引用计数 9940
  • ADDED 添加对亚秒级精度提醒的支持 9946
  • RESOLVED 版本偏差: 修复与 1.17 的兼容性 9953
  • REFACTOR 重构(mcp): 用上游 go-sdk 类型替换手定义的 MCP proto 类型 9959
  • RESOLVED 调度器: 在 WatchHosts 首次接收错误时重新连接而不是关闭 daprd 9968
  • RESOLVED fix(ci): 将 e2e 迁移到 westus 9971
  • FIXED Actors: 在运行时初始化时注册/注销主持 9976
  • RESOLVED CI: 在 arm64 上原生运行 macOS 测试 9979
  • RESOLVED 工作流历史记录传播的 getLast 函数名称 9981
  • RESOLVED 杂务(ci): 更新 vm 尺寸 9983
  • RESOLVED 杂务: 更新 durabletask-go 和 components-contrib 9992
  • RESOLVED 修复测试 flaky 9993
  • RESOLVED fix(ci): 为 AKS 测试池使用 Hyper-V Gen 1 兼容的 Windows VM 尺寸 9994
  • RESOLVED 修复: 更新 Go SSH crypto 依赖项 9999
  • RESOLVED 修复 dep review: net 10003
  • RESOLVED 文档: 列出新的工作流有效载荷大小比例指标 10005
  • RESOLVED 工作流: 在创建唤醒提醒之前保存收件箱事件 10008
  • RESOLVED 测试: 稳定化 flaky CI 测试 10013
  • RESOLVED github.com/dapr/kit: 更新 0.18.1 10014
  • RESOLVED 修复关键漏洞: 将 durabletask-go 升级到 v0.12.1 并升级 pgx 10015
  • RESOLVED 工作流: 保留器忽略未完成错误 10019
  • RESOLVED 依赖项更新: govulncheck 10020
  • RESOLVED fix(mcp): 在 mcpserver wf 注册时门控 /healthz/outbound 10023
  • RESOLVED 使用 contrib v1.18.0-rc.1 并升级 kit 10024
  • RESOLVED ci(e2e): 在工作流中重命名 Azure Key Vault 资源 10030
  • RESOLVED ci: 将 azure/login 固定为 v3 10034
  • RESOLVED 功能: 注册 nameformat nameresolution 组件 10038

Dapr CLI

  • FIXED 使用镜像注册表不再尝试通过网络访问。 1575
  • CHORE 使用 dapr v1.17.3 1598
  • CHORE 添加共享工作流 1603
  • FIXED 修复 flaky 独立 e2e 通过放弃 “Exited App successfully” 要求 1605
  • CHORE 杂务: 从镜像注册表而不是 github 获取最新版本 1615
  • FIXED fix(ci): 创建发布标签后触发 CLI 构建 1626
  • FIXED 修复: 根据 proto 变更重命名 1629

组件

  • FIXED Dapr 批量发布/订阅与 rabbitmq 的 bug 3663
  • FIXED 为 Blob Storage 生成 SAS 令牌的问题 3817
  • UPDATED Oracle 状态存储批量查询改进 4041
  • RESOLVED 功能(pubsub/azure/servicebus/queues): 添加认证测试 4150
  • RESOLVED fix(nameresolution.aws.cloudmap): 在 metadata.yaml 中引用数字示例 4233
  • RESOLVED 组件元数据捆绑包 GHA 调整 4234
  • CHORE 杂务: 使用 dapr-bot 创建 backport PR 4237
  • FIXED ci: 合并到主分支时工作流运行两次 4240
  • FIXED fix(configuration): 确保 postgresql 配置从组件规范读取 pgNotifyChannel,而不是要求客户端代码传递它 4241
  • RESOLVED 修复: 修复 dynamodb 状态存储稳定测试 4242
  • RESOLVED fix(state/oracledatabase): 在 BulkGet 中返回按键错误而不是 HTTP 500 4243
  • FIXED fix(pubsub/pulsar): 在发布前验证 JSON 消息是否符合 Avro schema 4244
  • ADDED 功能: 当指定多个 redis stream 裁剪策略时发出警告 4252
  • FIXED ci: 允许在主分支中重新运行失败的作业 4260
  • SECURITY 修复(common/redis): 停止无条件跳过 TLS 证书验证 4261
  • RESOLVED 更新 Kafka Sarama Client 依赖项 4264
  • FIXED fix(pubsub/pulsar): 在订阅路径上解码 Avro 二进制有效载荷 4266
  • FIXED fix(conversation): langchaingokit LLM 日志记录器中的空指针解引用 4268
  • ADDED 功能(config): 添加 config map 作为配置 4275
  • ADDED 为 Oracle 状态存储组件添加连接池支持。 4276
  • FIXED 如果必需的工具调用未完成则返回错误 4277
  • FIXED 修复 MongoDB 状态存储以实现 KeysLiker 4278
  • RESOLVED 测试(cassandra): 修复认证测试中的端口冲突 4284
  • CHORE fix(state/cockroachdb): 将镜像从 v21.2.3 更新到 v23.2.29 4291
  • ADDED 为 AWS S3 绑定添加批量文件传输操作 4292
  • ADDED Azure Blob Storage 绑定: 添加批量操作 4295
  • ADDED pubsub/kafka: 每消息分区支持 4298
  • ADDED bindings/azure/blobstorage: 添加预签名 4299
  • ADDED 功能(pubsub/pulsar): 在 Pulsar Schema Registry 中注册 CloudEvents 信封 Avro schema 4302
  • FIXED fix(pubsub/pulsar): 使用 goavro 编解码器验证 JSON schema 有效载荷是否符合 schema 定义 4305
  • ADDED fix(pubsub/pulsar): 从组件元数据读取 processMode 并添加异步背压 4309
  • ADDED 转发端口: ollama: 在规范中添加缺失的端点元数据字段 (#4287) 4314
  • CHORE 使用共享工作流 4315
  • FIXED fix(pubsub/rabbitmq): 使用唯一的消费者标签以防止重启时订阅中断 4326
  • RESOLVED [1.18] zeebe oauth 支持 4330
  • ADDED 在对话响应中显示 LLM 模型 4331
  • FIXED fix(ci): 在 create-release 工作流中创建带有元数据捆绑包的 GitHub 发布 4333
  • UPDATED [1.18] Azure appconfig - 在元数据中包含 contentType 和 label 4338
  • ADDED 功能(state/oracledatabase): 添加 BulkGet 分块以避免 Oracle IN-list 限制 4341
  • ADDED 功能(state/oracledatabase): 添加 BulkGet 分块以避免 Oracle IN-list 限制 4351
  • ADDED 为 Pulsar 发布/订阅组件添加即时批量订阅 4364
  • ADDED 功能(state/sqlserver): v2 原生批量 BulkGet 4365
  • ADDED 功能(pubsub/kafka): 添加 PausableSubscriber + 加固优雅关闭 4366
  • CHORE 升级到 go1.26 4372
  • RESOLVED 杂务: 将 sarama 升级到 1.48.0 4373
  • UPDATED 在 microsoft foundry 中启用 anthropic 4374
  • FIXED fix(pubsub/kafka): 在基于计数的批量刷新后重置 await 计时器 4378
  • RESOLVED fix(ci): 更新 artifact 转换 4381
  • FIXED fix(tests): 将 influxdb 限定为 v2.9 4382
  • ADDED 为 Pulsar 发布/订阅组件添加 listenerName 元数据字段以支持 advertisedListeners。 4386
  • RESOLVED CI: 修复测试 4389
  • RESOLVED 版本升级: kit/dapr/go-sdk 4391

.NET SDK

通用

  • ADDED Dapr.SecretsManagement#1794 将密钥管理拆分为其自己的客户端
  • ADDED Dapr.StateManagement#1806 将状态管理拆分为其自己的客户端
  • ADDED 为 SDK 添加了丰富的向后兼容支持,以更好地支持运行时 API 成熟生命周期 #1816
  • ADDED 序列化器从 Dapr.Workflow 重构到 Dapr.Common #1805 作为在 .NET SDK 中实现通用序列化的前奏
  • ADDED 为配置提供程序添加可选参数以支持非阻塞启动 #1844
  • UPDATED 将 DaprDefaults 设为公共 #1845
  • FIXED 防止在 GrpcProtocolHandler 处置期间出现竞态条件 #1798

Actors

  • ADDED UnloadStateAsync 实现 #1750 强制 actor 卸载其当前缓存的内存状态(不影响持久化状态)。下次调用 GetStateAsync 时,缓存将照常重新填充。

PubSub

  • FIXED 订阅者弹性: 当边车不可用时,SubscribeAsync 现在会抛出 DaprException 而不是静默失败 #1803

元数据

  • ADDED 添加新的 Dapr.Metadata 包,用于从 Dapr 元数据 API 检索强类型数据 #1846。 要使用,从 NuGet 添加 Dapr.Metadata 包,在 DI 中使用 builder.Services.AddDaprMetadata() 注册,只需注入 IOptions<DaprMetadata>IOptionsSnapshot<DaprMetadata>IOptionsMonitor<DaprMetadata> 并读取注入的值中的值。

服务调用

  • UPDATED InvokeMethodAsync 系列标记为 [Obsolete] 使 SDK 与先前的运行时指导保持一致——推荐指导是使用原生 HTTP/gRPC 客户端进行服务调用 #1698

Jobs

  • UPDATED Jobs API 标记为稳定 #1804
  • UPDATED 最低版本标签调整以反映更广泛的测试覆盖范围 (#1811)。

工作流

  • ADDED 工作流历史记录上下文传播 (#1802)
  • UPDATED 整合 Dapr.Workflow 元项目 (#1822) 和自动工作流/活动注册 (#1823)。 这意味着不再需要单独安装 Dapr.Workflow.VersioningDapr.Workflow.Analyzers。所有都捆绑在一个 Dapr.Workflow 包中,无需重构(尽管您可能想要删除过时的包)。
  • UPDATED 应用程序关闭时不再记录连接关闭异常 #1841
  • UPDATED 使用服务器阻塞 WaitForInstance* RPC 而不是客户端轮询 #1843
  • ADDED 计时器来源和向后兼容的可选计时器 (#1790)
  • ADDED 添加工作流分析器关于版本控制的诊断 (#1815
  • ADDED 在工作流状态上公开名称 #1836
  • ADDED 支持历史记录传播 API #1825, #1833
  • FIXED 工作流补丁顺序 #1807, #1809
  • FIXED 修复工作流用户活动的下游调用的跟踪传播 #1808
  • FIXED 解决 “no such instance exists” 错误 #1818, #1812
  • FIXED 修复工作流跟踪关联 #1829
  • FIXED 向 proto 转换器添加缺失的 FailureDetails 属性 #1831

杂项/测试

  • ADDED Actors.Generators 的集成测试项目 #1791
  • ADDED 添加带有 HTTP/2 前言的 gRPC 探针,以消除通过 Testcontainers 进行集成测试期间的一些瞬时 Unavailable 错误 #1821
  • UPDATED 稳定化 flaky 集成测试 #1813
  • UPDATED CI 脚本更准确地自动检测有效的 Dapr 运行时版本以支持自动 N-2 验证 #1810
  • REMOVED 移除已弃用的分析器/代码修复 #1834

Java SDK

  • ADDED 添加信封支持 1659
  • TEST 杂务: 添加测试以验证工作流重连逻辑 1692
  • UPDATED Dapr Java SDK 1.18 使用 Java 源代码 17 1694
  • UPDATED 使用最新的 protobuf 1698
  • ADDED 发布 dapr-sdk-bom 构件 1720
  • CHORE 杂务: 将最低 Java 版本从 11 提高到 17 1721
  • ADDED 功能: 发布 dapr-sdk-bom 构件用于传递依赖管理 1722
  • ADDED 为本地观测添加跟踪传播 1724
  • FIXED fix(durabletask): 检测关闭并中断 gRPC worker 循环 1727
  • ADDED 实现计时器来源 1729
  • ADDED 功能(durabletask): 实现计时器来源和向后兼容的可选计时器 1733
  • UPDATED 功能: 将 Testcontainers 从 1.21.4 升级到 2.0.5 并将 JUnit 4 迁移到 JUnit 5 1736
  • RESOLVED 添加对工作流历史记录传播的支持 1737
  • ADDED 功能: 下载 attestation.proto 并使用 Runtime 1.18.0-rc.3 1738
  • RESOLVED [阶段 1] 修复 Flaky 集成测试 + 将一些测试迁移到 Test Containers 1741
  • ADDED 功能: 添加 DaprClient.invokeHttpClient(appId) 工厂 1742
  • ADDED DaprClient.invokeHttpClient(appId) 工厂 — 一个预配置用于服务调用的 SDK 原生 HTTP 客户端,与 .NET 的 CreateInvokeHttpClient 镜像,并作为现已弃用的 invokeMethod API 的继承者。 1743
  • FIXED fix(release): 在升级 dapr-spring-bom 之前本地安装 dapr-sdk-bom 1744
  • ADDED 为流式订阅添加死信主题支持 1746
  • RESOLVED 修复: 在 worker 重连尝试之间重置 gRPC 通道退避 1757

Python SDK

通用

  • REFACTOR durabletask-python 合并到 SDK 中 #963
  • ADDED Python 3.14 支持并移除剩余的 Python 3.9 残留 #916
  • UPDATED 将版本集中到单个文件并移除开发构建 #1020
  • UPDATED 默认无 60 秒超时 #956; 默认 drain_ongoing_call_timeout 为 None #1016
  • ADDED 通过 DAPR_GRPC_MAX_INBOUND_MESSAGE_SIZE_BYTES 可配置最大入站消息大小 #1024
  • ADDED 添加 aio 模块并更新 mypy 配置以包含 aio 文件 #942
  • UPDATED 使用单个 v* 标签发布 #970

工作流

  • ADDED 工作流历史记录上下文传播 #1025; 将历史记录传播 API 与 go-sdk 对齐 #1047
  • ADDED 填充计时器来源字段 #976
  • ADDED 在工作流和活动输入上支持 Pydantic 模型 #982
  • FIXED when-all 错误处理 #978
  • FIXEDDAPR_API_TIMEOUT_SECONDS 应用于工作流 gRPC 连接 #954
  • UPDATED Worker 无限期等待启动 #983
  • FIXED 对齐工作流多应用命名约定 #932
  • REMOVED 已弃用的工作流操作 #943

MCP

  • ADDED Dapr MCP 客户端 #997
  • FIXED 在瞬时 gRPC 错误时重试连接调用 #1062

发布/订阅

  • ADDED 批量发布/订阅支持 #915

Jobs

  • UPDATED Jobs API 标记为稳定 #1060

杂项/测试

  • ADDED DaprClient 响应的集成测试 #981
  • REFACTOR 从示例验证中移除 Mechanical Markdown #977
  • FIXED 修复 CI 构建 #979

JavaScript SDK

通用

  • UPDATED 文档(actors): 为 actor 运行时模型和状态元数据添加 JSDoc 815
  • UPDATED 为所有公共接口添加全面的 JSDoc 注解 816
  • UPDATED 文档(jsdoc): 为导出的类型定义添加注解 817
  • UPDATED 文档(jsdoc): 为客户端和服务器实现添加注解 818
  • REMOVED 从已发布的构建中移除 dapr-client 773
  • FIXED 修复: 更正已发布包中的类型路径 806
  • UPDATED 更新 buf 配置以发出 CommonJS 模块而不是 ESM 826

工作流

  • UPDATED 重命名工作流方法以与其他 SDK 保持一致 783

文档

  • RESOLVED 文档: 只支持一种 Redis 流修剪策略 5061
  • RESOLVED 更新流式 HTTP 服务调用的弹性 5068
  • RESOLVED 文档(agents): 随 v1.0 rcs 发布更新 5071
  • RESOLVED 工作流: 保留策略不是追溯性的 5074
  • RESOLVED 工作流: wf purge --all-older-than --all-filter-status 5075
  • RESOLVED 文档(pulsar): 添加 CloudEvents schema 包装、rawschema 选项和 processMode 改进 5084
  • RESOLVED 杂务: 将 Azure Static Web App 基主机名更新到新帐户 5095
  • RESOLVED 杂务: 修复 Azure Static Web App 暂存 URL 区域后缀 5096
  • RESOLVED 杂务: 将 Azure Static Web App 更新到新实例 5097
  • RESOLVED 还原: 恢复原始 Azure Static Web App 配置 5098
  • RESOLVED 修复 hugo.yaml 中重复的 archived_version 键 5101
  • RESOLVED 记录 allowedServiceAccounts 5105
  • RESOLVED 为 Zeebe command 和 JobWorker 绑定添加 OAuth 配置字段 5106
  • RESOLVED 文档(agents): 添加 MistralChatClient 到受支持的 LLM 5108
  • DOCS [1.18] 添加全局和按名称工作流并发限制的文档 5109
  • RESOLVED [1.18] WorkflowAccessPolicy 5114
  • RESOLVED 1.18 为 Azure App Configuration 添加响应元数据部分 5118
  • RESOLVED 修复: 更正断开的 ref 短代码链接 5126
  • RESOLVED 更新文件编号以匹配 dapr-agents 上的 quickstarts/ 5143
  • RESOLVED 还原 “native-sidecar 文档 (#5041)” 5146
  • RESOLVED 添加 Reo.dev 和 cookie 横幅 5147
  • RESOLVED 文档(agents): 记录 DurableAgent 的重放感知日志记录 5149
  • RESOLVED 文档(outbox): 记录 outboxInternalTopic 元数据字段 5155
  • RESOLVED 修复 gcp storage bucket 绑定文档 5157
  • RESOLVED 改进 ASP.NET Core 文档并引用 NuGet 库 5164
  • RESOLVED 文档: Sentry Ed25519 工作负载身份密钥 5181
  • RESOLVED 文档: 阐明 max-body-size 适用于请求和响应 5186

升级到 Dapr 1.18

要升级到此版本的 Dapr,请按照以下步骤操作以确保顺利升级。

本地机器 / 自托管

使用您当前安装的 CLI 卸载 Dapr。请注意,这将删除默认的 $HOME/.dapr 目录、二进制文件以及所有容器 dapr_redisdapr_placementdapr_zipkin。如果 docker 命令需要 sudo,Linux 用户需要运行 sudo

dapr uninstall --all

此处下载最新版本,并将 dapr 二进制文件放入您的 PATH

安装 CLI 后,运行:

dapr init --runtime-version=1.18

等待更新完成,然后确保您使用的是最新版本的 Dapr (1.18):

$ dapr --version

CLI version: 1.18
Runtime version: 1.18

Kubernetes

从先前版本升级

您可以使用 Helm 3 和 Dapr CLI 执行零停机升级。

使用 CLI 升级

此处下载最新版本,并将 dapr 二进制文件放入您的 PATH

要升级 Dapr,运行:

dapr upgrade --runtime-version 1.18 -k

要以高可用模式升级:

dapr upgrade --runtime-version 1.18 --enable-ha=true -k

等待操作完成,并使用 dapr status -k 检查您的状态。

注意:确保您的部署已重启以获取最新版本的 Dapr 边车。

使用 Helm 升级

要使用 Helm 升级 Dapr,运行:

helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update

helm upgrade dapr dapr/dapr --version 1.18 --namespace=dapr-system --wait

等待操作完成,并使用 dapr status -k 检查您的状态。

注意:确保您的部署已重启以获取最新版本的 Dapr 边车。

在集群上全新安装

参见 如何在 Kubernetes 集群上部署 Dapr 了解在 Kubernetes 上安装 Dapr 的完整指南。

您可以使用 Helm 3 安装 Dapr:

helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update

kubectl create namespace dapr-system

helm install dapr dapr/dapr --version 1.18 --namespace dapr-system --wait

或者,您可以使用最新版本的 CLI:

dapr init --runtime-version=1.18 -k
安装后

验证控制平面 Pod 正在运行且健康:

$ dapr status -k
  NAME                   NAMESPACE    HEALTHY  STATUS   REPLICAS  VERSION  AGE  CREATED
  dapr-sidecar-injector  dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-sentry            dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-operator          dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-placement         dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-scheduler         dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39

安装 Dapr 1.18 后,对您的部署执行滚动重启以获取边车的新版本:

kubectl rollout restart deploy/<deployment-name>

降级到早期版本

[!warning] 不要从 1.18 直接回滚到 1.17.6 或更早版本。

Dapr 1.18 引入了 Ed25519 工作负载身份密钥,Sentry 将 Ed25519 键控的 CA 持久化到 dapr-trust-bundle 密钥中。1.17.7 之前的 Sentry 版本无法解析此捆绑包,并会在启动时崩溃并显示:

fatal: error creating CA: failed to get CA bundle:
failed to verify CA bundle: unsupported key type ed25519.PrivateKey

当 Sentry 关机时,无法签发新的工作负载证书;具有未过期证书的现有边车继续工作,但任何边车重启或证书过期都将无法获得新的身份。

兼容性矩阵

结果
1.18 1.17.7+ ✅ 安全。1.17.7 反向移植了 Ed25519 PEM 解码器修复 (dapr/dapr#9904),因此 Sentry 可以按原样读取 1.18 信任捆绑包。
1.18 1.17.6 或更早 ❌ Sentry 在启动时崩溃循环。不要尝试此回滚。
1.17.6 或更早 1.18 ✅ 安全。1.18 Sentry 接受任何算法的 CSR;现有的 ECDSA P-256 捆绑包被透明地读取。

安全回滚路径

如果您必须降级到 1.17.7 以下,请先经过 1.17.7

  1. 将控制平面回滚到 1.17.7(它包含 Ed25519 解析修复,并且是可以读取 1.18 颁发的信任捆绑包的最早版本)。
  2. 让 Sentry 稳定下来,并确认 dapr status -k 是健康的。
  3. 从 1.17.7,降级到您的目标版本。请注意,您可能需要先将 CA 轮换为目标版本原生生成的算法——请参阅您的 Sentry CA 轮换操作手册。

回滚控制平面

使用 Helm 回滚(首选)或在目标版本重新安装:

# Helm: 列出修订版,然后回滚到所需版本
helm history dapr -n dapr-system
helm rollback dapr <REVISION> -n dapr-system --wait

# 或固定特定版本
helm upgrade dapr dapr/dapr --version 1.17.7 --namespace dapr-system --wait

控制平面恢复后,对应用程序部署执行滚动重启,以便边车获取较旧的注入器镜像并针对回滚的 Sentry 重新颁发其身份。

哪些不需要轮换

1.18 → 1.17.7 不需要手动 CA 轮换。Ed25519 键控的捆绑包保持有效;1.17.7 读取它,继续针对现有信任锚点签发 CSR,来自 1.17.x 边车的 ECDSA/RSA CSR 正常签名。仅当您的降级目标低于 1.17.7 或您的安全策略要求时,才需要重新轮换 CA。

不兼容变更

[!warning] 升级前请仔细审查

  • WorkflowsRemoteActivityReminder 默认开启。 跨应用工作流活动结果现在默认通过调度器提醒交付。参见 dapr/docs#5128dapr/dapr#9789
  • HotReload 默认开启。 组件、订阅、MCPServer、配置、HTTPEndpoint、弹性(Resiliencies)和 WorkflowAccessPolicy 默认进行热重载。要恢复 1.18 之前的行为,请在 Dapr Configuration 中禁用 HotReload 功能(spec.featuresenabled: false)。参见 dapr/dapr#9811
  • 边车探针默认值更改。 存活探针更宽容(kubelet 重启前约 230 秒);就绪探针更严格(控制平面约 3 秒 / daprd 约 5 秒)。自定义 Helm 覆盖可能需要重新调整。参见 dapr/dapr#9818
  • 工作流 ID 重用语义更改。 1.18 之前的工作流 ID 重用策略已被移除;现在使用已有活动实例的实例 ID 创建工作流会因冲突错误(an active workflow with ID '<id>' already exists)而失败,而不是静默覆盖或忽略它。以前依赖静默覆盖或忽略行为的调用者必须适应。参见 dapr/docs#5102
  • 逐跳头在服务调用时被剥离。 标准的逐跳 HTTP 头(ConnectionKeep-AliveProxy-AuthenticateTransfer-Encoding 等)现在在服务调用期间被剥离,符合 RFC 7230。依赖于这些传递的应用程序必须迁移到非逐跳的等效项。参见 dapr/docs#5172dapr/dapr#9759
  • JS SDK:dapr-client 已移除。 独立的 dapr-client npm 包不再发布。消费者必须迁移到统一的 @dapr/dapr 包。参见 dapr/js-sdk#773
  • Java SDK:最低 Java 版本现在是 17。 Dapr Java SDK 不再支持 Java 11。参见 dapr/java-sdk#1721 和跟踪问题 #1694
  • 回滚下限是 1.17.7。 Dapr 1.18 将 Ed25519 键控的 CA 写入信任捆绑包。1.17.7 之前的 Sentry 版本无法解析此捆绑包,并会在启动时崩溃。从 1.18 降级的操作员必须先经过 1.17.7(或更新的 1.17.x)才能进行任何进一步的回滚。参见 降级到早期版本 部分和 dapr/dapr#9598 / #9904

弃用通知

  • 工作流:工作流实例 ID 重用策略已移除。实例 ID 冲突时的 IGNORE 和 TERMINATE 操作不再支持;使用属于正在运行实例的实例 ID 创建工作流始终会因冲突错误而失败。其工作流已达到终止状态(完成、失败或终止)的实例 ID 仍然可以重用;从 1.18.2 开始,这还要求先前执行的每个子工作流(递归检查)也处于终止状态。要无条件释放实例 ID,请通过清除 API 清除现有工作流或配置工作流保留策略。[dapr/dapr#9739]
  • Java SDK:Spring Boot 3.4 和 3.5 已弃用。 参见 dapr/java-sdk#1718
  • Java SDK:invokeMethod API(已弃用)。 使用此版本引入的新 DaprClient.invokeHttpClient(appId) 工厂。参见 dapr/java-sdk#1743
  • .NET SDK:服务调用 InvokeMethodAsync 系列标记为 [Obsolete] 推荐指导是使用原生 HTTP 或 gRPC 客户端进行服务调用。参见 dapr/dotnet-sdk#1698
  • JS SDK:工作流方法重命名。 get / start / raise 重命名为 getWorkflowState / scheduleNewWorkflow / raiseEvent 以与其他 SDK 保持一致。旧名称作为弃用别名保留并将继续工作,删除计划在 Dapr 1.20 时进行。参见 dapr/js-sdk#783
  • Dapr Dashboard 已弃用 仓库已归档。dapr/dashboard 仓库已归档且不再维护,因为它已远远落后于 daprd,维护者选择将其停止而不是发布过时的 UI。有关维护的替代方案,请参阅 Diagrid Dev Dashboard;否则使用 kubectl、dapr CLI 子命令或您的可观测性堆栈(Grafana/Prometheus)来检查 Dapr 状态。

更新内容 (原始)

Dapr 1.18

We’re excited to announce the release of Dapr 1.18! This is primarily a Workflows release, focused on security, durability, and scale. Workflow history can now optionally be cryptographically signed and verified on every state load, so tampering is caught the moment state is read. The same protection extends across application boundaries: child workflow and activity completions are attested between apps. A new WorkflowAccessPolicy resource controls which application IDs may invoke which workflows and activities. Workflows can also propagate slices of their history to the children they schedule, letting a child act on upstream context instead of reading it back from a state store. And the Scheduler gained global and per-name concurrency limits that cap how many workflows or activities run at once across the cluster.

Outside of Workflows, the Jobs API graduates to stable, hot-reloading of components and other resources is now GA and on by default, and the sidecar injector understands Kubernetes native sidecar containers. This release also introduces a new MCPServer resource that exposes Model Context Protocol tool calls as durable Dapr Workflows. Several changes make the control plane steadier under load: an opt-in coalesce window collapses redundant placement dissemination rounds during large scale-ups, placement and scheduler support hard anti-affinity, host resolution now works over IPv6 and dual-stack, and pub/sub drains in-flight messages on graceful shutdown instead of dropping them.

Before you upgrade, note one change in Sentry. It now generates workload identity keys using Ed25519 instead of ECDSA. This is invisible on a fresh install or a normal upgrade, but it means you cannot safely roll back below 1.17.7. See the new Downgrading section for the safe rollback path.

Thanks to all the new and existing contributors who helped make this release happen.

If you’re new to Dapr, visit the getting started page and familiarize yourself with Dapr.

The docs have been updated with all the new features and changes of this release. To get started with new capabilities introduced in this release, go to the Concepts and the Developing applications.

Note: This release contains a few breaking changes.

Go to the upgrading Dapr section for steps to upgrade to version 1.18.

Acknowledgements

Thanks to everyone who made this release possible!

@1Ninad, @acroca, @alekhrycaiko, @antontroshin, @artur-ciocanu, @aviralgarg05, @bibryam, @CasperGN, @cerebrixos, @cicoyle, @Copilot, @cyphercodes, @Eckii24, @erj826, @erwinkramer, @famarting, @gaganhr94, @imneov, @ja-sg, @javier-aliaga, @Jeevansm25, @jjcollinge, @jmfloreszazo, @JoshVanL, @lrascao, @marcduiker, @matheusandre1, @MichaelHindley, @middt, @mikeee, @mohitpalsingh, @MukundaKatta, @MyMirelHub, @nelson-parente, @nikitasarawgi, @officialasishkumar, @olitomlinson, @pablochacin, @Pittu-Sharma, @pravinpushkar, @Rishabh-git10, @salaboy, @seherv, @sicoyle, @siri-varma, @spolom, @stywzn, @vaibhavatlan, @WhitWaldo, @yaron2, @ZeynelKoca

Highlights

These are the v1.18 release highlights:

WorkflowAccessPolicy

WorkflowAccessPolicy is a new Kubernetes CRD that controls which Dapr app IDs are allowed to operate on which workflows running on a target app. Before v1.18, any caller in the same trust domain could schedule, terminate, or query any other app’s workflows. That was acceptable for single-team clusters but a real problem in shared or multi-tenant ones, especially now that workflows can branch into remote apps where unrestricted cross-app calls are a security risk.

The policy is a pure allow-list:

  • With no policy loaded for a target app, every call is allowed — open by default, so existing deployments are unaffected.
  • With one or more policies loaded, the target defaults to deny, and only calls matching a rule are permitted.
  • Self-calls (where the caller’s app ID equals the target’s) are always allowed and need no rule.

Caller identity comes from the SPIFFE identity in the mTLS certificate for remote calls, and from the local app ID for same-sidecar calls. Untrusted identity headers on user-facing requests are stripped before evaluation, so one app cannot spoof another’s identity.

Rules are expressed per operation. Workflows support all eight operations — schedule, terminate, raise, pause, resume, purge, get, and rerun — while activities support schedule only. Names can be exact or glob patterns (*, ?, [abc]).

Example:

apiVersion: dapr.io/v1alpha1
kind: WorkflowAccessPolicy
metadata:
  name: orders-policy
  namespace: production
scopes:
  # the target apps that load and enforce this policy
  - orders-target
spec:
  rules:
    # Frontend and ops-console can schedule and terminate OrderWF.
    - callers:
        - appID: frontend
        - appID: ops-console
      workflows:
        - name: OrderWF
          operations: [schedule, terminate]

    # Frontend can also schedule the ChargePayment activity directly.
    - callers:
        - appID: frontend
      activities:
        - name: ChargePayment
        - name: "RefundEvent*"

When a call is denied, the caller receives an opaque error (access denied by workflow access policy) that doesn’t reveal which rule matched or what the policy would otherwise allow.

For configuration and examples, see How-To: Apply workflow access policies and the WorkflowAccessPolicy spec. For background, see Workflow access control in the security concepts.

Workflow History Tamper Detection

Workflow history events can now be optionally cryptographically signed and verified. Each step’s signature is produced under the sidecar’s mTLS X.509 SPIFFE identity and chained to the previous one, creating an auditable signature chain that is checked on every state load.

Each workflow execution step produces a batch of history events that are signed and chained to the previous signature:

  ┌─────────────────────────────────────────────────────────────┐
  │                    Workflow History                         │
  │  Event 0 ─ Event 1 ─ Event 2 ─ Event 3 ─ Event 4 ─ Event 5  │
  └─────┬──────────┬─────────┬──────────┬─────────┬──────────┬──┘
        ▼          ▼         ▼          ▼         ▼          ▼
  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐
  │    Signature 0   │  │    Signature 1   │  │    Signature 2   │
  │  Events [0,2)    │  │  Events [2,4)    │  │  Events [4,6)    │
  │  prevDigest: nil ├─►│ prevDigest: d0   ├─►│  prevDigest: d1  │
  └──────────────────┘  └──────────────────┘  └──────────────────┘

On every state load, the runtime verifies:

  • chain linkage between signatures (prevDigest),
  • event contiguity (no gaps in the [start, end) ranges),
  • digest recomputation matches the signed digest,
  • the signature itself,
  • certificate validity at event time, and
  • the signing app’s SPIFFE identity matches the workflow’s owning app ID.

If verification fails, the actor appends a terminal ExecutionCompleted event with the well-known error type DAPR_WORKFLOW_HISTORY_TAMPERED, terminates the in-flight workflow, and leaves the original (untrusted) state intact for forensic inspection.

Two additional layers extend the same integrity guarantee across app boundaries:

  • Child workflow and activity completion attestation — before a child workflow or activity reports back to its parent, the executor signs a ChildCompletionAttestation / ActivityCompletionAttestation that commits to the parent instance ID, parent task scheduled ID, a canonical input/output digest (SHA-256 over a wire-format-independent, NFC-normalized encoding so the digest is stable across language SDKs), the signer’s certificate chain digest, and the terminal status. The parent verifies the attestation on inbox ingestion and stores the foreign signer’s certificate in the ext-sigcert table, keyed by certificate-chain digest.
  • Cryptographic verification of propagated history — every chunk of propagated history now carries its own chunk-local signature and DER cert chain, produced at dispatch time by the chunk’s owning app. Receivers verify each chunk against the Sentry trust anchor and check that the leaf SPIFFE ID’s app component matches chunk.appId.

Signing is a one-way decision. Once a workflow is created with signing enabled, its history must stay signed — disabling signing for that workflow (or enabling it on one that started unsigned) is a hard verification error, and there is no catch-up signing of pre-existing events. Before turning signing on cluster-wide, let any in-flight unsigned workflows complete or purge them. The feature is gated by the WorkflowHistorySigning configuration feature flag, requires mTLS to be active (daprd refuses to start with signing enabled but mTLS off), and is disabled by default in v1.18.

See Workflow history signing for how to enable signing, the verification model, and the cross-app attestation guarantees.

Workflow History Context Propagation

Workflows can now propagate slices of their history down to child workflows and activities, where the consumer can query it by name.

Two opt-in propagation modes are supported:

  • Lineage — the full ancestor chain of workflow history is propagated to children.
  • OwnHistory — only the current workflow’s own history is propagated to its immediate children.

Propagation is per call: the caller decides whether — and what — to propagate when scheduling a child workflow or activity, and the consumer reads it back through a typed query API (for example, fetching a previously-completed activity’s result by workflow name and activity name). This avoids threading state through inputs or reaching into a state store, the latter of which would break workflow determinism.

See Workflow history propagation for the Lineage and OwnHistory modes and the typed query API.

Workflow Concurrency Limits

Workflow and activity concurrency can now be capped at the scheduler, across all sidecar replicas, alongside the existing per-sidecar limits. You can set a global maximum across all workflows or activities, plus per-name limits for specific workflow or activity names.

When a limit is hit, the scheduler holds triggers in a pending queue and dispatches them as slots free up via the existing ACK protocol. Global limits are sharded deterministically across scheduler instances: each replica enforces an even share of the limit, with the remainder handed to the lowest-indexed replicas so the cluster-wide total matches what you configured. Per-name limits run as independent gates, and a trigger must pass every applicable gate before it dispatches. There is one edge case: if a global limit is set lower than the number of scheduler replicas, each replica still allows one concurrent invocation to avoid starvation, so the effective cap can exceed the configured value.

spec:
  workflow:
    globalMaxConcurrentWorkflowInvocations: 50
    globalMaxConcurrentActivityInvocations: 200
    activityConcurrencyLimits:
      - name: SendEmail
        maxConcurrent: 5
    workflowConcurrencyLimits:
      - name: OrderProcess
        maxConcurrent: 20

See Workflow concurrency limits for how to configure the global and per-name limits.

Graceful Stall on Oversized Workflow Payloads

Previously, a workflow whose history payload (PastEvents + NewEvents + PropagatedHistory) exceeded the Dapr API gRPC server’s MaxSendMsgSize (= --max-body-size, default 4 MiB) caused stream.Send on the GetWorkItems server stream to return ResourceExhausted. The whole stream was torn down, cancelling every other workflow pending on it. The SDK would reconnect, and the same offending workflow would fail again, in a loop.

In v1.18, the orchestrator precomputes the proto size of the dispatch a workflow (or activity) would produce and compares it against 95% of --max-body-size. The 5% headroom covers the WorkflowStarted event the engine injects plus gRPC framing. Anything over the threshold is gracefully stalled in a recoverable state, leaving the rest of the stream untouched. The runtime emits the payload size as a ratio of the limit so operators can watch the distribution, and a stalled instance resumes once you raise --max-body-size and restart daprd. No instance is lost.

See Workflow payload size limits for the stall behavior, the payload-size ratio metric, and how to recover a stalled instance.

Workflow External Event Timers

A WaitForExternalEvent wait with no timeout used to be invisible to the runtime: from the outside, there was no way to tell what an instance was blocked on. In v1.18 such an indefinite wait materialises a synthetic timer (with a fire-at far enough in the future that it never actually fires), tagged with an origin that records the name of the event being awaited. With the existing RaiseEvent API, this makes approval gates and other human-in-the-loop workflows operable. The same timer-origin field also distinguishes timers created as activity and child-workflow retry delays, so every timer in a workflow’s history now records why it was created.

See External events and the external system interaction pattern for how to author approval gates and other human-in-the-loop workflows using WaitForExternalEvent and RaiseEvent.

Jobs API is now Stable

The Jobs API graduates to stable in v1.18. Performance regression tests were added as part of the stabilization work to guard against future regressions.

You should move application code to the stable ScheduleJob / GetJob / DeleteJob endpoints and the OnJobEvent callback. The alpha RPCs (ScheduleJobAlpha1 and friends) are now deprecated but remain fully functional, and the transition needs no coordination: a 1.18 sidecar still serves the alpha RPCs for older clients, and updated SDK clients fall back to the alpha RPCs automatically when they detect an older sidecar. You can upgrade the runtime and migrate application code separately.

HotReload is now GA

Configuration and component hot-reloading graduates to GA and is on by default in v1.18. The following resources are hot-reloadable without restarting the sidecar:

  • Components
  • Subscriptions
  • MCPServers
  • Configurations
  • HTTPEndpoints
  • Resiliencies
  • WorkflowAccessPolicies

The Subscription reconciler now skips the close+reopen when an incoming Subscription event is functionally identical to the one already loaded. This fixes a startup race where the boot-time loader and the operator stream both delivered the same subscription, which previously caused transient subscriber overlap and occasional duplicated or lost messages.

Operators who want the pre-1.18 behavior can opt out by disabling the HotReload feature in the Dapr Configuration — add it to spec.features with enabled: false.

MCPServer Resource — Built-in Workflow Orchestration for MCP

A new MCPServer Kubernetes CRD, plus a built-in workflow orchestration engine, exposes Model Context Protocol (MCP) servers through the standard Dapr Workflow API.

When a sidecar loads one or more MCPServer resources, daprd registers built-in dapr.internal.mcp.<server>.ListTools and dapr.internal.mcp.<server>.CallTool.<toolName> workflow orchestrations. These execute MCP protocol calls as durable activities, so application code doesn’t need to import an MCP SDK, manage connections, or handle credentials. The runtime handles all of that, with the same durability guarantees as any Dapr workflow.

  • Transports: streamable_http, sse, stdio.
  • Auth: static header injection, OAuth2 client credentials (secret fetched at call time from Dapr secret stores with retryable error handling), and SPIFFE JWT SVID injection.
  • Spec-compliant: both ListTools and CallTool follow the MCP specification. ListTools returns each tool’s name, description, and inputSchema exactly as the server advertises them, without flattening, renaming, or rewriting the schema. CallTool preserves the full CallToolResult shape, including the content union (text, image with base64 + mimeType, audio with base64 + mimeType, resource_link with URI and metadata, and embedded resource with inlined text or blob), the isError flag, and any server-provided metadata. JSON-RPC envelopes pass through unmodified. Unknown or future content types fall back to a structured JSON envelope rather than being dropped, so the path stays compatible with new MCP revisions.
  • Lifecycle hooks: beforeCallTool, afterCallTool, beforeListTools, afterListTools, each able to mutate arguments / results.
  • Only loaded when used: the MCP executor is wired in only when at least one MCPServer resource is loaded, so sidecars with no MCP resources incur no MCP-related allocations.

The preview feature gate was removed before GA; loading the CRD is now the only opt-in (#9838).

Placement: Coalesce Window + Stable Scheduler Reload

Two improvements to placement dissemination behavior at scale:

  • Stable scheduler reload (always on). The actor-type list returned by actorTable.Types() is built by ranging a map, so its order was non-deterministic. scheduler.ReloadActorTypes compares that list against the last-seen one to decide whether to reconnect, and the reordering alone made it look changed — triggering spurious reconnects on rounds where nothing actually had. It now sorts the list and skips the reconnect when the sorted set is unchanged.
  • Post-round coalesce window (opt-in). A new --disseminate-coalesce-window flag (default 0 = disabled). When set, after a dissemination round completes with queued host registers/disconnects, the disseminator arms a one-shot timer instead of starting the next round immediately. Additional host events arriving inside the window accumulate and fold into a single follow-up round. The first event in an otherwise idle state still fires a round immediately, so cold-starts and isolated churn stay responsive; only sustained bursts pay the (configurable) latency to save rounds.

For 100+-replica scale-ups or rolling restarts, the coalesce window collapses what would have been O(N) follow-up rounds into O(1), removing N-1 rounds of drain+halt cost from every existing daprd in the namespace. Recommended values are 100–250 ms for clusters with frequent rapid churn. Default 0 preserves the existing behavior.

Placement & Scheduler: Hard Anti-Affinity

A configurable HA pod anti-affinity policy for the placement and scheduler StatefulSets in the Helm chart:

  • preferredDuringSchedulingIgnoredDuringExecution (default): soft anti-affinity; the Kubernetes scheduler tries to spread replicas but can still place pods when capacity is limited.
  • requiredDuringSchedulingIgnoredDuringExecution: hard anti-affinity; enforces replica separation and may leave pods pending if constraints cannot be satisfied.

Configured via global.ha.podAntiAffinityPolicy, and combinable with global.ha.topologyKey to choose the spread domain (e.g. topology.kubernetes.io/zone, kubernetes.io/hostname). The other control-plane components (operator, sentry, injector) continue to use the soft policy.

See Spreading Placement and Scheduler replicas in the production guidelines for how to configure global.ha.podAntiAffinityPolicy and global.ha.topologyKey.

Actor APIs: App-Initiated gRPC Streams

Actor hosts (the application side) can now open a single bidirectional gRPC stream to daprd via SubscribeActorEventsAlpha1 and receive all four callback types — invoke, reminder, timer, and deactivate — over that one connection. Apps no longer need to expose an HTTP or gRPC server port for daprd to call into; the connection flows app → sidecar, mirroring how pubsub subscriptions, configuration watch, and scheduler job streams already work.

It also makes actor hosts deployable behind tighter firewall and NetworkPolicy rules, since there’s no inbound port to allow.

Sidecar Probe Defaults Tuned for Production

Liveness probes are only appropriate as a last-resort restart mechanism for software you don’t own. For processes Dapr owns, short liveness windows turn transient blips (GC pauses, startup work, brief stalls) into restart loops. Readiness is the correct lever for routing traffic away from an unhealthy replica.

v1.18 pushes liveness well past any plausible real-world stall (~230 s before kubelet restart) while making readiness more responsive:

Liveness (control plane + injected sidecar):
  initialDelaySeconds: 180
  periodSeconds:        10
  failureThreshold:      5     (~230s before restart)

Readiness (control plane, few replicas — eject fast on failure):
  initialDelaySeconds: 1
  periodSeconds:       1
  failureThreshold:    3       (~3s to eject)

Readiness (daprd sidecar, more forgiving for user workloads):
  initialDelaySeconds: 1
  periodSeconds:       1
  timeoutSeconds:      1
  failureThreshold:    5       (~5s to eject; absorbs brief GC / CPU stalls)

See Sidecar health for the probe defaults, and the arguments and annotations reference for the dapr.io/sidecar-liveness-probe-* and dapr.io/sidecar-readiness-probe-* annotations used to override them.

Sentry: Ed25519 Workload Identity Keys

Sentry and workloads now generate X.509 certificate keys using Ed25519 instead of ECDSA P-256 for all workload identity. The migration is invisible on a fresh install or a normal upgrade.

  • Root CA and issuer CA keys are now Ed25519; the X.509 signature algorithm changes from ECDSAWithSHA256 to PureEd25519.
  • Sentry’s CA accepts CSRs of any supported algorithm (Ed25519, RSA, ECDSA), so mixed-version clusters during a rolling upgrade are fully supported — a 1.17.x daprd presenting an ECDSA CSR is still signed by a 1.18 sentry.
  • JWT signing remains RSA-2048 for cloud provider OIDC compatibility.
  • Injector and operator continue using RSA keys for their webhook serving certificates (#9873), because some managed Kubernetes distributions reject Ed25519 on admission webhooks.

Downgrade implications. Sentry versions before 1.17.7 cannot parse the Ed25519-keyed trust bundle that 1.18 writes to the dapr-trust-bundle secret and will crash on startup with unsupported key type ed25519.PrivateKey. See the new Downgrading to Earlier Versions section for the safe rollback path. Dapr 1.17.7 includes the dapr/kit PEM-decoder fix (dapr/dapr#9904) that makes 1.17.x forward-compatible with 1.18-issued bundles.

See Workload identity key algorithm in the security concepts for the full rationale, compatibility matrix, FIPS guidance, and the 1.17.7 downgrade floor. The operational view is in mTLS.

Component Improvements

Notable component highlights this cycle:

  • Configuration stores: New ConfigMap configuration store with both get and subscribe options (#4275) — for Dapr Agents this is valuable to hot-reload operator-led configurations; PostgreSQL fix to read pgNotifyChannel from component spec instead of requiring client code to pass it (#4241); Azure App Configuration surfaces contentType and label in metadata (#4338).
  • Pulsar pubsub: listenerName metadata field for advertisedListeners support, Avro schema registration on the CloudEvents envelope, JSON-payload validation against schema, Avro payload decoding on the subscribe path, and processMode async backpressure (#4244, #4266, #4302, #4305, #4309, #4386, and immediate-bulk-subscribe #4364).
  • Kafka pubsub: PausableSubscriber interface and graceful shutdown hardening (#4366), per-message partition support (#4298), bulk-flush ticker reset (#4378).
  • RabbitMQ pubsub: unique consumer tags to prevent subscription disruption on restart (#4326).
  • State stores: SQL Server native batched BulkGet for v2 (#4365), Oracle BulkGet chunking (#4341), MongoDB KeysLiker (#4278), CockroachDB image bump (#4291), RavenDB state store registered in the runtime (dapr/dapr#9654).
  • Bindings: Azure Blob Storage presign operation + bulk operations (#4299, #4295); AWS S3 bulk file transfer (#4292).
  • Conversation API: Anthropic on Microsoft Foundry (#4374), LLM model surfaced on response (#4331), error returned when required tool calls weren’t made (#4277), Ollama endpoint metadata field (#4314).
  • TLS hardening: redis common no longer unconditionally skips TLS cert verification (#4261) — see changes below.

See the full per-repo PR list below for the rest.

SDK Improvements

Go SDK

The marquee feature is workflow history context propagation (#823): a workflow can hand a slice of its execution history to the child workflows and activities it schedules, instead of threading that state through inputs or a state store. Propagation is opt-in per call. A producer passes workflow.WithHistoryPropagation(workflow.PropagateLineage()) (full ancestor chain) or …PropagateOwnHistory() (own events only) to ctx.CallChildWorkflow(...) / ctx.CallActivity(...), and the consumer reads back through a typed API: ctx.GetPropagatedHistory() returns a *workflow.PropagatedHistory, then GetLastWorkflowByName(...).GetLastActivityByName(...) retrieves a completed result by name. A runnable workflow-history-propagation example ships with the SDK.

The Jobs API graduates to stable (#824). ScheduleJob, GetJob, and DeleteJob call the stable RPCs and fall back to alpha against older sidecars, so one SDK build works on both 1.17 and 1.18 with no code change. The *Alpha1 client methods are deprecated and now delegate to the stable ones; the service callback is now OnJobEvent, with OnJobEventAlpha1 kept for older sidecars.

Beyond those two, this release fixes gRPC endpoint parsing when a connection string is supplied without a DNS scheme, and aligns dependencies and security baselines: durabletask-go is bumped to v0.12.1, the runtime protos to v1.18.0-rc.4, and gRPC is updated to address CVE-2026-33186.

Version mapping: Go SDK v1.15 ships with Dapr 1.18.

.NET SDK

Since the v1.17.0 release of the Dapr runtime, the .NET SDK has continued to modularize around individual building blocks, introducing two new clients in their own NuGet packages: Dapr.SecretsManagement and Dapr.StateManagement for secret and state management operations, respectively. Beyond simply yielding smaller, more focused dependencies, splitting these clients out of DaprClient lets each package adopt more modern .NET practices and ship tooling (such as source generators, analyzers and code-fixes) tailored to its building block rather than being constrained by a single monolithic client.

This release also consolidates the Dapr.Workflow package. The separate Dapr.Workflow.Versioning and Dapr.Workflow.Analyzers packages are no longer required - both are now bundled into Dapr.Workflow itself. No refactoring is necessary, but you should remove the now-stale package references pointing to the since-deprecated packages.

Building on the automatic workflow registration introduced in v1.17, registration is now handled for both workflows and activities, meaning neither needs to be registered with dependency injection at startup as the SDK takes care of it for you. There is no need to immediately clear out your existing DI registration block when upgrading to 1.18, as the SDK will gracefully continue to accept manual and duplicate registrations, but as of this release such registration is entirely unnecessary.

Finally, this release ships several new analyzers that validate type consistency between workflow and activity inputs and outputs, surfacing mismatches at build time rather than at runtime.

Python SDK

This release of the Python SDK folds the durabletask-python project into the main SDK, so workflow primitives now ship in a single package with version alignment to the Dapr runtime. The MCP surface is now exposed through a dedicated workflow client, letting workflows orchestrate MCP tool calls without wiring up a separate MCP SDK.

Workflow history context propagation is available on both child workflows and activities, with opt-in scopes for the caller’s own history or the full lineage; consumers retrieve the propagated history through a typed query API. Workflows and activities also accept Pydantic models as inputs, removing the previous need to hand-roll conversions.

This release also addresses several rough edges: the workflow gRPC connection now honors the standard API timeout environment variable, the default 60-second drain timeout has been removed, the maximum inbound gRPC message size is configurable via an environment variable, and workers wait indefinitely for the runtime to be ready instead of failing fast.

Bulk pub/sub is now supported, Python 3.14 is supported (with the last Python 3.9 vestiges removed), and the Jobs API graduates to stable alongside the runtime. The package layout has been simplified — unnecessary dev packages removed and version metadata centralized into a single file.

Java SDK

The most disruptive changes are at the build level. The minimum Java version is now 17 (#1721); Java 11 is no longer supported. The Spring Boot baseline moves from 3.4 to 3.5 (the root springboot.version goes from 3.4.13 to 3.5.12), with Spring Boot 4 supported in parallel so projects on either line are covered. The SDK also now publishes a dapr-sdk-bom artifact (#1722) you can import to keep every Dapr dependency on a single, consistent version.

On the workflow side, the headline is history context propagation (#1739), matching the other SDKs. A producer opts in per call with WorkflowTaskOptions.withHistoryPropagation(scope) (or the propagateLineage() / propagateOwnHistory() shortcuts) on child workflow and activity calls, where scope is a HistoryPropagationScope of LINEAGE or OWN_HISTORY. Consumers read back through WorkflowContext.getPropagatedHistory() and WorkflowActivityContext.getPropagatedHistory(), which return an Optional<PropagatedHistory> with typed lookups (by workflow name, app ID, or instance ID, then per-workflow drill-down to the last activity or child workflow). Workflows also gain a timer origin field (#1733) so external-event waits are visible from outside, and DurableTaskGrpcWorker now shuts down cleanly by breaking out of the gRPC worker loop instead of hanging (#1727).

For service invocation, the new DaprClient.invokeHttpClient(appId) factory (#1742) returns an SDK-native HTTP client preconfigured to call a target app, mirroring .NET’s CreateInvokeHttpClient. It is the recommended successor to the now-deprecated invokeMethod APIs. Streaming subscriptions gain dead-letter topic support (#1746): subscribeToTopic now takes a deadLetterTopic to which failed messages are forwarded. There is also baggage support (#1659) and trace propagation in local observations (#1724).

On the testing side, the SDK migrated from Testcontainers 1.21.4 to 2.0.5 and from JUnit 4 to JUnit 5 (#1736).

JS SDK

This release is mostly about setting the groundwork to catch the SDK up to features recently introduced in other packages. Going forward, package versioning will indefinitely remain at major version 3, the minor version will track the Dapr runtime release and the patch value will reflect any mid-cycle SDK releases that don’t have new runtime dependencies. Thus, as the 1.18 Dapr runtime is being release, this package releases as v3.18.0.

In the prior 3.17.0 release, CommonJS modules were inadvertently discontinued in favor of ESM as a side effect of overhauling the gRPC generators. This module-packaging change has been reverted and we have no plans to deprecate our reliance on CommonJS. Should that ever change, it will be advertised via these release notes well in advance.

The dapr-client package on NPM has been marked as deprecated for a while, but was still receiving updates, but version 3.6.1 will be the last release on that package. All updates going forward will be applied to @dapr/dapr going forward.

Workflow client methods have been renamed for nomenclature consistency with the other SDKs (e.g. “orchestrators” -> “workflows”). This is not a hard break for now. The old names remain as ‘@deprecated’ aliases and will continue to work, with removal scheduled for the release of Dapr 1.20, so you can migrate at your own pace.

Rust SDK

With version v0.19.0 of the Rust SDK significant changes have been made towards general stability and alignment with the other SDKs including the initialisation of the client using EnvVars and also by arguments.

As of this release, Workflows support has been added bringing almost complete support for all the Dapr APIs/Building Blocks. Siginificant changes are expected to follow after more feedback to ensure that the developer experience is improved.

Breaking Changes / Deprecations

This SDK is still in alpha and with each release, there are usually breaking changes. In this release the MSRV (Minimum Supported Rust Version) has been bumped to 1.88 using Edition 2024.

Please migrate to the new client implementation as documented in the examples.

List of issues addressed in this release

Dapr Runtime

  • ADDED Implement actor APIs for gRPC 927
  • RESOLVED add replace to go.mod 8868
  • ADDED Support for Spread Constraints and strict affinity rules in Dapr Control Plane charts to ensure Quorum resilience. 9223
  • RESOLVED Promote Dapr Jobs API to Stable 9257
  • RESOLVED Version Skew: 1.16-1.17 9315
  • RESOLVED Doc: link to security tab 9356
  • FIXED feat: improve output message of ErrActorNoAddress by adding req.ActorKey() 9360
  • ADDED Sentry: Support Per Audience Token SVID 9381
  • RESOLVED Bump actions/checkout from 3 to 6 9418
  • ADDED Support for Kubernetes native sidecar containers 9422
  • RESOLVED Constrain loop event types with scoped sealed interfaces 9423
  • ADDED Sidecar Injector supports Native Sidecars 9450
  • RESOLVED Bump github.com/lestrrat-go/jwx/v2 from 2.0.21 to 2.1.6 9454
  • RESOLVED Feature Gate: WorkflowsRemoteActivityReminder 9456
  • RESOLVED components-contrib: fix redis no key 9476
  • RESOLVED Fix pubsub e2e flake 9478
  • RESOLVED diagridio/go-etcd-cron: v0.12.3 9489
  • RESOLVED Point backport action to a specific commit 9491
  • RESOLVED use latest from contrib 9496
  • ADDED [1.18] Add hard anti-affinity policy option for placement and scheduler 9498
  • RESOLVED fix(ollama): rm old workaround for ollama 9499
  • RESOLVED Cherrypick in 1.17 perf charts 9501
  • RESOLVED [FORWARD_PORT] :secretRef for configuration otel headers (#9399) 9523
  • RESOLVED Add .github/copilot-instructions.md for Copilot coding agent onboarding 9534
  • RESOLVED Integration: Breakup resiliency app tests 9544
  • RESOLVED chore: Use dapr-bot to create backport PRs 9547
  • RESOLVED make pubsub_azure_servicebus_queues stable 9550
  • RESOLVED Integration: basic termination test 9557
  • RESOLVED Update kit & contrib v17 9568
  • REFACTOR Operator: refactor update streams to loops 9570
  • RESOLVED fix(ci): fix gh api command in update-longhauls workflow 9571
  • RESOLVED Bump Go to 1.26.0 and fix golangci-lint modernize/prealloc failures 9573
  • REFACTOR hotreload: simplify disk loader triggers and move reconciler to event loop 9574
  • UPDATED Component hot reloading is now generally available 9577
  • ADDED daprds: Adds SIGHUP handler reloader 9579
  • RESOLVED Integration: build stablecomponents 9580
  • ADDED hotreload: Configuration, HTTPEndpoint, and Resiliency 9582
  • RESOLVED Stalled workflow retention deletion 9588
  • FIXED Unnecessary placement dissemination for daprd hosts with no actor types 9591
  • ADDED Allow wildcards for service account names 9596
  • ADDED Sentry: Use Ed25519 for X.509 certificate key generation 9598
  • RESOLVED Fix flaky TestStartInternalCallbackSpan sampling rate test 9599
  • RESOLVED release notes added Reset bulk subscribe timer 9603
  • CHORE Bump Go to 1.26.1 9608
  • RESOLVED Fix Broken Perf Test Suite 9609
  • FIXED fix: Replace deep proto.Clone with shallow copy in invoke method request/response 9610
  • RESOLVED test: fix flaky retryGRPCProxy test by avoiding codes.Canceled in multi-range scenario 9616
  • FIXED fix: Race condition causes scheduler jobs to fire multiple times during host reconnection 9617
  • FIXED fix: Prevent pub/sub messages from being NACKed during graceful shutdown 9619
  • RESOLVED test: fix flaky actor reminder e2e tests by polling instead of fixed sleep 9620
  • ADDED feat(helm): Add overrideBroadcastHostPort option to scheduler chart 9629
  • FIXED ci: fix excessive GitHub workflow token permissions 9631
  • FIXED Fix actor placement version check 9639
  • RESOLVED Fix version skew tests 9640
  • RESOLVED Release notes for #9606 9646
  • RESOLVED test: fix flaky placement version assertions after batched dissemination 9648
  • ADDED feat(comp): register ravendb state component 9654
  • RESOLVED Add RavenDB state store component to v1.17.2 release notes 9657
  • RESOLVED Integration: Fix workflow test race 9660
  • RESOLVED CoPilot: reduce top level review comment 9663
  • ADDED Added support for timer origins 9665
  • RESOLVED integration: increase timeouts in flaky integration tests 9671
  • RESOLVED Use shared workflows and actions 9683
  • ADDED feat(mcp): add init mcp server resource 9685
  • FIXED Scheduler fix fatal crash on server restart due to duplicate controller registration 9688
  • FIXED Fix placement connection and dissemination churn 9689
  • FIXED Scheduler: fix silent cron exit on quorum change under load 9696
  • RESOLVED Remove redundant version-skew patch for release-1.17 9700
  • ADDED Support glob service accounts 9704
  • RESOLVED Add –amend and –purge flags to docker manifest commands 9705
  • UPDATED Jobs API stable 9706
  • TEST Jobs API stable — perf tests 9711
  • RESOLVED fix cleanup with peerShared for actors tests 9714
  • TEST Add e2e test for scheduler quorum recovery after pod kill 9717
  • RESOLVED [Workflows] Context propagation 9721
  • ADDED [Workflows] Human in the Loop support 9722
  • RESOLVED [Workflows] History signing 9723
  • ADDED MCP Server support for Dapr APIs 9724
  • ADDED [Workflows] Access policy 9725
  • ADDED Migrate DurableTask repos into corresponding SDK repos 9726
  • FIXED Bulk subscribe + sync mode causes high unacked count 9727
  • FIXED dapr workflow list not working with MongoDB actor state store in 1.17 9728
  • ADDED workflow state management improvements (purge, archive) 9730
  • ADDED feat(mcp): add built-in mcp wf orchestration engine for mcpserver crd 9731
  • RESOLVED Cherry pick 9718 9737
  • UPDATED updates based on durabletask proto changes 9739
  • ADDED feat(mcp): add crd clientset for cli mcp cmd 9742
  • FIXED fix(placement): reuse existing hashMap in VirtualNodesCache.setHashes 9753
  • RESOLVED Fix version-skew for cross-app workflow tests 9756
  • RESOLVED fix flaky crossactivity workflow integration test 9757
  • FIXED Tolerate missing CRDs in operator informers 9765
  • RESOLVED CI: retry transient docker push and crane.Copy failures 9766
  • CHORE Go: Update to v1.26.2 9767
  • FIXED Workflow: Fix carry over events for ContinueAsNew 9769
  • FIXED Fix daprd sidecar placement dissemination timeout handling 9770
  • TEST Add tests for retry timers origin field 9771
  • ADDED Workflow: Adds global and per-name concurrency limits 9775
  • ADDED Add workflow history signing for tamper detection 9778
  • ADDED Scheduler: more metrics 9787
  • ADDED Runtime: adds jitter to scheduler & placement re-conns 9788
  • UPDATED Workflow: default WorkflowsRemoteActivityReminder true 9789
  • ADDED Workflows: Adds WorkflowAccessPolicy 9790
  • FIXED fix(pubsub): flush bulk subscribe batches immediately via drain-and-flush 9792
  • DOCS document changes in allowedServiceAccounts 9793
  • RESOLVED Version-Skew: fix 9794
  • ADDED [P1] Add workflow global and per-name concurrency limits 9796
  • RESOLVED Fix ‘sucessful’ typo in scheduler.proto comment 9798
  • RESOLVED Tests: flakes 9799
  • RESOLVED feat: add config map configuration store component 9801
  • SECURITY fix service invocation path traversal ACL bypass 9805
  • RESOLVED Add missing release notes 9806
  • RESOLVED Fix flaky memory check in dapr-standalone-validation 9808
  • RESOLVED Integration: fix more flakes 9809
  • ADDED wf history ctx propagation 9810
  • UPDATED hotreload: enable HotReload by default (GA) 9811
  • ADDED Actors: app-initiated gRPC stream for actor callbacks 9812
  • SECURITY fix: bump golang.org/x/image to v0.39.0 for GO-2026-4962 9815
  • UPDATED Widen liveness and tighten readiness probe defaults 9818
  • RESOLVED Integration: fix flakes for stream dep jobs 9819
  • RESOLVED Fix typo in multiple license headers 9821
  • RESOLVED Integration: Workflow: scheduler disk exhaustion tests 9823
  • FIXED Workflow: terminate tampered in-flight workflows 9825
  • FIXED Bulk subscribe batches messages up to maxMessagesCount or maxAwaitDurationMs, whichever comes first, and restarts the await-duration timer on every flush so leftover messages join the next pending batch with a fresh window. Components that declare pubsub.FeatureBulkSubscribeImmediate (Pulsar) take a flush-on-arrival path so each message is acked as soon as it arrives. 9826
  • ADDED Workflow: child workflow & activity attestation 9831
  • FIXED Workflow: Fix recursive cross-app purge and terminate 9832
  • ADDED placement: post-round coalesce window + stable scheduler reload 9837
  • REMOVED Remove MCPServerResource and WorkflowAccessPolicy feature gates 9838
  • RESOLVED fix: remove availability zone requirement from AKS test clusters 9840
  • FIXED workflow: gracefully stall on oversized payload 9847
  • CHORE go-etcd-cron: update to origin HEAD 9849
  • UPDATED WorkflowAccessPolicy: Extend to all workflow operations 9850
  • RESOLVED Integration: speed up tests 9854
  • UPDATED WorkflowAccessPolicy: pure allow-list with self-call exemption 9870
  • UPDATED Injector/Operator: use RSA keys for webhook serving certs 9873
  • FIXED Workflow: dedup duplicate completion events at the actor inbox 9875
  • FIXED fix(placement): always arm coalesce timer after round to fix dissemination race 9876
  • RESOLVED Integration: fix flaky tests via metadata-API polling and tuning 9877
  • FIXED fix: Proto files must have different java outer classname 9878
  • CHORE Update go-jose & OpenTelemetry 9882
  • ADDED Workflow: cryptographically verify history propagation 9890
  • ADDED Add start time to wf metadata 9898
  • RESOLVED docs: add 1.17.7 release note for RabbitMQ consumer tag fix 9926
  • RESOLVED Integration: stdio helper binary and move helpers. 9932
  • ADDED feat: add initContainers and extraContainers support to control plane Helm charts 9939
  • FIXED MCPServer: correct workflow actor refcount 9940
  • ADDED Add support for sub-second precision in reminders 9946
  • RESOLVED version-skew: Fix against 1.17 9953
  • REFACTOR refactor(mcp): replace hand-defined MCP proto types with upstream go-sdk types 9959
  • RESOLVED scheduler: reconnect on WatchHosts first-Recv error instead of tearing down daprd 9968
  • RESOLVED fix(ci): migrate e2e to westus 9971
  • FIXED Actors: gate Register/UnRegisterHosted on runtime init 9976
  • RESOLVED CI: run macOS tests natively on arm64 9979
  • RESOLVED getLast func names for workflow history propagation 9981
  • RESOLVED chore(ci): update vm sizes 9983
  • RESOLVED chore: Update durabletask-go and components-contrib 9992
  • RESOLVED Fix test flakes 9993
  • RESOLVED fix(ci): use Hyper-V Gen 1-compatible Windows VM size for AKS test pool 9994
  • RESOLVED fix: update Go SSH crypto dependency 9999
  • RESOLVED fix dep review: net 10003
  • RESOLVED docs: list new workflow payload size ratio metrics 10005
  • RESOLVED workflow: save inbox event before creating wake-up reminder 10008
  • RESOLVED tests: stabilize flaky CI tests 10013
  • RESOLVED github.com/dapr/kit: update 0.18.1 10014
  • RESOLVED fix critical vulns: bump durabletask-go to v0.12.1 and bump pgx 10015
  • RESOLVED Workflow: retentioner ignore not completed errors 10019
  • RESOLVED Dependency update: govulncheck 10020
  • RESOLVED fix(mcp): gate /healthz/outbound on mcpserver wf registration 10023
  • RESOLVED Use contrib v1.18.0-rc.1 and bump kit 10024
  • RESOLVED ci(e2e): rename Azure Key Vault resource in workflow 10030
  • RESOLVED ci: pin azure/login to v3 10034
  • RESOLVED feat: register nameformat nameresolution component 10038

Dapr CLI

  • FIXED Using an image registry no longer attempts to reach out over the network. 1575
  • CHORE use dapr v1.17.3 1598
  • CHORE Adds the shared workflows 1603
  • FIXED fix flaky standalone e2e by dropping “Exited App successfully” requirement 1605
  • CHORE chore: Fetch latest version from the image registry and not from github 1615
  • FIXED fix(ci): trigger CLI build after creating release tag 1626
  • FIXED fix: rename with proto changes 1629

Components

  • FIXED Bug in Dapr bulk pubsub with rabbitmq 3663
  • FIXED Trouble Generating SAS Token for Blob Storage 3817
  • UPDATED Oracle state store bulk querying improvements 4041
  • RESOLVED feat(pubsub/azure/servicebus/queues): add certification tests 4150
  • RESOLVED fix(nameresolution.aws.cloudmap): quote numeric example in metadata.yaml 4233
  • RESOLVED Component Metadata Bundle GHA Tweaking 4234
  • CHORE chore: Use dapr-bot to create backport PRs 4237
  • FIXED ci: Workflows running twice on merge to master 4240
  • FIXED fix(configuration): ensure postgresql configuration reads pgNotifyChannel from component spec instead of requiring client code passing it 4241
  • RESOLVED fix: Fix dynamodb state store stable test 4242
  • RESOLVED fix(state/oracledatabase): return per-key errors in BulkGet instead of HTTP 500 4243
  • FIXED fix(pubsub/pulsar): validate JSON messages against Avro schema before publishing 4244
  • ADDED feat: warn when multiple redis stream trim strategies are specified 4252
  • FIXED ci: Allow reruns of failing jobs in master 4260
  • SECURITY fix(common/redis): stop unconditionally skipping TLS certificate verification 4261
  • RESOLVED Update Kafka Sarama Client dependency 4264
  • FIXED fix(pubsub/pulsar): decode Avro binary payload on subscribe path 4266
  • FIXED fix(conversation): nil pointer dereference in langchaingokit LLM logger 4268
  • ADDED feat(config): add config map as configuration 4275
  • ADDED Connection pooling support for the Oracle state store component. 4276
  • FIXED return err if tool calls were not called when required 4277
  • FIXED Fix MongoDB state store to implement KeysLiker 4278
  • RESOLVED test(cassandra): fix port collision in certification tests 4284
  • CHORE fix(state/cockroachdb): update image from v21.2.3 to v23.2.29 4291
  • ADDED Bulk file transfer operations to AWS S3 binding 4292
  • ADDED Azure Blob Storage binding: add bulk operations 4295
  • ADDED pubsub/kafka: per message partition support 4298
  • ADDED bindings/azure/blobstorage: Adds presign 4299
  • ADDED feat(pubsub/pulsar): register CloudEvents envelope Avro schema with Pulsar Schema Registry 4302
  • FIXED fix(pubsub/pulsar): validate JSON schema payloads against schema definition using goavro codec 4305
  • ADDED fix(pubsub/pulsar): read processMode from component metadata and add async backpressure 4309
  • ADDED fwd port: ollama: add missing endpoint metadata field to spec (#4287) 4314
  • CHORE Use shared workflows 4315
  • FIXED fix(pubsub/rabbitmq): use unique consumer tags to prevent subscription disruption on restart 4326
  • RESOLVED [1.18] zeebe oauth support 4330
  • ADDED Expose LLM model on converse response 4331
  • FIXED fix(ci): create GitHub release with metadata bundle in create-release workflow 4333
  • UPDATED [1.18] Azure appconfig - include contentType and label in metadata 4338
  • ADDED feat(state/oracledatabase): add BulkGet chunking to avoid Oracle IN-list limit 4341
  • ADDED feat(state/oracledatabase): add BulkGet chunking to avoid Oracle IN-list limit 4351
  • ADDED Adds immediate bulk subscriptions to the Pulsar pubsub component 4364
  • ADDED feat(state/sqlserver): native batched BulkGet for v2 4365
  • ADDED feat(pubsub/kafka): add PausableSubscriber + harden graceful shutdown 4366
  • CHORE bump to go1.26 4372
  • RESOLVED chore: bump sarama to 1.48.0 4373
  • UPDATED Enable anthropic in microsoft foundry 4374
  • FIXED fix(pubsub/kafka): reset await ticker after count-based bulk flush 4378
  • RESOLVED fix(ci): update artifact transformations 4381
  • FIXED fix(tests): scope influxdb to v2.9 4382
  • ADDED listenerName metadata field to Pulsar pubsub component for advertisedListeners support. 4386
  • RESOLVED CI: fix tests 4389
  • RESOLVED version bumps: kit/dapr/go-sdk 4391

.NET SDK

General

  • ADDED Dapr.SecretsManagement package #1794 to split secret management into its own client
  • ADDED Dapr.StateManagement package #1806 to split state management into its own client
  • ADDED Rich backwards-compatibility support added to the SDK to better support runtime API maturation lifecycles #1816
  • ADDED Serializer refactored from Dapr.Workflow to Dapr.Common #1805 as a precursor to having common serialization across .NET SDK
  • ADDED Add optional parameter to configuration providers for non-blocking startup #1844
  • UPDATED Making DaprDefaults public #1845
  • FIXED Prevent race condition during GrpcProtocolHandler disposal #1798

Actors

  • ADDED UnloadStateAsync implementation #1750 to force actors to unload their currently cached in-memory state (no impact to persisted state). The next time GetStateAsync is called, the cache is repopulated as normal.

PubSub

  • FIXED Subscriber resilience: SubscribeAsync now throws DaprException when the sidecar is unavailable instead of failing silently #1803

Metadata

  • ADDED Added new Dapr.Metadata package for retrieving strongly typed data from the Dapr Metadata API #1846. To use, add Dapr.Metadata package from NuGet, register in DI with builder.Services.AddDaprMetadata() and simply inject IOptions<DaprMetadata>, IOptionsSnapshot<DaprMetadata> or IOptionsMonitor<DaprMetadata> and read the values out of the injected value.

Service Invocation

  • UPDATED InvokeMethodAsync family marked [Obsolete] aligning SDK with prior runtime guidance — recommended guidance is to use a native HTTP/gRPC client for service invocation #1698.

Jobs

  • UPDATED Jobs API marked stable #1804.
  • UPDATED Minimum-version tags adjusted to reflect broader test coverage (#1811).

Workflows

  • ADDED Workflow history context propagation (#1802)
  • UPDATED Combined Dapr.Workflow meta-project (#1822) and automatic workflow/activity registration (#1823) This means that there is no longer a need to install Dapr.Workflow.Versioning or Dapr.Workflow.Analyzers separately. All are bundled in the one Dapr.Workflow package, no refactoring necessary (though you might want to remove the stale packages).
  • UPDATED No longer logging connection closed exception when app closes #1841
  • UPDATED Use server-blocking WaitForInstance* RPCs instead of client polling #1843
  • ADDED Timer origins and backwards-compatible optional timers (#1790)
  • ADDED Add workflow analyzer diagnostics on versioning (#1815
  • ADDED Expose name on workflow state #1836
  • ADDED Support history propagation API #1825, #1833
  • FIXED Workflow patch ordering #1807, #1809
  • FIXED Trace propagation fix for downstream calls from workflow user activities #1808
  • FIXED Addressing “no such instance exists” errors #1818, #1812
  • FIXED Fix workflow trace correlation #1829
  • FIXED add missing FailureDetails property to proto converter #1831

Miscellaneous/Testing

  • ADDED Integration test project for Actors.Generators #1791.
  • ADDED Adding gRPC probe with HTTP/2 preface to eliminate some transient Unavailable errors during integration testing via Testcontainers #1821
  • UPDATED Stabilization of flaky integration tests #1813.
  • UPDATED CI script more accurately auto-detects valid Dapr runtime versions to support automatic N-2 validation #1810
  • REMOVED Removing deprecated analyzers/codefixes #1834

Java SDK

  • ADDED Add baggage support 1659
  • TEST chore: Add test to verify workflow reconnection logic 1692
  • UPDATED Use Java source code 17 for Dapr Java SDK 1.18 1694
  • UPDATED Use latest protobuf 1698
  • ADDED Publish a dapr-sdk-bom artifact 1720
  • CHORE chore: bump minimum Java version from 11 to 17 1721
  • ADDED feat: publish dapr-sdk-bom artifact for transitive dependency management 1722
  • ADDED Adding trace propagation to local observations 1724
  • FIXED fix(durabletask): detect shutdown and break gRPC worker loop 1727
  • ADDED Implement timer origin 1729
  • ADDED feat(durabletask): implement timer origin and backwards-compatible optional timers 1733
  • UPDATED feat: upgrade Testcontainers from 1.21.4 to 2.0.5 and migrate JUnit 4 to JUnit 5 1736
  • RESOLVED Add support for workflow history propagation 1737
  • ADDED feat: download attestation.proto and use Runtime 1.18.0-rc.3 1738
  • RESOLVED [Phase 1] Fix Flaky Integration Tests + Migrate some tests to Test Containers 1741
  • ADDED feat: add DaprClient.invokeHttpClient(appId) factory 1742
  • ADDED DaprClient.invokeHttpClient(appId) factory — an SDK-native HTTP client preconfigured for service invocation, mirroring .NET’s CreateInvokeHttpClient and serving as the successor to the deprecated invokeMethod APIs. 1743
  • FIXED fix(release): install dapr-sdk-bom locally before bumping dapr-spring-bom 1744
  • ADDED Add support for dead-letter topics in streaming subscriptions 1746
  • RESOLVED fix: reset gRPC channel backoff between worker reconnect attempts 1757

Python SDK

General

  • REFACTOR durabletask-python merged into the SDK #963
  • ADDED Python 3.14 support and removal of remaining Python 3.9 vestiges #916
  • UPDATED Centralize versions into a single file and remove development builds #1020
  • UPDATED No 60s timeout by default #956; default drain_ongoing_call_timeout to None #1016
  • ADDED Configurable max inbound message size via DAPR_GRPC_MAX_INBOUND_MESSAGE_SIZE_BYTES #1024
  • ADDED Add aio module and update mypy configuration to include aio files #942
  • UPDATED Use single v* tags to release #970

Workflows

  • ADDED Workflow history context propagation #1025; align history propagation API with go-sdk #1047
  • ADDED Populate timer origin field #976
  • ADDED Pydantic model support on workflow and activity inputs #982
  • FIXED when-all error handling #978
  • FIXED Apply DAPR_API_TIMEOUT_SECONDS to workflow gRPC connections #954
  • UPDATED Worker waits indefinitely for start #983
  • FIXED Align workflow multi-app naming convention #932
  • REMOVED Deprecated workflow operations #943

MCP

  • ADDED Dapr MCP client #997
  • FIXED Retry connect calls on transient gRPC errors #1062

Pub/Sub

  • ADDED Bulk pub/sub support #915

Jobs

  • UPDATED Jobs API marked stable #1060

Miscellaneous/Testing

  • ADDED Integration tests on DaprClient responses #981
  • REFACTOR Remove Mechanical Markdown from examples validation #977
  • FIXED Fix CI build #979

JavaScript SDK

General

  • UPDATED docs(actors): add JSDoc for actor runtime models and state metadata 815
  • UPDATED Comprehensive JSDoc Annotations Added to All Public Interfaces 816
  • UPDATED docs(jsdoc): annotate exported type definitions 817
  • UPDATED docs(jsdoc): annotate client and server implementations 818
  • REMOVED Removing dapr-client from published builds 773
  • FIXED fix: correct types path in published package 806
  • UPDATED Update buf configuration to emit CommonJS modules instead of ESM 826

Workflow

  • UPDATED Renaming workflow methods for consistency with other SDKs 783

Documentation

  • RESOLVED Docs: only one Redis stream trimming strategy supported 5061
  • RESOLVED Updates resiliency of streaming HTTP Service Invocation 5068
  • RESOLVED docs(agents): update with v1.0 rcs out 5071
  • RESOLVED workflow: retention policy is not retroactive 5074
  • RESOLVED Workflow: wf purge --all-older-than --all-filter-status 5075
  • RESOLVED docs(pulsar): add CloudEvents schema wrapping, rawschema option, and processMode improvements 5084
  • RESOLVED chore: update Azure Static Web App base hostname to new account 5095
  • RESOLVED chore: fix Azure Static Web App staging URL region suffix 5096
  • RESOLVED chore: update Azure Static Web App to new instance 5097
  • RESOLVED revert: restore original Azure Static Web App configuration 5098
  • RESOLVED Fix duplicate archived_version key in hugo.yaml 5101
  • RESOLVED Documented allowedServiceAccounts 5105
  • RESOLVED Add OAuth configuration fields to Zeebe command and JobWorker binding 5106
  • RESOLVED docs(agents): add MistralChatClient to supported LLMs 5108
  • DOCS [1.18] Add docs for global and per-name workflow concurrency limits 5109
  • RESOLVED [1.18] WorkflowAccessPolicy 5114
  • RESOLVED 1.18 Add response metadata section for Azure App Configuration 5118
  • RESOLVED fix: correct broken ref shortcode link in 5126
  • RESOLVED Update filename numbering to match quickstarts/ on dapr-agents 5143
  • RESOLVED Revert “Documentation for native-sidecar (#5041)” 5146
  • RESOLVED Add Reo.dev and cookie banner 5147
  • RESOLVED docs(agents): document replay-aware logging for DurableAgent 5149
  • RESOLVED docs(outbox): document outboxInternalTopic metadata field 5155
  • RESOLVED fix gcp storage bucket binding docs 5157
  • RESOLVED Improve ASP.NET Core docs and reference NuGet library 5164
  • RESOLVED docs: Sentry Ed25519 workload identity keys 5181
  • RESOLVED docs: Clarify max-body-size applies to requests and responses 5186

Upgrading to Dapr 1.18

To upgrade to this release of Dapr, follow the steps below to ensure a smooth upgrade.

Local Machine / Self-hosted

Uninstall Dapr using the CLI you currently have installed. Note that this will remove the default $HOME/.dapr directory, binaries and all containers dapr_redis, dapr_placement and dapr_zipkin. Linux users need to run sudo if docker command needs sudo:

dapr uninstall --all

Download the latest release from here and put the dapr binary in your PATH.

Once you have installed the CLI, run:

dapr init --runtime-version=1.18

Wait for the update to finish, then ensure you are using the latest version of Dapr (1.18) with:

$ dapr --version

CLI version: 1.18
Runtime version: 1.18

Kubernetes

Upgrading from previous version

You can perform zero-downtime upgrades using both Helm 3 and the Dapr CLI.

Upgrade using the CLI

Download the latest release from here and put the dapr binary in your PATH.

To upgrade Dapr, run:

dapr upgrade --runtime-version 1.18 -k

To upgrade with high availability mode:

dapr upgrade --runtime-version 1.18 --enable-ha=true -k

Wait until the operation is finished and check your status with dapr status -k.

Note: Make sure your deployments are restarted to pick the latest version of the Dapr sidecar.

Upgrade using Helm

To upgrade Dapr using Helm, run:

helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update

helm upgrade dapr dapr/dapr --version 1.18 --namespace=dapr-system --wait

Wait until the operation is finished and check your status with dapr status -k.

Note: Make sure your deployments are restarted to pick the latest version of the Dapr sidecar.

Starting a fresh install on a cluster

See how to deploy Dapr on a Kubernetes cluster for a complete guide to installing Dapr on Kubernetes.

You can use Helm 3 to install Dapr:

helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update

kubectl create namespace dapr-system

helm install dapr dapr/dapr --version 1.18 --namespace dapr-system --wait

Alternatively, you can use the latest version of CLI:

dapr init --runtime-version=1.18 -k
Post Installation

Verify the control plane pods are running and are healthy:

$ dapr status -k
  NAME                   NAMESPACE    HEALTHY  STATUS   REPLICAS  VERSION  AGE  CREATED
  dapr-sidecar-injector  dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-sentry            dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-operator          dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-placement         dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39
  dapr-scheduler         dapr-system  True     Running  1         1.18   15s  2026-05-26 13:07.39

After Dapr 1.18 has been installed, perform a rolling restart for your deployments to pick up the new version of the sidecar:

kubectl rollout restart deploy/<deployment-name>

Downgrading to Earlier Versions

[!warning] Do not roll back from 1.18 directly to 1.17.6 or earlier.

Dapr 1.18 introduces Ed25519 workload identity keys, and Sentry persists the Ed25519-keyed CA into the dapr-trust-bundle secret. Versions of Sentry before 1.17.7 cannot parse this bundle and will crash on startup with:

fatal: error creating CA: failed to get CA bundle:
failed to verify CA bundle: unsupported key type ed25519.PrivateKey

When Sentry is down, no new workload certificates can be issued; existing sidecars with unexpired certificates keep working, but any sidecar restart or certificate expiry will fail to obtain a new identity.

Compatibility matrix

From To Result
1.18 1.17.7+ ✅ Safe. 1.17.7 backports the Ed25519 PEM-decoder fix (dapr/dapr#9904) so Sentry can read the 1.18 trust bundle as-is.
1.18 1.17.6 or earlier ❌ Sentry crash-loops at startup. Do not attempt this rollback.
1.17.6 or earlier 1.18 ✅ Safe. 1.18 Sentry accepts CSRs of any algorithm; existing ECDSA P-256 bundles are read transparently.

Safe rollback path

If you must downgrade below 1.17.7, go through 1.17.7 first:

  1. Roll the control plane back to 1.17.7 (which includes the Ed25519 parsing fix and is the earliest version that can read a 1.18-issued trust bundle).
  2. Allow Sentry to stabilise and confirm dapr status -k is healthy.
  3. From 1.17.7, downgrade to your target version. Note that you may want to first rotate the CA back to an algorithm the target version generates natively — see your Sentry CA rotation runbook.

Rolling back the control plane

Use Helm rollback (preferred) or re-install at the target version:

# Helm: list revisions, then roll back to the desired one
helm history dapr -n dapr-system
helm rollback dapr <REVISION> -n dapr-system --wait

# Or pin a specific version
helm upgrade dapr dapr/dapr --version 1.17.7 --namespace dapr-system --wait

After the control plane is back, perform a rolling restart of your application Deployments so sidecars pick up the older injector image and re-issue their identities against the rolled-back Sentry.

What does NOT need to be rotated

Going 1.18 → 1.17.7 does not require manual CA rotation. The Ed25519-keyed bundle remains valid; 1.17.7 reads it, continues to issue new CSRs against the existing trust anchor, and ECDSA/RSA CSRs from 1.17.x sidecars are signed normally. Only re-rotate the CA if your downgrade target is below 1.17.7 or if your security posture requires it.

Breaking Changes

[!warning] Review carefully before upgrading

  • WorkflowsRemoteActivityReminder default-on. Cross-app workflow activity results are now delivered via Scheduler reminders by default. See dapr/docs#5128 and dapr/dapr#9789.
  • HotReload default-on. Components, Subscriptions, MCPServers, Configurations, HTTPEndpoints, Resiliencies, and WorkflowAccessPolicies are hot-reloaded by default. To restore the pre-1.18 behavior, disable the HotReload feature in the Dapr Configuration (spec.features with enabled: false). See dapr/dapr#9811.
  • Sidecar probe defaults changed. Liveness is more lenient (~230 s before kubelet restart); readiness is tighter (~3 s control-plane / ~5 s daprd). Custom Helm overrides may need re-tuning. See dapr/dapr#9818.
  • Workflow ID reuse semantics changed. The pre-1.18 workflow ID reuse policy has been removed; creating a workflow with an instance ID that already has an active instance now fails with a conflict error (an active workflow with ID '<id>' already exists) instead of silently overwriting or ignoring it. Callers that previously relied on the silent-overwrite or ignore behavior must adapt. See dapr/docs#5102.
  • Hop-by-hop headers stripped on service invocation. Standard hop-by-hop HTTP headers (Connection, Keep-Alive, Proxy-Authenticate, Transfer-Encoding, etc.) are now stripped during service invocation, per RFC 7230. Apps relying on these passing through must move to non-hop-by-hop equivalents. See dapr/docs#5172 and dapr/dapr#9759.
  • JS SDK: dapr-client removed. The standalone dapr-client npm package is no longer published. Consumers must move to the unified @dapr/dapr package. See dapr/js-sdk#773.
  • Java SDK: minimum Java version is now 17. The Dapr Java SDK no longer supports Java 11. See dapr/java-sdk#1721 and tracking issue #1694.
  • Rollback floor is 1.17.7. Dapr 1.18 writes an Ed25519-keyed CA into the trust bundle. Sentry versions before 1.17.7 cannot parse this bundle and will crash on startup. Operators downgrading from 1.18 must go through 1.17.7 (or later 1.17.x) before any further rollback. See the Downgrading to Earlier Versions section and dapr/dapr#9598 / #9904.

Deprecation Notices

  • Workflows: Workflow instance ID reuse policy removed. The IGNORE and TERMINATE actions on instance ID conflicts are no longer supported; creating a workflow whose instance ID belongs to a running instance always fails with a conflict error. An instance ID whose workflow has reached a terminal state (completed, failed, or terminated) remains reusable; as of 1.18.2 this additionally requires every child workflow of the previous execution, checked recursively, to also be terminal. To free up an instance ID unconditionally, purge the existing workflow via the purge API or configure a workflow retention policy. [dapr/dapr#9739]
  • Java SDK: Spring Boot 3.4 and 3.5 deprecated. See dapr/java-sdk#1718.
  • Java SDK: invokeMethod APIs (deprecated). Use the new DaprClient.invokeHttpClient(appId) factory introduced in this release. See dapr/java-sdk#1743.
  • .NET SDK: service-invocation InvokeMethodAsync family marked [Obsolete]. Recommended guidance is to use a native HTTP or gRPC client for service invocation. See dapr/dotnet-sdk#1698.
  • JS SDK: workflow methods renamed. get / start / raise are renamed to getWorkflowState / scheduleNewWorkflow / raiseEvent for consistency with the other SDKs. The old names remain as deprecated aliases and continue to work, with removal scheduled for Dapr 1.20. See dapr/js-sdk#783.
  • Dapr Dashboard deprecated repository archived. The dapr/dashboard repo has been archived and is no longer maintained as it had drifted well behind daprd and the maintainers chose to wind it down rather than ship a stale UI. For a maintained alternative, see the Diagrid Dev Dashboard; otherwise use kubectl, the dapr CLI subcommands, or your observability stack (Grafana/Prometheus) to inspect Dapr state.

下载链接