我已经使用具有3个组件的Spring Cloud Stream(SCS)实现了一个应用程序:1个源@EnableBinding(Source.class),1个@EnableBinding(Processor.class)处理器和1个@EnableBinding(Sink.class)接收器我使用Apache Kafka绑定器进行通信。
作为这些组件配置的一部分,我使用了Spring Cloud Stream中的几个属性,例如要使用的主题,分区数,序列化程序,最大轮询等。:
spring:
application:
name: myapp
cloud:
stream:
bindings:
output:
destination: topic1
producer:
partitionCount: 5
partitionKeyExpression: headers.kafka_messageKey
kafka:
binder:
brokers: 10.138.128.62
defaultBrokerPort: 9092
zkNodes: 10.138.128.62
defaultZkPort: 2181
requiredAcks: -1
replicationFactor: 1
autoCreateTopics: true
autoAddPartitions: true
bindings:
output:
producer:
configuration:
key.serializer: org.apache.kafka.common.serialization.StringSerializer
value.serializer: org.apache.kafka.common.serialization.ByteArraySerializer
所有这些属性都在外部文件“application.yml”中定义。我在执行组件时指出:
java -jar mycomponent.jar --spring.config.location=/conf/application.yml
目前,我手动编排了这三个组件"但是我想使用Spring Cloud Data Flow(SCDF)来创建一个流,并且能够更好地运行它们。
根据SCDF文档,任何SCS应用程序都可以直接用作要在流中定义的应用程序。除此之外,可以通过外部属性文件提供应用程序的属性。但是,我正在提供我的应用程序。属性文件,它不起作用:
stream deploy --name mystream --definition "mysource | myprocessor | mysink' --deploy --propertiesFile /conf/application.yml
经过一些研究,我意识到文档说明任何应用程序的任何属性都必须以这种格式传递:
app.<app-name>.<property-name>=<value>
所以我有一些问题:
提前感谢您的支持。
答案 0 :(得分:1)
我是否必须添加“app”。到我现有的所有房产?
是。你可以这样:
app:
app-name:
spring:
cloud:
...
有什么办法可以在SCDF中为我的应用程序提供类似“--spring.config.location”的内容吗?
对于部署的流,只有--propertiesFile
可以在运行时提供属性。但是,您仍然可以使用特定于应用程序的属性,如:
stream deploy mystream --properties "app.*.spring.config.location=configFile"
或者,每个具有app.app-name
前缀的应用程序的不同configFiles。
这样,部署的所有应用都将获得这些属性。
如果我已经在application.yml中提供了“spring.application.name”属性,那么它如何影响SCDF,因为我在定义流时也提供了应用程序名称?
出于某种原因,您是否在申请中明确使用spring.application.name
?我想如果你改变了spring.application.name,那么在metrics collector中会有一些影响。
如果我已在application.yml中提供“server.port”属性,它对SCDF有何影响? SCDF会选择它作为用于应用程序的端口,还是会忽略它?
它的工作方式与Spring Boot属性源优先级相同。应用程序的application.yml中的server.port
将优先于可通过流定义/部署属性设置的其他属性源。