
# Dapr 0.4.0

We're happy to announce the release of Dapr 0.4.0!

This release includes new components, security improvements, API level enhancements, new CLI features, stability and bug fixes, a richer Java SDK, docs and samples updates.

We would like to extend our thanks to all new and existing contributors who helped make this release happen.

If you're new to Dapr, visit the [getting started](https://docs.dapr.io/getting-started/install-dapr/) page and familiarize yourself with Dapr.

*__Note: This release of Dapr contains [breaking changes](#breaking-changes). Read through for more details, and see [this](#upgrading-to-dapr-0.4.0) section on upgrading Dapr__*

## New in this release

### Dapr Runtime

**Added** Support for multiple state stores (Breaking change in API)

**Added** Automatic mTLS between Dapr instances

**Updated** Main entrypoint to allow customization of included components (Thanks @pkedy)

**Changed** State key delimiter

**Refactored** Error codes (Thanks @shaggygi)

**Updated** Output bindings to receive component name in metadata (Thanks @lynn-orrell)

**Fixed** HTTP Middleware pipeline duplicate registration (Thanks @jjcollinge)

**Added** Forwarding HTTP headers to pipeline (Thanks @jjcollinge)

**Fixed** gRPC Cloud Events Envelope during publishing (Thanks @lhx6538665)

**Removed** Vendor directory

**Updated** Helm 2 to Helm 3

**Improved** Kafka installation in CI tests

**Added** VSCode Dev-Container environment and documentation

### Components

**Added** Twilio binding (Thanks @markrussinovich)

**Added** Cloudstate Integration (Thanks @jroper @viktorklang @jboner)

**Added** Azure Table Storage State Store (Thanks @aloneguid)

**Added** SQL Server State Store with transactions support (Thanks @fbeltrao)

**Added** Aerospike State Store (Thanks @abhirockzz)

**Added** Couchbase Store (Thanks @abhirockzz)

**Added** Hazalcast State Store (Thanks @abhirockzz)

**Added** Managed Identity support for Azure Key Vault (Thanks @cmendible)

**Added** OIDC Bearer middleware (Thanks @cmendible)

**Added** Params/SSL support for MongoDB

**Fixed** Block timeout issue with Redis Streams

**Fixed** Goroutine leak with Azure Service Bus

**Fixed** Single concurrency stream handler in Redis Streams

**Fixed** NetHTTPAdapter panicing with non-nil body

**Updated** Azure Blob Storage schema (Thanks @mkosieradzki)

**Removed** Vendor directory

**Added** Concurrency limit support for Azure Service Bus Pub/Sub (Thanks @jjcollinge)

**Updated** Logrus to v1.4.2 (Thanks @thinkerou)

**Added** Azure Storage Queues (Thanks @stather)

**Improved** Redis tests (Thanks @David-Kunz)

**Added** Middleware for rate limiting requests (Thanks @jjcollinge)

### CLI

**Added** Command to view configurations in a Kubernetes cluster

**Added** Command to view components in a Kubernetes cluster

**Added** Command to view status for mTLS in a Kubernetes cluster

**Added** Command to fetch app/dapr logs in a Kubernetes cluster

**Fixed** Init command downloading -RC versions

**Fixed** `dapr stop` failing on Windows

**Removed** Vendor directory

**Updated** Linter settings

### .NET  SDK

**Added** Support for multiple state stores

**Fixed** Reminder not fetching state correctly

**Updated** Build for Dotnet Core 3.1 LTS

**Added** InvokeClient and InvokeHttpClient implementations (Thanks @jeastham1993)

**Updated** Localhost to 127.0.0.1

**Updated** Actors samples to show timers and reminders (Thanks @pacodelacruz)

**Fixed** Integration tests (Thanks @ryannowak)

**Fixed** Actor reminders corrupt state (Thanks @chgeuer)

**Added** Support for delete operations (Thanks @ryannowak)

**Updated** ASP.NET core sample docs to include commands for windows

**Fixed** URL generation when BaseAddress is used (Thanks @ryannowak)

**Updated** Readme for Actor Sample to clarify client invocation

### Java SDK

**Added** Actor support

**Added** Support for bindings

**Added** Support for pub/sub

**Added** Support for state management

**Added** Support for service invocation

**Added** Unit tests

**Added** Integration tests

**Added** Custom serialization support

**Removed** Maven dependency to run dapr for examples (Thanks @Rinita-De)

### Samples

**Updated** All samples to account for multiple state stores API changes

### Docs

**Added** CloudState How-To

**Added** Azure Table Storage How-To (Thanks @aloneguid)

**Added** Hashicorp Vault How-To

**Added** mTLS How-To

**Added** Hazalcast How-To

**Added** SQL Server How-To (Thanks @fbeltrao)

**Added** Couchbase How-To

**Added** Aerospike How-To

**Added** Java SDK docs

**Improved** Event Hubs binding spec

**Updated** docs to comply with Microsoft Doc Authoring Pack (Thanks @LaurentLesle)

**Updated** Docs to account for multiple state stores API changes

**Added** IntelliJ debugging guide

**Added** Azure SignarlR binding docs (Thanks @fbeltrao)

**Updated** Helm 2 to Helm 3

**Updated** Diagrams


## Upgrading to Dapr 0.4.0

If you're upgrading from an older version of Dapr to 0.4.0, 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:

```
dapr uninstall --all
```

Next, get the latest CLI following [these](https://github.com/dapr/cli#installing-dapr-cli) instructions, or alternatively download the latest and greatest release from [here](https://github.com/dapr/cli/releases) and put the `dapr` binary in your PATH.

Once you have downloaded the CLI, run:

```
dapr init
```

Wait for the update to finish, and you're good to go!

### Kubernetes

Download the latest CLI release as outlined above in the `Local Machine / Self-hosted` section.

If you previously installed Dapr on your Kubernetes cluster using the Dapr CLI, run:

```
dapr uninstall --kubernetes
```

It's fine to ignore any errors that might show up.

If you previously installed Dapr using __Helm 2.X__:

```
helm del --purge dapr
```

If you previously installed Dapr using __Helm 3.X__:

```
helm uninstall dapr
```

Wait until Dapr is uninstalled, and make sure the `dapr-system` namespace is gone.

You can now follow [these](https://docs.dapr.io/getting-started/install-dapr/#install-with-helm-advanced) instructions on how to install Dapr using __Helm 3__.

Alternatively, if you want to install Dapr in a dev/test setup, run:

```
dapr init --kubernetes
```

*For more information on upgrading to Helm 3, go to [this](https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/) link.*

## Breaking Changes

With the introduction of multiple state stores, the API has changed to allow a developer to specify which state store the operation is targeting.

Starting this release, any state operation is *required* to provide a state store name:

```
v1.0/state/<state-store-name>/
```

For the latest API spec, go to [this](https://docs.dapr.io/reference/api/state_api/) link.

### Example

A call to get state prior to 0.4.0:

```
curl http://localhost:3500/v1.0/state/myKey
```

A call to get state in 0.4.0:

```
curl http://localhost:3500/v1.0/state/cassandra-dev/myKey
```
