<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>可插拔组件 on Dapr 文档库</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/</link><description>Recent content in 可插拔组件 on Dapr 文档库</description><generator>Hugo</generator><language>zh-hans</language><atom:link href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/index.xml" rel="self" type="application/rss+xml"/><item><title>可插拔组件概述</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/pluggable-components-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/pluggable-components-overview/</guid><description>&lt;p>可插拔组件是指那些不包含在运行时中的组件，与 &lt;code>dapr init&lt;/code> 中的内置组件相对。您可以配置 Dapr 使用这些可插拔组件，它们利用构建块 API，但注册方式与&lt;a href="https://github.com/dapr/components-contrib">内置 Dapr 组件&lt;/a>不同。&lt;/p>
&lt;img src="https://v1-18.docs.dapr.io/images/concepts-building-blocks.png" width=400>
&lt;h2 id="可插拔组件与内置组件">可插拔组件与内置组件&lt;/h2>
&lt;p>Dapr 提供了两种注册和创建组件的方法：&lt;/p>
&lt;ul>
&lt;li>运行时中包含的内置组件，可以在&lt;a href="https://github.com/dapr/components-contrib">components-contrib 仓库&lt;/a>中找到。&lt;/li>
&lt;li>独立部署和注册的可插拔组件。&lt;/li>
&lt;/ul>
&lt;p>这两种注册选项虽然都利用了 Dapr 的构建块 API，但实现过程不同。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>组件详情&lt;/th>
 &lt;th style="text-align: left">&lt;a href="https://github.com/dapr/components-contrib/blob/master/docs/developing-component.md">内置组件&lt;/a>&lt;/th>
 &lt;th style="text-align: left">可插拔组件&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>语言&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">只能用 Go 编写&lt;/td>
 &lt;td style="text-align: left">&lt;a href="https://grpc.io/docs/what-is-grpc/introduction/#protocol-buffer-versions">可以用任何支持 gRPC 的语言编写&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>运行位置&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">作为 Dapr 运行时可执行文件的一部分&lt;/td>
 &lt;td style="text-align: left">作为 pod 中的独立进程或容器运行，与 Dapr 本身分开运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>与 Dapr 的注册方式&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">包含在 Dapr 代码库中&lt;/td>
 &lt;td style="text-align: left">通过 Unix 域套接字（使用 gRPC）与 Dapr 注册&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>分发&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">随 Dapr 版本发布。组件的新功能与 Dapr 版本保持一致&lt;/td>
 &lt;td style="text-align: left">独立于 Dapr 本身分发。可以在需要时添加新功能，并遵循自己的发布周期。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>组件激活方式&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">Dapr 启动运行组件（自动）&lt;/td>
 &lt;td style="text-align: left">用户启动组件（手动）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="为什么创建可插拔组件">为什么创建可插拔组件？&lt;/h2>
&lt;p>在以下场景中，可插拔组件非常有用：&lt;/p>
&lt;ul>
&lt;li>您需要一个私有组件。&lt;/li>
&lt;li>您希望将组件与 Dapr 的发布过程分开。&lt;/li>
&lt;li>您对 Go 不太熟悉，或者用 Go 实现组件并不理想。&lt;/li>
&lt;/ul>
&lt;h2 id="特性">特性&lt;/h2>
&lt;h3 id="实现可插拔组件">实现可插拔组件&lt;/h3>
&lt;p>要实现可插拔组件，您需要在组件中实现一个 gRPC 服务。实现 gRPC 服务需要三个步骤：&lt;/p></description></item><item><title>如何：实现可插拔组件</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/develop-pluggable/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/develop-components/pluggable-components/develop-pluggable/</guid><description>&lt;p>在本指南中，您将学习实现可插拔组件的原因和方法。要了解如何配置和注册可插拔组件，请参阅&lt;a href="https://v1-18.docs.dapr.io/zh-hans/operations/components/pluggable-components-registration/">如何：注册可插拔组件&lt;/a>。&lt;/p>
&lt;h2 id="实现可插拔组件">实现可插拔组件&lt;/h2>
&lt;p>要实现可插拔组件，需在组件中实现 gRPC 服务。实现 gRPC 服务需要三个步骤：&lt;/p>
&lt;h3 id="找到-proto-定义文件">找到 proto 定义文件&lt;/h3>
&lt;p>每个支持的服务接口（如状态存储、发布订阅、绑定、密钥存储）都提供了 proto 定义。&lt;/p>
&lt;p>目前支持以下组件 API：&lt;/p>
&lt;ul>
&lt;li>状态存储&lt;/li>
&lt;li>发布订阅&lt;/li>
&lt;li>绑定&lt;/li>
&lt;li>密钥存储&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: center">组件&lt;/th>
 &lt;th style="text-align: center">类型&lt;/th>
 &lt;th style="text-align: center">gRPC 定义&lt;/th>
 &lt;th style="text-align: center">内置参考实现&lt;/th>
 &lt;th>文档&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: center">状态存储&lt;/td>
 &lt;td style="text-align: center">&lt;code>state&lt;/code>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/state.proto">state.proto&lt;/a>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/components-contrib/tree/master/state/redis">Redis&lt;/a>&lt;/td>
 &lt;td>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-management-overview/">概念&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-get-save-state/">如何&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/">API 规范&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: center">发布订阅&lt;/td>
 &lt;td style="text-align: center">&lt;code>pubsub&lt;/code>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/pubsub.proto">pubsub.proto&lt;/a>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/components-contrib/tree/master/pubsub/redis">Redis&lt;/a>&lt;/td>
 &lt;td>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/pubsub/pubsub-overview/">概念&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/pubsub/howto-publish-subscribe/">如何&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/pubsub_api/">API 规范&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: center">绑定&lt;/td>
 &lt;td style="text-align: center">&lt;code>bindings&lt;/code>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/bindings.proto">bindings.proto&lt;/a>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/components-contrib/tree/master/bindings/kafka">Kafka&lt;/a>&lt;/td>
 &lt;td>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/bindings/bindings-overview/">概念&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/bindings/howto-triggers/">输入如何&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/bindings/howto-bindings/">输出如何&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/bindings_api/">API 规范&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: center">密钥存储&lt;/td>
 &lt;td style="text-align: center">&lt;code>secretstores&lt;/code>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/secretstore.proto">secretstore.proto&lt;/a>&lt;/td>
 &lt;td style="text-align: center">&lt;a href="https://github.com/dapr/components-contrib/blob/master/secretstores/hashicorp/vault/vault.go">Hashicorp/Vault&lt;/a>&lt;/td>
 &lt;td>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/secrets/secrets-overview/">概念&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/secrets/howto-secrets/">如何-secrets&lt;/a>, &lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/secrets_api/">API 规范&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>以下是可插拔组件状态存储的 gRPC 服务定义片段（[state.proto]）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-protobuf" data-lang="protobuf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// StateStore 服务为状态存储组件提供 gRPC 接口。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">service&lt;/span> &lt;span style="color:#000">StateStore&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 使用给定的元数据初始化状态存储组件。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Init&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">InitRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">InitResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 返回已实现的状态存储功能列表。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Features&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">FeaturesRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">FeaturesResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// Ping 状态存储。用于活跃性目的。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Ping&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">PingRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">PingResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 从状态存储中删除指定的键。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Delete&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">DeleteRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">DeleteResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 从给定的键获取数据。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Get&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">GetRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">GetResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 设置指定键的值。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">Set&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">SetRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">SetResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 一次删除多个键。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">BulkDelete&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkDeleteRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkDeleteResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 一次检索多个键。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">BulkGet&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkGetRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkGetResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// 一次设置多个键的值。
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#204a87;font-weight:bold">rpc&lt;/span> &lt;span style="color:#000">BulkSet&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkSetRequest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">returns&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">BulkSetResponse&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">&lt;/span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>&lt;span style="color:#a40000">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>StateStore&lt;/code> 服务接口总共公开了 9 个方法：&lt;/p></description></item></channel></rss>