Actors API 参考
Dapr 提供了原生、跨平台和跨语言的虚拟 actor 功能。 除了特定语言的 SDK,开发者还可以使用以下 API 端点来调用 actor。
用户服务代码调用 Dapr
调用 actor 方法
使用 Dapr 调用 actor 方法。
HTTP 请求
POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/method/<method>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
XXX | 上游调用的状态码 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
method |
要调用的方法名称。 |
注意,所有 URL 参数区分大小写。
示例
调用 actor 上的方法示例:
curl -X POST http://localhost:3500/v1.0/actors/stormtrooper/50/method/shoot \
-H "Content-Type: application/json"
您可以在请求体中提供方法参数和值,例如在 curl 中使用 -d "{\"param\":\"value\"}"
。调用带参数的 actor 方法示例:
curl -X POST http://localhost:3500/v1.0/actors/x-wing/33/method/fly \
-H "Content-Type: application/json" \
-d '{
"destination": "Hoth"
}'
或
curl -X POST http://localhost:3500/v1.0/actors/x-wing/33/method/fly \
-H "Content-Type: application/json" \
-d "{\"destination\":\"Hoth\"}"
远程端点的响应(方法返回值)将包含在响应体中。
actor 状态事务
以多项事务的方式持久化 actor 状态的更改。
请注意,此操作依赖于支持多项事务的状态存储组件。
TTL
启用 ActorStateTTL
功能后,actor 客户端可以在事务元数据中设置 ttlInSeconds
字段,以便状态在指定秒数后过期。如果未设置 ttlInSeconds
字段,状态将不会过期。
在构建启用此功能的 actor 应用程序时请记住;目前,所有 actor SDK 都会在本地缓存中保留 actor 状态,即使状态已过期。这意味着即使 TTL 已过期,actor 状态也不会从本地缓存中移除,直到 actor 重新启动或停用。此行为将在未来版本中更改。
有关 actor 状态 TTL 的更多详细信息,请参阅 Dapr 社区电话会议 80 的录音。
HTTP 请求
POST/PUT http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/state
HTTP 响应代码
代码 | 描述 |
---|---|
204 | 请求成功 |
400 | 未找到 actor |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
注意,所有 URL 参数区分大小写。
示例
注意,以下示例使用了
ttlInSeconds
字段,这需要启用ActorStateTTL
功能。
curl -X POST http://localhost:3500/v1.0/actors/stormtrooper/50/state \
-H "Content-Type: application/json" \
-d '[
{
"operation": "upsert",
"request": {
"key": "key1",
"value": "myData",
"metadata": {
"ttlInSeconds": "3600"
}
}
},
{
"operation": "delete",
"request": {
"key": "key2"
}
}
]'
获取 actor 状态
使用指定的键获取 actor 的状态。
HTTP 请求
GET http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/state/<key>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
204 | 未找到键,响应将为空 |
400 | 未找到 actor |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
key |
状态值的键。 |
注意,所有 URL 参数区分大小写。
示例
curl http://localhost:3500/v1.0/actors/stormtrooper/50/state/location \
-H "Content-Type: application/json"
上述命令返回状态:
{
"location": "Alderaan"
}
创建 actor 提醒
为 actor 创建一个持久化的提醒。
HTTP 请求
POST/PUT http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/reminders/<name>
提醒请求体
一个包含以下字段的 JSON 对象:
字段 | 描述 |
---|---|
dueTime |
指定提醒被调用的时间。其格式应为 time.ParseDuration |
period |
指定不同调用之间的周期。其格式应为 time.ParseDuration 或带有可选重复的 ISO 8601 持续时间格式。 |
ttl |
设置计时器或提醒将在何时或间隔后过期并被删除。其格式应为 time.ParseDuration 格式、RFC3339 日期格式或 ISO 8601 持续时间格式。 |
data |
一个字符串值,可以是任何相关内容。内容在提醒过期时返回。例如,这可能用于返回 URL 或与内容相关的任何内容。 |
period
字段支持 time.Duration
格式和 ISO 8601 格式,但有一些限制。对于 period
,仅支持 ISO 8601 持续时间格式 Rn/PnYnMnWnDTnHnMnS
。Rn/
指定提醒将被调用 n
次。
n
应为大于 0 的正整数。- 如果某些值为 0,则可以缩短
period
;例如,10 秒可以在 ISO 8601 持续时间中指定为PT10S
。
如果未指定 Rn/
,则提醒将无限次运行,直到被删除。
如果仅设置了 ttl
和 dueTime
,则提醒将被接受。然而,只有 dueTime
生效。例如,提醒在 dueTime
触发,ttl
被忽略。
如果设置了 ttl
、dueTime
和 period
,则提醒首先在 dueTime
触发,然后根据 period
和 ttl
重复触发并过期。
以下示例指定了 3 秒的 dueTime
和 7 秒的周期。
{
"dueTime":"0h0m3s0ms",
"period":"0h0m7s0ms"
}
dueTime
为 0 表示立即触发。以下请求体表示立即触发,然后每 9 秒触发一次。
{
"dueTime":"0h0m0s0ms",
"period":"0h0m9s0ms"
}
要配置提醒仅触发一次,周期应设置为空字符串。以下指定了 3 秒的 dueTime
和空字符串的周期,这意味着提醒将在 3 秒后触发,然后不再触发。
{
"dueTime":"0h0m3s0ms",
"period":""
}
当您在 period
和 ttl
中同时指定重复次数时,当任一条件满足时,计时器/提醒将停止。以下示例中,计时器的 period
为 3 秒(ISO 8601 持续时间格式),ttl
为 20 秒。此计时器在注册后立即触发,然后每 3 秒触发一次,持续 20 秒,之后由于 ttl
满足而不再触发。
{
"period":"PT3S",
"ttl":"20s"
}
需要对数据进行描述。
{
"data": "someData",
"dueTime": "1m",
"period": "20s"
}
HTTP 响应代码
代码 | 描述 |
---|---|
204 | 请求成功 |
500 | 请求失败 |
400 | 未找到 actor 或请求格式错误 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
name |
要创建的提醒名称。 |
注意,所有 URL 参数区分大小写。
示例
curl http://localhost:3500/v1.0/actors/stormtrooper/50/reminders/checkRebels \
-H "Content-Type: application/json" \
-d '{
"data": "someData",
"dueTime": "1m",
"period": "20s"
}'
获取 actor 提醒
获取 actor 的提醒。
HTTP 请求
GET http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/reminders/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
name |
要获取的提醒名称。 |
注意,所有 URL 参数区分大小写。
示例
curl http://localhost:3500/v1.0/actors/stormtrooper/50/reminders/checkRebels \
"Content-Type: application/json"
上述命令返回提醒:
{
"dueTime": "1s",
"period": "5s",
"data": "0",
}
删除 actor 提醒
删除 actor 的提醒。
HTTP 请求
DELETE http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/reminders/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
204 | 请求成功 |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
name |
要删除的提醒名称。 |
注意,所有 URL 参数区分大小写。
示例
curl -X DELETE http://localhost:3500/v1.0/actors/stormtrooper/50/reminders/checkRebels \
-H "Content-Type: application/json"
创建 actor 计时器
为 actor 创建一个计时器。
HTTP 请求
POST/PUT http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/timers/<name>
计时器请求体:
计时器请求体的格式与actor 提醒相同。例如:
以下指定了 3 秒的 dueTime
和 7 秒的周期。
{
"dueTime":"0h0m3s0ms",
"period":"0h0m7s0ms"
}
dueTime
为 0 表示立即触发。以下请求体表示立即触发,然后每 9 秒触发一次。
{
"dueTime":"0h0m0s0ms",
"period":"0h0m9s0ms"
}
HTTP 响应代码
代码 | 描述 |
---|---|
204 | 请求成功 |
500 | 请求失败 |
400 | 未找到 actor 或请求格式错误 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
name |
要创建的计时器名称。 |
注意,所有 URL 参数区分大小写。
示例
curl http://localhost:3500/v1.0/actors/stormtrooper/50/timers/checkRebels \
-H "Content-Type: application/json" \
-d '{
"data": "someData",
"dueTime": "1m",
"period": "20s",
"callback": "myEventHandler"
}'
删除 actor 计时器
删除 actor 的计时器。
HTTP 请求
DELETE http://localhost:<daprPort>/v1.0/actors/<actorType>/<actorId>/timers/<name>
HTTP 响应代码
代码 | 描述 |
---|---|
204 | 请求成功 |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
daprPort |
Dapr 端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
name |
要删除的计时器名称。 |
注意,所有 URL 参数区分大小写。
curl -X DELETE http://localhost:3500/v1.0/actors/stormtrooper/50/timers/checkRebels \
-H "Content-Type: application/json"
Dapr 调用用户服务代码
获取注册的 actor
获取此应用程序的注册 actor 类型和 Dapr actor 配置设置。
HTTP 请求
GET http://localhost:<appPort>/dapr/config
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
示例
获取注册 actor 的示例:
curl -X GET http://localhost:3000/dapr/config \
-H "Content-Type: application/json"
上述命令返回配置(所有字段都是可选的):
参数 | 描述 |
---|---|
entities |
此应用程序支持的 actor 类型。 |
actorIdleTimeout |
指定在停用空闲 actor 之前等待的时间。如果没有 actor 方法调用且没有提醒触发,则 actor 为空闲状态。 |
actorScanInterval |
指定扫描以停用空闲 actor 的频率。空闲时间超过 actorIdleTimeout 的 actor 将被停用。 |
drainOngoingCallTimeout |
在重新平衡 actor 的过程中使用的持续时间。指定等待当前活动的 actor 方法完成的时间。如果没有当前的 actor 方法调用,则忽略此项。 |
drainRebalancedActors |
一个布尔值。如果为 true,Dapr 将等待 drainOngoingCallTimeout 以允许当前 actor 调用完成,然后再尝试停用 actor。如果为 false,则不等待。 |
reentrancy |
一个配置对象,包含 actor 重入的选项。 |
enabled |
重入配置中启用重入所需的标志。 |
maxStackDepth |
重入配置中控制对同一 actor 进行的重入调用次数的值。 |
entitiesConfig |
允许每个 actor 类型设置的实体配置数组。此处定义的任何配置都必须有一个映射回根级别实体的实体。 |
注意
配置中的 actor 设置的超时和间隔使用 time.ParseDuration 格式。您可以使用字符串格式表示持续时间。例如:
1h30m
或1.5h
:1 小时 30 分钟的持续时间1d12h
:1 天 12 小时的持续时间500ms
:500 毫秒的持续时间-30m
:负 30 分钟的持续时间
{
"entities":["actorType1", "actorType2"],
"actorIdleTimeout": "1h",
"actorScanInterval": "30s",
"drainOngoingCallTimeout": "30s",
"drainRebalancedActors": true,
"reentrancy": {
"enabled": true,
"maxStackDepth": 32
},
"entitiesConfig": [
{
"entities": ["actorType1"],
"actorIdleTimeout": "1m",
"drainOngoingCallTimeout": "10s",
"reentrancy": {
"enabled": false
}
}
]
}
停用 actor
通过将 actor 的实例持久化到具有指定 actorId 的状态存储中来停用 actor。
HTTP 请求
DELETE http://localhost:<appPort>/actors/<actorType>/<actorId>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
400 | 未找到 actor |
500 | 请求失败 |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
注意,所有 URL 参数区分大小写。
示例
以下示例停用了具有 actorId
为 50 的 stormtrooper
actor 类型。
curl -X DELETE http://localhost:3000/actors/stormtrooper/50 \
-H "Content-Type: application/json"
调用 actor 方法
调用具有指定 methodName
的 actor 方法,其中:
- 方法的参数在请求消息体中传递。
- 返回值在响应消息体中提供。
如果 actor 尚未运行,应用程序端应激活它。
HTTP 请求
PUT http://localhost:<appPort>/actors/<actorType>/<actorId>/method/<methodName>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
404 | 未找到 actor |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
methodName |
要调用的方法名称。 |
注意,所有 URL 参数区分大小写。
示例
以下示例调用了具有 actorId
为 50 的 stormtrooper
actor 类型的 performAction
方法。
curl -X POST http://localhost:3000/actors/stormtrooper/50/method/performAction \
-H "Content-Type: application/json"
调用提醒
调用具有指定 reminderName 的 actor 提醒。如果 actor 尚未运行,应用程序端应激活它。
HTTP 请求
PUT http://localhost:<appPort>/actors/<actorType>/<actorId>/method/remind/<reminderName>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
404 | 未找到 actor |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
reminderName |
要调用的提醒名称。 |
注意,所有 URL 参数区分大小写。
示例
以下示例调用了具有 actorId
为 50 的 stormtrooper
actor 类型的 checkRebels
提醒方法。
curl -X POST http://localhost:3000/actors/stormtrooper/50/method/remind/checkRebels \
-H "Content-Type: application/json"
调用计时器
调用具有指定 timerName
的 actor 计时器。如果 actor 尚未运行,应用程序端应激活它。
HTTP 请求
PUT http://localhost:<appPort>/actors/<actorType>/<actorId>/method/timer/<timerName>
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 请求成功 |
500 | 请求失败 |
404 | 未找到 actor |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
actorType |
actor 类型。 |
actorId |
actor ID。 |
timerName |
要调用的计时器名称。 |
注意,所有 URL 参数区分大小写。
示例
以下示例调用了具有 actorId
为 50 的 stormtrooper
actor 类型的 checkRebels
计时器方法。
curl -X POST http://localhost:3000/actors/stormtrooper/50/method/timer/checkRebels \
-H "Content-Type: application/json"
健康检查
探测应用程序以响应信号,通知 Dapr 应用程序健康且正在运行。
任何非 200
的响应状态码都将被视为不健康的响应。
响应体不是必需的。
HTTP 请求
GET http://localhost:<appPort>/healthz
HTTP 响应代码
代码 | 描述 |
---|---|
200 | 应用程序健康 |
URL 参数
参数 | 描述 |
---|---|
appPort |
应用程序端口。 |
示例
从应用程序获取健康检查响应的示例:
curl -X GET http://localhost:3000/healthz \
激活 actor
从概念上讲,激活 actor 意味着创建 actor 的对象并将 actor 添加到跟踪表中。查看 .NET SDK 的示例。
外部查询 actor 状态
为了使 actor 状态可见并允许复杂场景(如状态聚合),Dapr 将 actor 状态保存在外部状态存储中,例如数据库。因此,可以通过组合正确的键或查询来外部查询 actor 状态。
Dapr 为 actor 创建的状态命名空间由以下项目组成:
- 应用程序 ID:表示分配给 Dapr 应用程序的唯一 ID。
- actor 类型:表示 actor 的类型。
- actor ID:表示 actor 类型的 actor 实例的唯一 ID。
- 键:特定状态值的键。一个 actor ID 可以持有多个状态键。
以下示例显示了如何在 myapp
应用程序 ID 命名空间下构造 actor 实例状态的键:
myapp||cat||hobbit||food
在上述示例中,我们获取了 myapp
应用程序 ID 命名空间下,actor 类型为 cat
,actor ID 为 hobbit
的状态键 food
的值。
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.