[英]Properties of custom Spring Cloud Service Connector not published to cloud.services.*
我通过定义以下两个类创建了一个定制的Spring Cloud Service Connector:
@ServiceLabel("kafka")
public class KafkaServiceInfo extends BaseServiceInfo {
private static Logger logger = Logger.getLogger(KafkaServiceInfo.class.getName());
public static final String BROKERS = "brokers";
public static final String REGISTRY = "schemaregistry";
protected List<String> brokers;
protected String registry;
public KafkaServiceInfo(String id, List<String> brokers, String registry) {
super(id);
this.brokers = brokers;
this.registry = registry;
}
@ServiceProperty
public String getRegistry() {
return registry;
}
@ServiceProperty
public List<String> getBrokers() {
return brokers;
}
}
和这个类:
public class KafkaServiceInfoCreator extends CloudFoundryServiceInfoCreator<KafkaServiceInfo> {
private static Logger logger = Logger.getLogger(KafkaServiceInfoCreator.class.getName());
public static final String USER_PROVIDED_SERVICE_NAME = "kafka";
public KafkaServiceInfoCreator() {
super(new Tags(USER_PROVIDED_SERVICE_NAME), null);
}
public KafkaServiceInfo createServiceInfo(Map<String, Object> serviceData) {
String id = getId(serviceData);
Map<String, Object> credentials = getCredentials(serviceData);
List<String> brokers = (List<String>) credentials.get(KafkaServiceInfo.BROKERS);
String registry = (String) credentials.get(KafkaServiceInfo.REGISTRY);
logger.info("KafkaServiceInfo created for Cloud Foundry Service \"" + id + "\"");
logger.info("Kafka Brokers configured for Cloud Foundry Service: " + brokers.toString());
logger.info("Schema Registry configured for Cloud Foundry Service: " + registry);
return new KafkaServiceInfo(id, brokers, registry);
}
@Override
public boolean accept(Map<String, Object> serviceData) {
return getId(serviceData).contains(USER_PROVIDED_SERVICE_NAME);
}
}
在我的PCF实例上,我创建了一个用户提供的服务,该服务在VCAPS env变量中查找如下所示:
"user-provided": [
{
"credentials": {
"brokers": [
"<some-ip-here>:29092"
],
"schemaregistry": "http://<some-ip-here>:8081"
},
"label": "user-provided",
"name": "kafka",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
我还将服务定义文件添加到META-INF文件夹中。
SRC /主/资源/ META-INF /服务/ org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator
内容:
path.to.my.file.KafkaServiceInfoCreator
现在,我希望在cloud.services.kafka。*路径中看到使用@ServiceProperty注释其吸气剂的属性。 但是,它们不显示。 相反,我只有以下两个条目:
"cloud.services.kafka.id": "kafka",
"cloud.services.null.id": "kafka",
我想知道这里出了什么问题,也为什么我要在第二个条目之间插入“ null”。
有什么想法在这里可能出什么问题吗? 自从我获得了上面创建者类中定义的日志消息以来,似乎找到了这些类。
问候,拉斯
@ServiceProperty
批注期望提供有category
或name
属性。 这些值用于构建放置到cloud.services
映射中的密钥。 如果没有提供category
或name
属性,则@ServiceProperty
批注不会导致该属性出现在地图中。
典型的用法是@ServiceProperty(category="connection")
,其名称使用Bean命名规则默认为属性的名称。 就您而言,添加category="connection"
属性应导致
"cloud.services.kafka.id": "kafka", "cloud.services.kafka.connection.registry": "http://<some-ip-here>:8081", "cloud.services.kafka.connection.brokers": ["<some-ip-here>:29092"],
我不确定"cloud.services.null.id": "kafka"
条目来自何处。 让我知道将属性添加到@ServiceProperty
批注后是否仍然出现。
深入研究之后,我发现这里解释了“原因”。
Cloud Foundry Java构建包包括自动重配置库,该库本身包含org.springframework.cloud命名空间的副本。 此副本不考虑任何自定义ServiceInfo类。
An也是因为这种自动重新配置将cloud.services。*属性暴露给环境,所以我的个人属性也不会被提取和暴露。 因此,我将关闭此自动重新配置并手动配置所需的内容。
Spring cloud连接器文档在这里也具有误导性,因为cloud.service。*中的属性仅通过java自动重新配置添加到环境中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.