使用 gRPC 的可插拔组件通常作为容器或进程运行,需要通过Unix 域套接字(简称 UDS)与 Dapr 运行时通信。它们会通过以下步骤自动被发现并注册到运行时中:
一个组件可以同时实现多个组件接口。
虽然 Dapr 的内置组件已经集成在运行时中,但可插拔组件在与 Dapr 一起使用之前需要进行一些设置步骤。
在独立模式下,可插拔组件可以作为进程或容器运行。在 Kubernetes 上,可插拔组件作为容器运行,并由 Dapr 的 sidecar 注入器自动注入到应用程序的 pod 中,允许通过标准的Kubernetes 容器规范进行自定义。
这也改变了在 Dapr 和可插拔组件之间共享Unix 域套接字文件的方法。
选择您的环境以开始使您的组件可被发现。
在 Dapr 启动之前,您的组件和 Unix 套接字必须正在运行。
默认情况下,Dapr sidecar 在 /tmp/dapr-components-sockets
中查找作为Unix 域套接字文件的组件。
此文件夹中的文件名对于组件注册很重要。它们必须通过附加组件的名称和您选择的文件扩展名(通常为 .sock
)来形成。例如,文件名 my-component.sock
是一个有效的 Unix 域套接字文件名,适用于名为 my-component
的组件。
由于您在与组件相同的主机上运行 Dapr,请验证此文件夹及其中的文件是否可被您的组件和 Dapr 访问和写入。如果您使用 Dapr 的 sidecar 注入器功能,则此卷会自动创建和挂载。
通过Unix 域套接字(UDS)可访问的可插拔组件可以托管多个不同的组件 API。在组件的初始发现过程中,Dapr 使用反射枚举 UDS 后面的所有组件 API。上例中的 my-component
可插拔组件可以包含状态存储(state
)和 pub/sub(pubsub
)组件 API。
通常,可插拔组件实现单个组件 API 以进行打包和部署。然而,以增加其依赖性和扩大其安全攻击面为代价,可插拔组件可以实现多个组件 API。这可以减轻部署和监控负担。隔离、容错和安全的最佳实践是为每个可插拔组件实现单个组件 API。
使用组件规范定义您的组件。组件的 spec.type
值是通过以下两个部分与 .
连接而成的:
state
、pubsub
、bindings
等)您需要为可插拔组件的Unix 域套接字公开的每个 API 定义一个组件规范。前面示例中的 Unix 域套接字 my-component.sock
公开了一个名为 my-component
的可插拔组件,具有 state
和 pubsub
API。需要两个组件规范,每个规范在其自己的 YAML 文件中,放置在 resources-path
中:一个用于 state.my-component
,另一个用于 pubsub.my-component
。
例如,state.my-component
的组件规范可以是:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: my-production-state-store
spec:
type: state.my-component
version: v1
metadata:
在上面的示例中,请注意以下几点:
spec.type
的内容是 state.my-component
,指的是作为名为 my-component
的可插拔组件公开的状态存储。metadata.name
,即此处定义的状态存储的名称,与可插拔组件名称无关。将此文件保存为 Dapr 的组件配置文件夹中的 component.yaml
。就像 metadata.name
字段的内容一样,此 YAML 文件的文件名没有影响,也不依赖于可插拔组件名称。
初始化 Dapr,并确保您的组件文件放置在正确的文件夹中。
Dapr 1.9.0 是支持可插拔组件的最低版本。从 1.11.0 版本开始,支持可插拔组件的容器自动注入。
就是这样!现在您可以通过 Dapr API 调用状态存储 API。通过运行以下命令查看其运行情况。用 Dapr HTTP 端口替换 $PORT
:
curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Bruce Wayne", "metadata": {}}]' http://localhost:$PORT/v1.0/state/prod-mystore
检索值,用 Dapr HTTP 端口替换 $PORT
:
curl http://localhost:$PORT/v1.0/state/prod-mystore/name
确保您的组件作为容器运行,首先发布并可被您的 Kubernetes 集群访问。
按照在 Kubernetes 集群上部署 Dapr文档中提供的步骤进行操作。
可插拔组件作为容器在与您的应用程序相同的 pod 中部署。
由于可插拔组件由Unix 域套接字支持,请使您的可插拔组件创建的套接字可被 Dapr 运行时访问。配置部署规范以:
在以下示例中,您配置的可插拔组件作为容器部署在与您的应用程序容器相同的 pod 中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels:
app: app
spec:
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
annotations:
# 推荐自动注入可插拔组件。
dapr.io/inject-pluggable-components: "true"
dapr.io/app-id: "my-app"
dapr.io/enabled: "true"
spec:
containers:
# 您的应用程序的容器规范,照常。
- name: app
image: YOUR_APP_IMAGE:YOUR_APP_IMAGE_VERSION
建议将 dapr.io/inject-pluggable-components
注释设置为 “true”,指示 Dapr 的 sidecar 注入器该应用程序的 pod 将有额外的容器用于可插拔组件。
或者,您可以跳过 Dapr 的 sidecar 注入功能,手动添加可插拔组件的容器并注释您的 pod,告诉 Dapr 该 pod 中哪些容器是可插拔组件,如下例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels:
app: app
spec:
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
annotations:
dapr.io/pluggable-components: "component" ## 可插拔组件容器的名称,用 `,` 分隔,例如 "componentA,componentB"。
dapr.io/app-id: "my-app"
dapr.io/enabled: "true"
spec:
containers:
### --------------------- 您的应用程序容器在此处 -----------
- name: app
image: YOUR_APP_IMAGE:YOUR_APP_IMAGE_VERSION
### --------------------- 您的可插拔组件容器在此处 -----------
- name: component
image: YOUR_IMAGE_GOES_HERE:YOUR_IMAGE_VERSION
在应用部署之前,让我们再添加一个配置:组件规范。
可插拔组件使用组件规范定义。组件 type
是从套接字名称(不带文件扩展名)派生的。在以下示例 YAML 中,替换:
your_socket_goes_here
为您的组件套接字名称(无扩展名)your_component_type
为您的组件类型apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: prod-mystore
# 在 Kubernetes 上运行并自动容器注入时,添加以下注释:
annotations:
dapr.io/component-container: >
{
"name": "my-component",
"image": "<registry>/<image_name>:<image_tag>"
}
spec:
type: your_component_type.your_socket_goes_here
version: v1
metadata:
scopes:
- backend
当您希望 Dapr 的 sidecar 注入器处理可插拔组件的容器和卷注入时,dapr.io/component-container
注释在 Kubernetes 上是必需的。至少,您需要 name
和 image
属性,以便 Dapr 的 sidecar 注入器成功将容器添加到应用程序的 pod 中。Unix 域套接字的卷由 Dapr 的 sidecar 注入器自动创建和挂载。
范围您的组件,以确保只有目标应用程序可以连接到可插拔组件,因为它只会在其部署中运行。否则,运行时在初始化组件时会失败。
就是这样!将创建的清单应用到您的 Kubernetes 集群,并通过 Dapr API 调用状态存储 API。
使用Kubernetes pod 转发器访问 daprd
运行时。
通过运行以下命令查看其运行情况。用 Dapr HTTP 端口替换 $PORT
:
curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Bruce Wayne", "metadata": {}}]' http://localhost:$PORT/v1.0/state/prod-mystore
检索值,用 Dapr HTTP 端口替换 $PORT
:
curl http://localhost:$PORT/v1.0/state/prod-mystore/name
使用此示例代码开始开发 .NET 可插拔组件