ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Apache Kafka Configuration Providers 完全指南:从外部源安全加载配置与凭据

Apache Kafka Configuration Providers 完全指南:从外部源安全加载配置与凭据 Apache Kafka Configuration Providers 完全指南从外部源安全加载配置与凭据【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka配置提供者Configuration Providers是 Apache Kafka 提供的一种配置扩展机制它允许 Kafka 客户端、Broker、Kafka Connect 等组件从外部源如文件、目录、环境变量乃至自定义的密钥管理系统加载配置数据尤其适用于密码、API Key 等敏感信息。本文以 docs/configuration/configuration-providers.md 为骨架结合本仓库clients模块的源码实现与测试用例系统讲解三个内置提供者FileConfigProvider、DirectoryConfigProvider、EnvVarConfigProvider的配置方式、占位符语法、访问限制参数以及如何编写自定义ConfigProvider并给出 Kafka Connect 场景下可复制的完整实战示例。读完本文你将能在自己的 Kafka/Connect 部署中用一行占位符代替硬编码凭据并理解其底层工作原理。什么是 Configuration ProvidersConfiguration Providers 的作用是把配置数据的获取过程从静态文件里解放出来。在传统方式下Broker、Producer、Consumer 或 Connect Worker 的配置文件把密码、证书路径、密钥等直接写在 properties 文件中一旦泄露或需要轮换就要修改并重新分发配置文件。而配置提供者允许你在配置值的位置写一个占位符placeholder由运行时从外部源本地文件、目录、环境变量、自定义系统读取真实值并替换。根据 clients/src/main/java/org/apache/kafka/common/config/provider/ConfigProvider.java该接口继承自Configurable和Closeable提供两个核心读取方法ConfigData get(String path)读取指定路径下的全部数据ConfigData get(String path, SetString keys)只读取指定 key 的数据供占位符按需取值时使用。返回值ConfigData见 clients/src/main/java/org/apache/kafka/common/config/ConfigData.java封装了一个MapString, String数据表和一个可选的ttl毫秒级生存期用于支持数据的缓存刷新。此外接口还定义了可选的订阅能力subscribe、unsubscribe、unsubscribeAll默认实现抛出UnsupportedOperationException使 Provider 能够在数据变化时通过ConfigChangeCallback通知配置变更。接口注释还明确指出实现必须支持并发安全调用并且 Kafka Connect 会通过 Java 的ServiceLoader机制发现自定义实现。你可以在当前仓库中选择以下方案使用自定义 Provider创建一个实现ConfigProvider接口的类打包成 JAR 放入 classpath使用内置 Provider均位于clients模块的org.apache.kafka.common.config.provider包FileConfigProvider从单个 properties 文件读取DirectoryConfigProvider从一个目录下的多个文件读取文件名即 key文件内容即 valueEnvVarConfigProvider从环境变量读取。三个内置 Provider 的完整实现分别位于 FileConfigProvider.java、DirectoryConfigProvider.java 和 EnvVarConfigProvider.java对应的单元测试在 FileConfigProviderTest.java、DirectoryConfigProviderTest.java、EnvVarConfigProviderTest.java。使用 Configuration Providers声明 Provider 与传递参数要使用配置提供者在配置中通过config.providers属性声明。该属性在 clients/src/main/java/org/apache/kafka/common/config/AbstractConfig.java 中定义其官方文档描述为实现了ConfigProvider接口的类的逗号分隔别名列表用于从外部源加载配置数据如密码、API Key 和其他凭据。config.providers的值是逗号分隔的别名列表每个别名再通过config.providers.alias.class指定对应的全限定类名config.providersprovider1,provider2 config.providers.provider1.classcom.example.Provider1 config.providers.provider2.classcom.example.Provider2每个 Provider 还可以有自己的参数集通过如下格式传入AbstractConfig中对应的常量是CONFIG_PROVIDERS_PARAM .param.config.providers.provider_alias.param.namevalueConfigProvider接口是所有配置提供者的基类该接口属于InterfaceAudience.Public公共 APIConfigProvider.java。你可以自行实现该接口从任何外部源获取配置数据将实现打包为 JAR 文件、加入 classpath然后在配置中引用该类的全限定名即可。自定义 Provider 配置示例config.providerscustomProvider config.providers.customProvider.classcom.example.customProvider config.providers.customProvider.param.param1value1 config.providers.customProvider.param.param2value2占位符解析的底层流程从源码结构看配置解析发生在AbstractConfig的构造过程中AbstractConfig.java 的注释明确说明构造器会先实例化配置中声明的 ConfigProviders然后在原配置值里查找所有变量占位符用对应 Provider 解析变量最后再解析和校验配置项。真正执行替换的是ConfigTransformer见 [clients/src/main/java/org/apache/kafka/common/config/ConfigTransformer.java]其返回结果ConfigTransformerResult记录了解析后的配置值以及可能变更的 key。这意味着占位符替换发生在配置解析阶段替换后的值再参与类型转换与校验。DirectoryConfigProvider从目录中按文件加载配置DirectoryConfigProvider从指定目录下的文件中获取配置数据。每个文件名代表一个 key文件内容就是对应的 value源码注释见 DirectoryConfigProvider.java。它适合把配置按文件拆分、分门别类组织也常用于 Kubernetes 等场景下挂载的 ConfigMap/Secret 目录。其实现细节值得注意默认的get(path)会通过Files.list(dir)列出目录下所有普通文件regular file忽略子目录等其他类型get(path, keys)版本则只筛选出文件名命中了请求 key 的普通文件读取文件内容使用Files.readString(path)默认 UTF-8如果 path 不是目录会记录警告日志并返回空数据如果目录无法列出则抛出ConfigException。用 allowed.paths 限制访问范围为避免 Provider 被用来读取任意目录可用allowed.paths参数限制其可访问的路径。该参数接受一个逗号分隔的路径列表若不设置则所有路径都允许。路径校验由AllowedPaths.parseUntrustedPath完成相关测试见 [clients/src/test/java/org/apache/kafka/common/config/provider/AllowedPathsTest.java]未授权路径会被拒绝并记录警告日志。DirectoryConfigProvider 配置示例config.providersdirProvider config.providers.dirProvider.classorg.apache.kafka.common.config.provider.DirectoryConfigProvider config.providers.dirProvider.param.allowed.paths/path/to/dir1,/path/to/dir2占位符语法引用DirectoryConfigProvider提供的值时使用如下占位符语法${dirProvider:path_to_file:file_name}第一个冒号后是目录路径第二个冒号后是文件名即 key。运行时 Provider 会读取该文件并把文件内容作为配置值返回。EnvVarConfigProvider从环境变量加载配置EnvVarConfigProvider直接从进程的环境变量中获取配置数据无需任何必填参数。源码实现EnvVarConfigProvider.java在构造时通过System.getenv()捕获全部环境变量值得注意的是它不支持 path 参数——如果你传入非空的 path会抛出ConfigExceptionPath is not supported for EnvVarConfigProvider。它非常适合容器化部署例如把 Secret 映射为环境变量再加载证书或 JAAS 配置。典型用法之一是在 Kafka Connect 中配合 JAAS 文件生成器将KAFKA_OPTS之类的环境变量注入配置。用 allowlist.pattern 限制可见变量默认情况下 Provider 会暴露所有环境变量默认允许模式为.*对应源码常量ALLOWLIST_PATTERN_CONFIG allowlist.pattern。为了安全建议用allowlist.pattern参数指定一个正则表达式只有变量名匹配该正则的环境变量才会被 Provider 使用config.providersenvVarProvider config.providers.envVarProvider.classorg.apache.kafka.common.config.provider.EnvVarConfigProvider config.providers.envVarProvider.param.allowlist.pattern^MY_ENVAR1_.*占位符语法引用环境变量时path 部分留空直接写变量名${envVarProvider:enVar_name}例如${envVarProvider:DB_PASSWORD}会在运行时被替换为名为DB_PASSWORD的环境变量的值前提是其名称匹配 allowlist 正则。FileConfigProvider从单个 properties 文件加载配置FileConfigProvider从单个 properties 文件中读取配置数据适合加载挂载的文件例如 Kubernetes 挂载的 Secret 卷。源码FileConfigProvider.java使用java.util.Properties.load()解析文件并以 UTF-8 编码打开读取器类注释明确提示所有属性和值都以明文存储。它同样支持allowed.paths参数来限制可访问的文件路径逗号分隔列表不设置则全部允许config.providersfileProvider config.providers.fileProvider.classorg.apache.kafka.common.config.provider.FileConfigProvider config.providers.fileProvider.param.allowed.paths/path/to/config1,/path/to/config2占位符语法引用 properties 文件中的某个属性时语法为${fileProvider:path_and_filename:property}第一个冒号后是带文件名的完整路径第二个冒号后是 properties 文件中的属性名。例如${fileProvider:/etc/kafka/creds.properties:dbPassword}。实战示例用 FileConfigProvider 为 Kafka Connect 提供数据库凭据下面完整复现原文档中的端到端示例使用文件配置提供者为 Kafka Connect 的一个 Connector 提供数据库认证凭据避免把密码写死在 Connector 配置里。第 1 步创建凭据文件创建connector-credentials.properties写入数据库凭据dbUsernamemy-username dbPasswordmy-password第 2 步在 Kafka Connect 配置中声明 FileConfigProvider在 Connect Worker 配置文件如 config/connect-distributed.properties 或 config/connect-standalone.properties中声明提供者。注意此例未设置allowed.paths即允许访问所有路径生产环境建议按上文收紧config.providersfileProvider config.providers.fileProvider.classorg.apache.kafka.common.config.provider.FileConfigProvider第 3 步在 Connector 配置中引用文件属性在 Connector 配置里用占位符引用凭据文件中的属性database.user${fileProvider:/path/to/connector-credentials.properties:dbUsername} database.password${fileProvider:/path/to/connector-credentials.properties:dbPassword}第 4 步运行时替换运行时Connect Worker 通过ConfigTransformer调用FileConfigProvider读取并提取 properties 文件中的值替换占位符后完成配置解析。这样真实凭据只存在于受限权限的凭据文件中Connector 配置可以安全地提交到版本库或通过 REST API 查看。编写自定义 ConfigProvider当内置 Provider 无法满足需求例如需要从 Vault、云 KMS、远程配置中心读取时可以实现ConfigProvider接口。仓库测试代码中提供了可参考的示例实现例如 [clients/src/test/java/org/apache/kafka/common/config/provider/MockVaultConfigProvider.java]模拟从 Vault 读取和 [clients/src/testFixtures/java/org/apache/kafka/common/config/provider/MockFileConfigProvider.java]测试夹具中的文件提供者可作为编写自定义实现时的方法签名与行为参考。自定义实现需注意接口契约详见 ConfigProvider.java 的 Javadoc实现configure(MapString, ? configs)来自Configurable读取config.providers.alias.param.*传入的自定义参数实现get(String path)与get(String path, SetString keys)返回ConfigData实现close()释放资源保证方法支持并发调用若要让 Kafka Connect 通过ServiceLoader自动发现应在 JAR 的META-INF/services/org.apache.kafka.common.config.provider.ConfigProvider文件中登记实现类全限定名subscribe/unsubscribe/unsubscribeAll是可选操作默认实现抛出UnsupportedOperationException如不需要订阅配置变更可不覆盖。完成后将实现打包为 JAR、加入 Kafka/Connect 的 classpath即可在配置中通过config.providers.alias.class引用用法与内置 Provider 完全一致。适用场景与安全建议敏感信息外置密码、API Key、证书口令不应硬编码在 properties 中应通过 Provider 从受控源加载FileConfigProvider源码注释明确说明其属性以明文存储因此凭据文件本身仍需通过文件系统权限如 600保护或优先选择环境变量/Secret 挂载等方案。容器化部署EnvVarConfigProvider天然适配容器可将 Secret 映射为环境变量后引用DirectoryConfigProvider适配 ConfigMap/Secret 以文件形式挂载的场景。最小权限原则为FileConfigProvider和DirectoryConfigProvider配置allowed.paths为EnvVarConfigProvider配置allowlist.pattern把 Provider 的可见范围收敛到最小集降低配置泄露与任意文件读取的风险。适用版本与前提以上配置属性、占位符语法与内置类均以当前仓库代码为准适用于包含这些实现的本版本 Kafkaconfig.providers机制在AbstractConfig层实现因此凡是基于该配置基类的组件Broker、客户端、Connect Worker 等都可以使用。【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表