Dapr v1.12 is now available
We’re happy to announce the release of Dapr 1.12.0! π π π
We would like to extend our 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.
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. See this section on upgrading Dapr to version 1.12.
Acknowledgements
Thanks to everyone who made this release possible!
@aaguilartablada, @AaronCrawfis, @AdamKorcz, @addjuarez, @akkie, @alexandreliberato, @alicejgibbons, @AnnuCode, @antontroshin, @artiom, @arturotrenard, @artursouza, @Azhovan, @batazor, @bderusha, @berndverst, @brendandburns, @cgillum, @ChaosInTheCRD, @chncaption, @cicoyle, @cisionmarkwalls, @cmoulliard, @cneijenhuis, @codefromthecrypt, @CrazyHZM, @DeepanshuA, @dnwe, @doe-base, @dollysah, @ejba, @elena-kolevska, @emctl, @evacchi, @fabistb, @fabrizziocht, @famarting, @fcabrera23, @FerencoVonMatterhorn, @filintod, @Gcaya, @guergabo, @halspang, @hdget, @helpta, @hhunter-ms, @hughxia, @hunter007, @ItalyPaleAle, @Jack97, @jackycsl, @jaeheonji, @Jhoysbou, @jjkcharles, @JoshVanL, @kendallroden, @kovalromank, @kruthika04, @Kuzbekov, @LaurenceLiZhixin, @letmerecall, @lburgazzoli, @macromania, @marcduiker, @MaxSchaefer, @mikeee, @mohitpalsingh, @MregXN, @msfussell, @mukundansundar, @mustaFAB53, @niakamk, @nyemade-uversky, @onionhammer, @paskozdilar, @paulyuk, @phillipleblanc, @pravinpushkar, @rabollin, @rickKoch, @robert-oh, @robertojrojas, @ross-p-smith, @RyanLettieri, @sagarlohani, @sakibian, @salmankhan-prs, @sclarke81, @shivam-51, @shivamkm07, @shruthiragu, @shubham1172, @sicoyle, @skyao, @srilasya02, @srparupu, @Taction, @thomasklinger1234, @Timtech4u, @tjsiron, @tmacam, @tomsft, @VazeeKevin, @vicancy, @vlardn, @WhitWaldo, @wimvc1, @XavierGeerinck, @xiangpingjiang, @yannart, @yaron2, @yash-nisar, @zhangcheng
Highlights
These are the v1.12 release highlights:
APIs
Service Invocation: HTTP streaming stable and enabled by default
The HTTP service invocation API now leverages streaming by default and is stable in the v1.12 release. This increases the overall performance of HTTP service invocation in many scenarios. Users that leverage HTTP service invocation will notice improvements such as: reduced memory usage, much smaller time-to-first-byte (TTFB), and can now send messages in chunks.
Service Invocation: TLS for non-Dapr endpoints
You can now securely call https://
non-Dapr endpoints providing a certificate for authentication to the remote endpoint
State Management: Outbox Pattern for state stores (preview feature)
The outbox pattern enables a single transaction across a state store and any message broker and is a powerful design pattern for sending notifications regarding changes in an applicationβs state.
In this v1.12 release, the outbox pattern is enabled as a preview feature for any transactional state store.
Dapr Workflow in beta, with Java support
The workflow runtime and APIs have been moved to beta status indicating the next stage of maturity towards stable. The beta APIs are the preferred choice when calling the Workflow APIs directly. [Note: the alpha APIs remain functional to prevent breaking changes]
Additionally, Java SDK is now supported for authoring Workflows, which you can try through the Java workflow quickstarts.
Metadata API improvements
The metadata API on the Dapr sidecar now includes information on the app connection details including the app port, protocol, host, max concurrency, along with health check details as seen from the Dapr sidecar.
Improvement to Dapr actors and Placement APIs
In this v1.12 release we continued to make improvements to Dapr actors, including bug fixes and performance improvements to Actor Reminders.
Some notable changes include:
- A new placement API on the Placement service enables you to examine the placement tables to determine which types of actors are deployed and where they are active. This gives you more insight to actors at runtime and aids in debugging actor issues.
- API calls to Actor (and Workflow) endpoints now block while the Dapr actor runtime is being initialized, so applications don’t need to guess anymore when the actor runtime is ready after Dapr has started.
- We have made improvements to the performance of Actor Reminders, reducing the need to perform multiple re-evaluations when more than one Dapr sidecar goes online and/or offline at the same time, and better handling locking to prevent race conditions.
- We have fixed a bug that could cause an actor to be activated on two apps at the same time if a reminder is being executed during a rebalancing.
CLI
- To make setting up a development environment on Kubernetes easier, the
dapr init -k
command now supports a--dev
option which deploy Redis and Zipkin containers to Kubernetes identical to the self-hosted mode. Simply set the Kubernetes cluster configuration context! Give this is try on your locally kubernetes cluster! - You can now pass multiple resource paths when running applications. For example
dapr run --app-id myapp --resources-path path1 --resources-path path2
. For example you can have a shared folder for components used across many application and a per application specific folder. This applies to any of the Dapr resources.
Multi App run
- Multi-App run enables you to run several applications locally to test them together. Windows is now supported along with Linux and Mac.
- Multi-App run for Kubernetes now makes it easy to launch and run multiple apps with container images at the same time on Kubernetes. Try this out with the hello kubernetes tutorial which saves having to launch multiple command windows to test multiple apps together.
Components
- All bindings now support an optional bindings direction either input vs output. Using a binding direction means that Dapr does not need to query the application for binding information. See binding quickstart for some examples.
- State store API now returns TTL as part of the response metadata, allowing applications to make caching decisions based on the remaining time. 2987
New components
There are over 115+ components in Dapr. One more component has been added in this release:
Pluggable components: Secret stores now supported
- Secret stores are now supported as a pluggable component type (preview feature). You can try out a secret store.NET sample and read more about secret store pluggable components. Note that as of this release v1.12 runtime release, the .NET and Go SDKs need to be updated to support pluggable secret stores. This will occur in the v1.13 milestone.
Component stabilization
The following components have been promoted to stable status:
- Pub/sub: Azure Service Bus Queues
- Binding: Zeebe command
- Binding: Zeebe jobworker
- In-memory pub/sub and In-memory state store components
Component improvements
The following components have had additional capabilities added:
- Bindings:
- Dynamic template support to Twilio Sendgrid binding
- PostgreSQL and MySQL bindings now support parameterized queries, to prevent SQL Injection attacks
- Support for wasi-http in the Wasm binding
- State stores:
- All transactional state stores now return the TTL when retrieving metadata.
- etcd state store now at v2
- Pub/sub:
- RabbitMQ can now be configured to create quorum queues. In addition the queue name can be set via subscription metadata.
- Name resolvers:
- You can now provide configuration for the DNS name resolution for Kubernetes
- PostgreSQL components:
- All PostgreSQL components (binding, configuration store, state store) now support authentication with Azure AD
- WASM components:
- WASM components now support “strict mode”, which offers additional protection against side-channel attacks when running untrusted code
v1.11 Preview Features now stable
- The HTTP service invocation API now leverages streaming by default. This increases the overall performance of HTTP service invocation in many scenarios.
- Custom middleware processing pipelines defined by chaining a series of middle components is now stable.
SDK Improvements
Java SDK
- New Dapr Workflow implementation in SDK 839
- Added support for Per Actor Type Configuration 729
- Added support for distributed lock API 747
- Added support for DLQ (dead letter queue) 777
- Added environment variables to connect to remote Dapr APIs 876
- Added retry and timeout policy support for gRPC client. 889
JavaScript SDK
- Added support for
DAPR_HTTP_ENDPOINT
and/orDAPR_GRPC_ENDPOINT
502 - Added
DAPR_API_TOKEN
to gRPC client 520 - Added support for wildcard topics (+, #) in PubSub 529
Go SDK
- Added support for Dapr sidecar Metadata API 290
Quickstarts Improvements
- All quickstarts now support multi-app run. All you need to do to run each quickstart is
dapr run -f dapr.yaml
Next Steps
If you’re new to Dapr, visit the getting started page and familiarize yourself with Dapr.
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. See this section on upgrading Dapr to version 1.12.0.
New in this release
Dapr Runtime
- ADDED Outbox pattern for transactional state stores 4233 6755
- ADDED Streaming for HTTP service invocation 6571
- UPDATED Sentry now authenticates clients before signing certificates 6171
- UPDATED Workflow API now as Beta API 6640
- ADDED Direction for bindings in component metadata 6449 6608
- ADDED Inject
APP_PROTOCOL
env in app containers 6512 - ADDED Allow configuring HA mode for Placement separately from
global.ha.enabled
in Helm Chart 6518 - ADDED Support for multiple
--config
flags for daprd in standalone mode 6091 - ADDED API to retrieve placement table from placement service 6033 6732
- ADDED Service Invocation metrics when using proto-based Dapr’s gRPC proxying 6459
- ADDED In standalone mode, filter declarative subscriptions by namespace if set 6494
- ADDED New Actor heartbeat metric
dapr_placement_actor_heartbeat_timestamp
6534 - ADDED Metadata API now includes app channel details (including app port), Dapr runtime version, and enabled features 6453 6537 6524
- ADDED HTTP/2 Cleartext support in Dapr HTTP Server 6570 6601
- PUBLISHED Dapr operators at operatorhub.io 1079
- UPDATED Reduce metrics cardinality for workflows HTTP API 6903
- ADDED Including “dapr-app-id” header in calls to
/dapr/config
6583 - ADDED TLS authentication to HTTPEndpoint resources 6657 6690
- ADDED Protected topics to pub/sub 6714
- ADDED ImagePullSecrets in Helm chart supports a list 6773
- ADDED Support for annotations in Helm chart 6802
- FIXED App Health Checks: log failed probes when using gRPC 6772
- FIXED Multiple in actor reminders, including addressing memory leaks and preventing race conditions during evaluations 6503 6523 6741
- FIXED Disallow operations on reminders for actor types that are not currently being hosted 6493 6150
- FIXED Race conditions in Configuration gRPC APIs 6558 6769
- FIXED Configuration gRPC API: anti-pattern behavior can lead to leaks 6560
- FIXED API logging format in control plane services 6693 6694
- FIXED Prevent actor double activation on different hosts when a reminder is being executed during a rebalancing 6968
- FIXED Preserve TypeURL property in gRPC-to-gRPC service invocation 7014
- FIXED Using
dapr.io/unix-domain-socket-path
annotation causes deployments to fail 6705 - FIXED Connection leak with app channel 6734 6774
- FIXED PubSub’s CloudEvent trace fields can’t be customized when using custom CloudEvent 6800 components-contrib#3080
- FIXED Improve daprd shutdown sequence to be more “graceful” 2478
- FIXED Control plane services now run with ‘readOnlyRootFileSystem’ 6940
- FIXED Actors and Workflow APIs now block while the actor runtime is being initialized 6972
Dapr CLI
- FIXED Create dapr install directory before copy 1111
- ADDED Support for Windows for dapr multi-app run 1220
- ADDED Windows support for
dapr stop -f
1221 - FIXED
dapr list
display the paths to the application and daprd logs in multi-app run 1228 - FIXED Fixed checks for container runtime installation 1300
- ADDED Add APP_PROTOCOL env var for app 1318
- FIXED Fix for Quote in username errors dapr init #972 1322
- ADDED Add health and metrics port mapping for placement stand-alone mode 1323
- ADDED Extend Multi-app run for Kubernetes in dev/test environment 1324
Components
- Bindings:
- Azure OpenAI:
- Azure SignalR:
- Added client negotiate support 3073
- Azure Storage Queues:
- HTTP:
- Kafka:
- Added metadata option
oauthbearer.extensions
3008
- Added metadata option
- Kubernetes:
- Local storage:
- Disable access to some more system folders for security reasons 2947
- MySQL:
- Added support for parametrized queries 2973
- PostgreSQL:
- RabbitMQ:
- Twilio Sendgrid:
- WASM:
- Zeebe:
- Configuration stores:
- Azure App Configuration:
- PostgreSQL:
- Crypto providers:
- Kubernetes:
- [Breaking change] Path to kubeconfig file is now passed as metadata option and not as CLI flag 2992 [3060](https://github.com/dapr/components-contrib/pull/3060
- Kubernetes:
- Middlewares:
- Name resolvers:
- PubSub:
- Secret stores:
- Kubernetes:
- [Breaking change] Path to kubeconfig file is now passed as metadata option and not as CLI flag 2992 [3060](https://github.com/dapr/components-contrib/pull/3060
- Kubernetes:
- State stores:
- Etcd:
- Published version “v2” of the component which includes some non-backwards compatible fixes to better support TTLs 2932
- PostgreSQL:
- When retrieving state from a state store that supports TTLs, the additional metadata property
ttlExpiryTime
is returned for these state stores:- AWS DynamoDB 2899 2857
- Azure Cosmos DB 2898 2857
- Cassandra 2889 2857
- CockroachDB 2864 2857
- Etcd (v2) 2932 2857
- In-memory 2870 2857
- Microsoft SQL Server 2896 [2857](https://github.com/dapr/components-contrib/issues/2857
- MongoDB 2888 [2857](https://github.com/dapr/components-contrib/issues/2857
- MySQL 2871 [2857](https://github.com/dapr/components-contrib/issues/2857
- Oracle Database 2897 [2857](https://github.com/dapr/components-contrib/issues/2857
- PostgreSQL 2864 2857
- SQLite 2869 2857
- Etcd:
Dashboard
- ADDED dapr app port annotation in instances API 150
- FIXED StatefulSet applications not showing on Dapr Dashboard 249
.NET SDK
- FIXED Fix HTTP examples in Workflow Console App 1107
- FIXED Fix Workflow ignoring external event payload 1119
- UPDATED Bump library version for Grpc.Net.Client 1126
- ADDED Support for
DAPR_HTTP_ENDPOINT
andDAPR_GRPC_ENDPOINT
environment variables 1124 - ADDED Support for
OnActorMethodFailedAsync
method to simplify actor error logging 1014 - UPDATED Drop support for NET3.1 and standardize on NET6 1045
- ADDED Support for JSON Serialization in proxied actors 1073
- ADDED Workflow support for API Tokens 1141
- FIXED Fix Healthz requests to include the API Token if present 1145
Go SDK
- ADDED Support for Dapr sidecar Metadata API 290
- FIXED Serialization error - Actor codec is ignored by client 317
- UPDATED Update Readme.md to include installtion guide 433
- FIXED configuration example does not work out of the box 447
- ADDED Log SDK version as gRPC user agent 421
Java SDK
- ADDED Support for Per Actor Type Configuration 729
- ADDED Support for distributed lock API 747
- ADDED Support for DLQ (dead letter queue) 777
- ADDED Workflow implementation in SDK 839
- ADDED Environment variables to talk to remote Dapr APIs 876
- ADDED Retry and timeout policy support for gRPC client. 889
Python SDK
- ADDED Support for TLS and external Dapr endpoints via
DAPR_HTTP_ENDPOINT
andDAPR_GRPC_ENDPOINT
environment variables 577 - REMOVED Support for Python 3.7 which end of life and no longer receives security updates.
- CHANGED Workflow Management now uses Beta API endpoints 605
Python Workflow Alpha SDK (dapr-ext-workflow
)
- ADDED Support for the Dapr API token 598
- FIXED Miscellaneous minor fixes, including support for activities without input parameters.
- ADDED Docs: Additional forkflow examples 575
JavaScript SDK
- ADDED Examples and documentation for subscribing to configuration stores 465
- ADDED Support for
DAPR_HTTP_ENDPOINT
and/orDAPR_GRPC_ENDPOINT
502 - FIXED Handling of backpressure in Crypto API’s
DaprChunkedStream
503 - ADDED Tests to validate package.json and package-lock.json has the same version 505
- ADDED HTTP
PATCH
verb support for service invocation 518 - ADDED
DAPR_API_TOKEN
to gRPC client 520 - UPDATED Workflow management APIs to use the beta endpoint instead of alpha 528
- ADDED Support for wildcard topics (+, #) in PubSub 529
Upgrading to Dapr 1.12
To upgrade to this release of Dapr, follow the steps here to ensure a smooth upgrade. You know, the one where you don’t get red errors on the terminalβ¦ we all hate that, right?
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
For RC releases like this, download the latest and greatest release from here and put the dapr
binary in your PATH.
Once you have installed the CLI, run:
dapr init --runtime-version=1.12
Wait for the update to finish, ensure you are using the latest version of Dapr(1.12) with:
$ dapr --version
CLI version: 1.12
Runtime version: 1.12
Kubernetes
Upgrading from previous version
You can perform zero-downtime upgrades using both Helm 3 and the Dapr CLI.
Upgrading with zero-downtime is supported from Dapr 1.10 or higher. If upgrading from Dapr 1.9 or earlier, during a rollout you may encounter temporary issues with service invocation if the caller app is running Dapr 1.12 and the target is running Dapr 1.9 or earlier. In this case, we recommend upgrading to Dapr 1.11.x first.
If you are using gRPC-to-gRPC service invocation (legacy, non proxy-based) we recommend performing an upgrade to Dapr 1.11.5 first, before upgrading to 1.12.0. This will ensure the continued ability to perform gRPC-to-gRPC service invocation (legacy, non proxy-based) when the caller app is running Dapr 1.12.
Upgrade using the CLI
Download the latest RC release from here and put the dapr
binary in your PATH.
To upgrade Dapr, run:
dapr upgrade --runtime-version 1.12 -k
To upgrade with high availability mode:
dapr upgrade --runtime-version 1.12 --enable-ha=true -k
Wait until the operation is finished and check your status with dapr status -k
.
All done!
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.12 --namespace=dapr-system --wait
Wait until the operation is finished and check your status with dapr status -k
.
All done!
Note: Make sure your deployments are restarted to pick the latest version of the Dapr sidecar
Starting a fresh install on a cluster
Please 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.12 --namespace dapr-system --wait
Alternatively, you can use the latest version of CLI:
dapr init --runtime-version=1.12 -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.12 15s 2023-09-26 13:07.39
dapr-sentry dapr-system True Running 1 1.12 15s 2023-09-26 13:07.39
dapr-operator dapr-system True Running 1 1.12 15s 2023-09-26 13:07.39
dapr-placement dapr-system True Running 1 1.12 15s 2023-09-26 13:07.39
After Dapr 1.12 has been installed, perform a rolling restart for your deployments to pick up the new version of the sidecar. This can be done with:
kubectl rollout restart deploy/<deployment-name>
Breaking Changes
- Disallow operations on reminders for actor types that are not currently being hosted dapr#6493
- The HTTP Binding now has a default
maxResponseBodySize
of 100 MB, for security reasons components-contrib#3040 - Azure App Config: fix time format to time.duration components-contrib#3004
Deprecation Notices
- The NATS Streaming PubSub component has been deprecated in Dapr 1.12 and will be removed in Dapr 1.13. The upstream NATS Streaming project has been deprecated and has reached End-Of-Life in June 2023. The upstream projects recommends all users migrate to NATS JetStream.
- The
UnsubscribeConfiguration
call for gRPC API has been deprecated. 6769