dapr

Dapr

Deploying Linux server application code was difficult because languages used for writing servers have a lot of dependencies, so Docker was created to simplify things. But getting Docker containers to run reliably across multiple servers was pretty difficult, so Kubernetes was created to simplify things. Deploying multiple services on Kubernetes was kinda complicated though, but now that Dapr has been created to simplify things, deploying our code is easy as pie.

dapr 是一个分布式应用开发框架由微软开源。

Getting Started

vscode 配置 devcontainer 开发环境

1
2
3
4
5
6
7
8
9
10
11
12
"features": {
"ghcr.io/devcontainers/features/desktop-lite:1": {},
"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {},
"ghcr.io/devcontainers/features/python:1": {
"installTools":false
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"dockerDashComposeVersion": "v2",
"moby": false
},
"ghcr.io/dapr/cli/dapr-cli:0": {}
}

配置 desktop-lite 浏览器

1
apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -y firefox-esr

可将安装移动到 dockerfile 中,dockerfile 配置 dapr cli 运行 path。

1
2
# 需要添加预设路径,该路径可通过环境变量配置
ENV PATH=$PATH:/home/node/.dapr/bin

初始化 dapr,安装 dapr cli 命令行工具。

1
2
3
4
dapr -h
dapr --version
dapr init
ls $HOME/.dapr

测试 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 使用 app id (my-app) 启动一个 dapr app,并指定 app端口为 3500
dapr run --app-id my-app --app-port 3500

# 存入状态, url 为 http://localhost:3500/v1.0/state/statestore
curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Bruce Wayne"}]' http://localhost:3500/v1.0/state/statestore

# 获取状态,url为 http://localhost:3500/v1.0/state/statestore/name
curl http://localhost:3500/v1.0/state/statestore/name

# 查看redis 存储内容
docker exec -it dapr_redis redis_cli

# 查看 redis kyes 存储内容
docker exec -it dapr_redis redis-cli
127.0.0.1:6379> keys *
1) "myapp||name"
127.0.0.1:6379> HGETALL "myapp||name"
1) "data"
2) "\"Bruce Wayne\""
3) "version"
4) "1"
127.0.0.1:6379> exit

# 删除状态
curl -v -X DELETE -H "Content-Type: application/json" http://localhost:3500/v1.0/state/statestore/name

Quickstarts Demos

Quickstarts 主要列出了官方的示例,及应用,开始之前需要设置好 dapr 环境

Service Invocation

Service Invocation 实现使用 HTTP 或 gRPC 在两个服务之间进行同步通信。主要专注于解决:

  • 服务发现。如何发现不同的服务。

  • 标准化服务间调用 API 协议。如何确定服务间调用协议。

  • 服务间通信安全。如何在服务间安全设置加密及访问控制。

  • 减缓请求超时和失败处理。如何处理重试及临时错误。

  • 实现可观测性和跟踪。如何跟踪及统计服务间通信。

通常使用两种协议 HTTPgRPC 作为通信方式。

调用实现,可以有三种:

  • HTTP and gRPC:不改动原有代码,使用 dapr run 指定运行对应通信协议的服务。

  • Call to the dapr sidecar url API: 通过直接调用 localhost:<dapr-http-port>/API 调用。

  • SDK: 官方提供了对应的 SDK 方便服务集成。为了快速测试,dapr 提供了 cli 工具方便测试。

1
2
3
4
5
# Invoke a sample method on target app with POST Verb
dapr invoke --app-id target --method sample --data '{"key":"value"}'

# Invoke a sample method on target app with GET Verb
dapr invoke --app-id target --method sample --verb GET

State Management

State Management 即,数据持久化管理。

Hosting options

Kubernetes

配置 dapr 到 k8s

本地部署

安装 minikube,并初始化 dapr,官方示例

1
2
3
4
# 开启本地 minikube 集群
minikube start
# 初始化 dapr, dapr init --kubernetes --wait
dapr init -k

Zipkin

Dapr 支持使用 Zipkin 进行分布式跟踪,您可以通过以下步骤来实现:

  • 安装 Zipkin

您可以通过以下命令安装 Zipkin:

1
docker run -d -p 9411:9411 openzipkin/zipkin
  • 配置 Dapr

在 Dapr 应用程序中启用 Zipkin 跟踪,需要在 Dapr 配置文件中添加以下内容:

1
2
3
4
5
6
7
8
9
10
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
spec:
tracing:
enabled: true
exporter: zipkin
zipkin:
endpointAddress: "http://localhost:9411/api/v2/spans"
  • 启动 Dapr 应用程序

在启动 Dapr 应用程序时,需要指定 Dapr 配置文件的位置。例如,如果您的 Dapr 配置文件名为 config.yaml,则可以使用以下命令启动 Dapr 应用程序:

1
dapr run --app-id my-app --app-port 3500 --config config.yaml node app.js
  • 查看跟踪数据

在 Zipkin UI 中,您可以查看跟踪数据。您可以通过以下 URL 访问 Zipkin UI (http://localhost:9411/zipkin/)