mirror of https://github.com/dapr/docs.git
231 lines
7.5 KiB
Markdown
231 lines
7.5 KiB
Markdown
---
|
|
type: docs
|
|
title: "Build workflows with Logic Apps"
|
|
linkTitle: "Workflows"
|
|
description: "Learn how to build workflows using Dapr Workflows and Logic Apps"
|
|
weight: 4000
|
|
---
|
|
|
|
Dapr Workflows is a lightweight host that allows developers to run cloud-native workflows locally, on-premises or any cloud environment using the [Azure Logic Apps](https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-overview) workflow engine and Dapr.
|
|
|
|
## Benefits
|
|
|
|
By using a workflow engine, business logic can be defined in a declarative, no-code fashion so application code doesn't need to change when a workflow changes. Dapr Workflows allows you to use workflows in a distributed application along with these added benefits:
|
|
|
|
- **Run workflows anywhere**: on your local machine, on-premises, on Kubernetes or in the cloud
|
|
- **Built-in observability**: tracing, metrics and mTLS through Dapr
|
|
- **gRPC and HTTP endpoints** for your workflows
|
|
- Kick off workflows based on **Dapr bindings** events
|
|
- Orchestrate complex workflows by **calling back to Dapr** to save state, publish a message and more
|
|
|
|
<img src="/images/workflows-diagram.png" width=500 alt="Diagram of Dapr Workflows">
|
|
|
|
## How it works
|
|
|
|
Dapr Workflows hosts a gRPC server that implements the Dapr Client API.
|
|
|
|
This allows users to start workflows using gRPC and HTTP endpoints through Dapr, or start a workflow asynchronously using Dapr bindings.
|
|
Once a workflow request comes in, Dapr Workflows uses the Logic Apps SDK to execute the workflow.
|
|
|
|
## Supported workflow features
|
|
|
|
### Supported actions and triggers
|
|
|
|
- [HTTP](https://docs.microsoft.com/en-us/azure/connectors/connectors-native-http)
|
|
- [Schedule](https://docs.microsoft.com/en-us/azure/logic-apps/concepts-schedule-automated-recurring-tasks-workflows)
|
|
- [Request / Response](https://docs.microsoft.com/en-us/azure/connectors/connectors-native-reqres)
|
|
|
|
### Supported control workflows
|
|
|
|
- [All control workflows](https://docs.microsoft.com/en-us/azure/connectors/apis-list#control-workflow)
|
|
|
|
### Supported data manipulation
|
|
|
|
- [All data operations](https://docs.microsoft.com/en-us/azure/connectors/apis-list#manage-or-manipulate-data)
|
|
|
|
### Not supported
|
|
|
|
- [Managed connectors](https://docs.microsoft.com/en-us/azure/connectors/apis-list#managed-connectors)
|
|
|
|
## Example
|
|
|
|
Dapr Workflows can be used as the orchestrator for many otherwise complex activities. For example, invoking an external endpoint, saving the data to a state store, publishing the result to a different app or invoking a binding can all be done by calling back into Dapr from the workflow itself.
|
|
|
|
This is due to the fact Dapr runs as a sidecar next to the workflow host just as if it was any other app.
|
|
|
|
Examine [workflow2.json](/code/workflow.json) as an example of a workflow that does the following:
|
|
|
|
1. Calls into Azure Functions to get a JSON response
|
|
2. Saves the result to a Dapr state store
|
|
3. Sends the result to a Dapr binding
|
|
4. Returns the result to the caller
|
|
|
|
Since Dapr supports many pluggable state stores and bindings, the workflow becomes portable between different environments (cloud, edge or on-premises) without the user changing the code - *because there is no code involved*.
|
|
|
|
## Get started
|
|
|
|
Prerequisites:
|
|
|
|
1. Install the [Dapr CLI]({{< ref install-dapr-cli.md >}})
|
|
2. [Azure blob storage account](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-create-account-block-blob?tabs=azure-portal)
|
|
|
|
### Self-hosted
|
|
|
|
1. Make sure you have the Dapr runtime initialized:
|
|
|
|
```bash
|
|
dapr init
|
|
```
|
|
|
|
1. Set up the environment variables containing the Azure Storage Account credentials:
|
|
|
|
{{< tabs Windows "macOS/Linux" >}}
|
|
|
|
{{% codetab %}}
|
|
```bash
|
|
export STORAGE_ACCOUNT_KEY=<YOUR-STORAGE-ACCOUNT-KEY>
|
|
export STORAGE_ACCOUNT_NAME=<YOUR-STORAGE-ACCOUNT-NAME>
|
|
```
|
|
{{% /codetab %}}
|
|
|
|
{{% codetab %}}
|
|
```bash
|
|
set STORAGE_ACCOUNT_KEY=<YOUR-STORAGE-ACCOUNT-KEY>
|
|
set STORAGE_ACCOUNT_NAME=<YOUR-STORAGE-ACCOUNT-NAME>
|
|
```
|
|
{{% /codetab %}}
|
|
|
|
{{< /tabs >}}
|
|
|
|
1. Move to the workflows directory and run the sample runtime:
|
|
|
|
```bash
|
|
cd src/Dapr.Workflows
|
|
|
|
dapr run --app-id workflows --protocol grpc --port 3500 --app-port 50003 -- dotnet run --workflows-path ../../samples
|
|
```
|
|
|
|
1. Invoke a workflow:
|
|
|
|
```bash
|
|
curl http://localhost:3500/v1.0/invoke/workflows/method/workflow1
|
|
|
|
{"value":"Hello from Logic App workflow running with Dapr!"}
|
|
```
|
|
|
|
### Kubernetes
|
|
|
|
1. Make sure you have a running Kubernetes cluster and `kubectl` in your path.
|
|
|
|
1. Once you have the Dapr CLI installed, run:
|
|
|
|
```bash
|
|
dapr init --kubernetes
|
|
```
|
|
|
|
1. Wait until the Dapr pods have the status `Running`.
|
|
|
|
1. Create a Config Map for the workflow:
|
|
|
|
```bash
|
|
kubectl create configmap workflows --from-file ./samples/workflow1. json
|
|
```
|
|
|
|
1. Create a secret containing the Azure Storage Account credentials. Replace the account name and key values below with the actual credentials:
|
|
|
|
```bash
|
|
kubectl create secret generic dapr-workflows --from-literal=accountName=<YOUR-STORAGE-ACCOUNT-NAME> --from-literal=accountKey=<YOUR-STORAGE-ACCOUNT-KEY>
|
|
```
|
|
|
|
1. Deploy Dapr Worfklows:
|
|
|
|
```bash
|
|
kubectl apply -f deploy/deploy.yaml
|
|
```
|
|
|
|
1. Create a port-forward to the dapr workflows container:
|
|
|
|
```bash
|
|
kubectl port-forward deploy/dapr-workflows-host 3500:3500
|
|
```
|
|
|
|
1. Invoke logic apps through Dapr:
|
|
|
|
```bash
|
|
curl http://localhost:3500/v1.0/invoke/workflows/method/workflow1
|
|
|
|
{"value":"Hello from Logic App workflow running with Dapr!"}
|
|
```
|
|
|
|
## Invoking workflows using Dapr bindings
|
|
|
|
1. First, create any [Dapr binding]({{< ref components-reference >}}) of your choice. See [this]({{< ref howto-triggers >}}) How-To tutorial.
|
|
|
|
In order for Dapr Workflows to be able to start a workflow from a Dapr binding event, simply name the binding with the name of the workflow you want it to trigger.
|
|
|
|
Here's an example of a Kafka binding that will trigger a workflow named `workflow1`:
|
|
|
|
```yaml
|
|
apiVersion: dapr.io/v1alpha1
|
|
kind: Component
|
|
metadata:
|
|
name: workflow1
|
|
spec:
|
|
type: bindings.kafka
|
|
metadata:
|
|
- name: topics
|
|
value: topic1
|
|
- name: brokers
|
|
value: localhost:9092
|
|
- name: consumerGroup
|
|
value: group1
|
|
- name: authRequired
|
|
value: "false"
|
|
```
|
|
|
|
1. Next, apply the Dapr component:
|
|
|
|
{{< tabs Self-hosted Kubernetes >}}
|
|
|
|
{{% codetab %}}
|
|
Place the binding yaml file above in a `components` directory at the root of your application.
|
|
{{% /codetab %}}
|
|
|
|
{{% codetab %}}
|
|
```bash
|
|
kubectl apply -f my_binding.yaml
|
|
```
|
|
{{% /codetab %}}
|
|
|
|
{{< /tabs >}}
|
|
|
|
1. Once an event is sent to the bindings component, check the logs Dapr Workflows to see the output.
|
|
|
|
{{< tabs Self-hosted Kubernetes >}}
|
|
|
|
{{% codetab %}}
|
|
In standalone mode, the output will be printed to the local terminal.
|
|
{{% /codetab %}}
|
|
|
|
{{% codetab %}}
|
|
On Kubernetes, run the following command:
|
|
|
|
```bash
|
|
kubectl logs -l app=dapr-workflows-host -c host
|
|
```
|
|
{{% /codetab %}}
|
|
|
|
{{< /tabs >}}
|
|
|
|
## Example
|
|
|
|
Watch an example from the Dapr community call:
|
|
|
|
<div class="embed-responsive embed-responsive-16by9">
|
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/7fP-0Ixmi-w?start=116" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
|
</div>
|
|
|
|
## Additional resources
|
|
|
|
- [Blog announcement](https://cloudblogs.microsoft.com/opensource/2020/05/26/announcing-cloud-native-workflows-dapr-logic-apps/)
|
|
- [Repo](https://github.com/dapr/workflows) |