簡體   English   中英

自定義Spring Cloud Service連接器的屬性未發布到cloud.services。*

[英]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批注期望提供有categoryname屬性。 這些值用於構建放置到cloud.services映射中的密鑰。 如果沒有提供categoryname屬性,則@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM