The documentation you are viewing is for Dapr v1.15 which is an older version of Dapr. For up-to-date documentation, see the latest version.
Bindings API 参考
Dapr 为应用程序提供了双向绑定的功能,提供了一种与不同云服务或本地系统交互的统一方法。开发人员可以通过 Dapr API 调用输出绑定,并让 Dapr 运行时通过输入绑定来触发应用程序。
bindings 的示例包括 Kafka
、Rabbit MQ
、Azure Event Hubs
、AWS SQS
、GCP Storage
等。
Bindings 结构
一个 Dapr Binding 的 yaml 文件结构如下:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
namespace: <NAMESPACE>
spec:
type: bindings.<TYPE>
version: v1
metadata:
- name: <NAME>
value: <VALUE>
metadata.name
是绑定的名称。
如果在本地自托管运行,请将此文件放在 components
文件夹中,与状态存储和消息队列 yml 配置相邻。
如果在 Kubernetes 上运行,请将组件应用到您的集群中。
注意: 在生产环境中,切勿在 Dapr 组件文件中放置密码或秘密。有关使用 secret 存储安全存储和检索秘密的信息,请参阅 设置 Secret Store
绑定方向(可选)
在某些情况下,向 Dapr 提供额外的信息以指示绑定组件支持的方向是有帮助的。
指定绑定的 direction
可以帮助 Dapr sidecar 避免进入“等待应用程序准备就绪”的状态,这种状态下它会无限期地等待应用程序可用。这解耦了 Dapr sidecar 和应用程序之间的生命周期依赖。
您可以在组件元数据中指定 direction
字段。此字段的有效值为:
"input"
"output"
"input, output"
注意
强烈建议所有绑定都应包含direction
属性。
以下是一些 direction
元数据字段可能有帮助的场景:
-
当一个应用程序(与 sidecar 分离)作为无服务器工作负载运行并缩放到零时,Dapr sidecar 执行的“等待应用程序准备就绪”检查变得毫无意义。
-
如果分离的 Dapr sidecar 缩放到零,并且应用程序在启动 HTTP 服务器之前到达 sidecar,“等待应用程序准备就绪”会导致应用程序和 sidecar 互相等待而陷入死锁。
示例
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: kafkaevent
spec:
type: bindings.kafka
version: v1
metadata:
- name: brokers
value: "http://localhost:5050"
- name: topics
value: "someTopic"
- name: publishTopic
value: "someTopic2"
- name: consumerGroup
value: "group1"
- name: "direction"
value: "input, output"
通过输入绑定调用服务代码
希望通过输入绑定来触发应用程序的开发人员可以在 POST
http 端点上监听,路由名称与 metadata.name
相同。
启动时,Dapr 向 metadata.name
端点发送 OPTIONS
请求,并期望不同的状态码为 NOT FOUND (404)
,如果此应用程序希望订阅绑定。
metadata
部分是一个开放的键/值元数据对,允许绑定定义连接属性,以及组件实现特有的自定义属性。
示例
例如,以下是一个 Python 应用程序如何使用符合 Dapr API 的平台订阅来自 Kafka
的事件。注意组件中的 metadata.name 值 kafkaevent
与 Python 代码中的 POST 路由名称匹配。
Kafka 组件
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: kafkaevent
spec:
type: bindings.kafka
version: v1
metadata:
- name: brokers
value: "http://localhost:5050"
- name: topics
value: "someTopic"
- name: publishTopic
value: "someTopic2"
- name: consumerGroup
value: "group1"
Python 代码
from flask import Flask
app = Flask(__name__)
@app.route("/kafkaevent", methods=['POST'])
def incoming():
print("Hello from Kafka!", flush=True)
return "Kafka Event Processed!"
绑定端点
bindings 是从组件 yaml 文件中发现的。Dapr 在启动时调用此端点以确保应用程序可以处理此调用。如果应用程序没有该端点,Dapr 会忽略它。
HTTP 请求
OPTIONS http://localhost:<appPort>/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
404 | 应用程序不想绑定到该绑定 |
2xx 或 405 | 应用程序想要绑定到该绑定 |
URL 参数
参数 | 描述 |
---|---|
appPort | 应用程序端口 |
name | 绑定的名称 |
注意,所有 URL 参数区分大小写。
绑定负载
为了传递绑定输入,会向用户代码发出一个以绑定名称为 URL 路径的 POST 调用。
HTTP 请求
POST http://localhost:<appPort>/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 应用程序成功处理了输入绑定 |
URL 参数
参数 | 描述 |
---|---|
appPort | 应用程序端口 |
name | 绑定的名称 |
注意,所有 URL 参数区分大小写。
HTTP 响应体(可选)
可选地,可以使用响应体直接将输入绑定与状态存储或输出绑定绑定。
示例:
Dapr 将 stateDataToStore
存储到名为 “stateStore” 的状态存储中。
Dapr 将 jsonObject
并行发送到名为 “storage” 和 “queue” 的输出绑定。
如果未设置 concurrency
,则按顺序发送(下面的示例显示这些操作是并行完成的)
{
"storeName": "stateStore",
"state": stateDataToStore,
"to": ['storage', 'queue'],
"concurrency": "parallel",
"data": jsonObject,
}
调用输出绑定
此端点允许您调用 Dapr 输出绑定。Dapr bindings 支持各种操作,例如 create
。
请参阅每个绑定的不同规范以查看支持的操作列表。
HTTP 请求
POST/PUT http://localhost:<daprPort>/v1.0/bindings/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
204 | 空响应 |
400 | 请求格式错误 |
500 | 请求失败 |
负载
bindings 端点接收以下 JSON 负载:
{
"data": "",
"metadata": {
"": ""
},
"operation": ""
}
注意,所有 URL 参数区分大小写。
data
字段接受任何 JSON 可序列化的值,并作为要发送到输出绑定的负载。metadata
字段是一个键/值对数组,允许您为每次调用设置绑定特定的元数据。operation
字段告诉 Dapr 绑定它应该执行哪个操作。
URL 参数
参数 | 描述 |
---|---|
daprPort | Dapr 端口 |
name | 要调用的输出绑定的名称 |
注意,所有 URL 参数区分大小写。
示例
curl -X POST http://localhost:3500/v1.0/bindings/myKafka \
-H "Content-Type: application/json" \
-d '{
"data": {
"message": "Hi"
},
"metadata": {
"key": "redis-key-1"
},
"operation": "create"
}'
常见元数据值
有一些常见的元数据属性在多个绑定组件中支持。以下列表展示了它们:
属性 | 描述 | 绑定定义 | 可用于 |
---|---|---|---|
ttlInSeconds | 定义消息的生存时间(以秒为单位) | 如果在绑定定义中设置,将导致所有消息具有默认的生存时间。消息 ttl 覆盖绑定定义中的任何值。 | RabbitMQ, Azure Service Bus, Azure Storage Queue |
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.