Spring Boot/Spring Kafka SSL配置通过环境变量不可能实现

3

我有一个使用Spring Boot的应用程序,它与Kafka进行通信。

我通过注入环境变量来配置此应用程序在生产中的运行。

对于Kafka,我可以通过环境变量配置大多数内容 - 引导服务器、SSL信任库位置、SSL信任库密码、组ID、主题等:

SPRING_KAFKA_SSL_TRUSTSTORE-LOCATION: "file:/opt/app/jks/totally_real_file.jks"
SPRING_KAFKA_SSL_TRUSTSTORE-PASSWORD: "hunter2"

因为我可以使用环境变量配置SSL密钥库和密码,所以我认为我可以配置SSL协议和安全协议。例如:

SPRING_KAFKA_PROPERTIES_SECURITY_PROTOCOL: "SSL"
SPRING_KAFKA_PROPERTIES_SSL_PROTOCOL: "SSL"

但是,我的假设是错误的,因为当我设置它时,会出现一条消息:
The configuration 'SECURITY_PROTOCOL' was supplied but isn't a known config
The configuration 'SSL_PROTOCOL' was supplied but isn't a known config

更多的消息出现了!

Bootstrap broker one:9093 disconnected
Bootstrap broker two:9093 disconnected
Bootstrap broker more_than_two:9093 disconnected

这让我感到悲伤。我在互联网上搜索,找到了以下链接: Spring Kafka SSL在Spring Boot应用程序.yml中的设置 这并没有帮助太多,我想通过环境变量进行配置...
我找到了github问题链接(这变得更糟了): https://github.com/spring-projects/spring-integration-kafka/issues/157 这提供了部分线索。
yml文件:
spring.kafka.properties.security.protocol: "SSL"

应该可以工作,但实际上并没有

yml 文件内容:

spring:
  kafka:
    properties:
      security.protocol: "SSL"
      ssl.protocol: "SSL"

确实可以生效!但是无法使用环境变量来表示。

3个回答

3

对于启动项来说,考虑到Kafka属性的数量实在太多,不可能考虑到每一个。因此,只有部分被支持作为一级属性。

您可以使用系统属性代替环境变量。

编辑

您可以按照以下方式进行操作:

spring:
  kafka:
    properties:
      security.protocol: ${SEC_PROT}

通过系统属性,您是指在代码中设置的属性还是捆绑到构建工件中的设置文件?如果不是,请提供一个例子。我知道有太多的设置需要提供一流的属性,但这必须是最常见的设置之一。 - Cameron Sours
JVM参数 -Dfoo=bar - Gary Russell
Spring Boot 支持哪些环境变量来配置 Kafka?有没有概述? - user152468
Boot直接支持的属性(在IDE中使用内容辅助)在boot参考手册中有记录。所有其他任意属性都可以通过...properties属性(全局、管理员、消费者、生产者)进行设置。请查看我的答案更新,了解如何使用环境变量。 - Gary Russell
我感谢Gary的更新,我认为它指向了我在应用程序架构中真正存在的问题。我认为这个问题没有“解决办法”,就像所写的那样。 - Cameron Sours
我的编辑为问题提供了一个合理的“修复” - 你只是不能直接表达变量; 你需要在YAML中使用占位符。至少通过这种解决方案,你可以在测试和生产之间拥有不同的属性,这正是你想要的。没有办法让boot预测和/或跟上任意Kafka属性的添加。 - Gary Russell

1
我的解决方法是在我的application.yml文件中设置以下内容:
spring:
  kafka:
    properties:
      security.protocol: "SSL"
      ssl.protocol: "SSL"

我不喜欢这个解决方案,因为它要求我为生产环境和SIT环境构建不同的构件。(SIT Kafka没有启用SSL的事实是另一天和另一杯饮料的问题)

你可以在YAML中使用环境变量-请参见我的答案更新。 - Gary Russell
我认为 ssl.protocol 不应该属于 properties,而是应该在更高的级别上:spring.kafka.ssl.protocol - walv

0
可能是环境变量名称不正确。例如,不要使用以下内容: SPRING_KAFKA_PROPERTIES_SECURITY_PROTOCOL 我认为您想要使用生产者/消费者特定的名称,如: SPRING_KAFKA_PRODUCER_PROPERTIES_SECURITY_PROTOCOL 或者 SPRING_KAFKA_CONSUMER_PROPERTIES_SECURITY_PROTOCOL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接