什么是 Dapr?
Dapr是一个开源的工具,它帮助开发者更轻松地构建和管理分布式应用程序。它帮你处理各种复杂的任务,使开发者能专注于实现应用程序的核心功能。
Dapr 能做什么?
- 服务调用:Dapr 能让你轻松地让不同的服务(程序)互相调用。(主要了解到的)
- 状态管理:Dapr 能帮你保存和获取数据。
- 发布/订阅:Dapr 能帮你实现消息的发送和接收。
- 秘密管理:Dapr 能安全地保存和获取敏感信息。
- 简化开发:Dapr 提供了一套统一的 API,让你不用自己实现复杂的功能,专注于业务逻辑。
- 跨语言支持:Dapr 支持多种编程语言,不管你用的是 Python、Java、Node.js 还是其他语言,都可以方便地使用 Dapr。
核心概念
- 服务调用(Service Invocation):
- 允许一个服务调用另一个服务,支持 HTTP 和 gRPC 协议。
- 例如,服务 A 可以通过 Dapr 调用服务 B 提供的 API,而无需知道服务 B 的具体位置和协议细节。
- 状态管理(State Management):
- 提供了一种简单的方法来存储和检索应用程序的状态,支持各种后端存储。
- 例如,服务可以通过 Dapr 存储键值对数据到 Redis、Cosmos DB 等存储系统。
- 发布/订阅(Publish/Subscribe):
- 允许服务之间通过消息传递进行通信,支持各种消息代理,如 Kafka、RabbitMQ。
- 例如,服务 A 可以发布消息到一个主题,服务 B 可以订阅该主题并接收消息。
- 秘密管理(Secrets Management):
- 提供了一种安全的方式来存储和访问敏感信息,如数据库连接字符串、API 密钥。
- 例如,服务可以通过 Dapr 访问存储在 Azure Key Vault 或 HashiCorp Vault 中的秘密。
Dapr 组件(组件之间互相通讯代表服务之间互相通讯)
Dapr 使用组件来实现不同的功能,每个组件代表一个特定的服务或功能模块。例如,状态管理组件、发布/订阅组件等。开发者可以通过配置文件来定义和管理这些组件。
Dapr 配置示例
以下是一个典型的 Dapr 组件配置示例:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: service-invocation
namespace: default
spec:
type: bindings.http
version: v1
metadata:
- name: url
value: "http://localhost:5000"
总结
使用 Dapr 协议可以显著简化分布式系统的开发和管理,提供了丰富的内置功能和标准化的 API,增强了系统的可扩展性、弹性和可观察性。相比之下,不使用 Dapr 协议则需要手动实现和集成许多基础设施和功能,增加了开发和运维的复杂性。
步骤:
- 安装 Dapr CLI 和初始化 Dapr:
- 请确保已安装 Dapr CLI 并进行初始化。
- 安装命令:
iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex
- 初始化 Dapr:
dapr init
- 创建示例服务:
- 我们创建一个 Python 服务,处理接收到的视频数据。
示例代码:
1. 创建处理服务 (process_service.py)
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
@app.route('/process', methods=['POST'])
def process_video():
video_data = request.json.get('video_data')
# 模拟视频数据处理
processed_result = f"Processed {len(video_data)} frames"
return jsonify({"result": processed_result})
if __name__ == '__main__':
app.run(port=os.getenv('APP_PORT', 5000))
2. 创建 Dapr 组件配置 (components/service_invocation.yaml)
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: service-invocation
namespace: default
spec:
type: bindings.http
version: v1
metadata:
- name: url
value: "http://localhost:5000"
用于配置 HTTP 绑定,服务调用目标 URL 是 http://localhost:5000
。(主要作用是调用哪个服务)
3. 运行处理服务:
dapr run --app-id process-service --app-port 5000 --dapr-http-port 3500 python process_service.py
这个命令会启动 Flask 应用,并让 Dapr 在 3500
端口上监听 HTTP 请求,将其转发到 Flask 应用的 5000
端口。
4. 创建客户端调用服务 (client.py)
import requests
def invoke_service(video_data):
url = "http://localhost:3500/v1.0/invoke/process-service/method/process"
response = requests.post(url, json={"video_data": video_data})
return response.json()
if __name__ == '__main__':
sample_video_data = "fake_video_frames_data" # 模拟视频数据
result = invoke_service(sample_video_data)
print(f"Result from service: {result['result']}")
这个文件定义了一个客户端程序,它通过 Dapr 的服务调用 API 调用处理服务。这个客户端程序向 Dapr 发送一个 POST 请求,Dapr 会将请求转发到 process-service
的 /process
端点。
5. 运行客户端:
python client.py
客户端程序会调用处理服务,并输出处理结果。