簡體   English   中英

Kotlin @ConstructorBinding @ConfigurationProperties class 用於多個實例

[英]Kotlin @ConstructorBinding @ConfigurationProperties class for multiple instances

我遇到了一個問題,我找不到任何好的解決方案。 一些背景:我們使用幾個微服務,其中大多數使用 rest 客戶端。 我們發現他們中的很多人會使用類似的配置來解決類似的問題(即彈性)。 自然,我們希望將常見的、大量重復的、非業務代碼提取到庫中。 但事情是這樣的:如何在庫中提取@ConstructorBinding @ConfigurationProperties數據 class (特別是如果在使用該庫的代碼庫中可能有這些類的多個實例)?

這是一些示例代碼:

@ConstructorBinding
@ConfigurationProperties(prefix = "rest.client")
data class MyDuplicatedRestClientProperties(
    val host: String,
    val someOtherField: Int,
    val someFieldWithDefaultValue: String = "default value"
)

我想在一個項目中導入它來配置 2 個不同的 REST 客戶端。 我試過了:

  • 創建一個抽象的 class 我的ClientProperties將擴展。 可悲的是,我需要公開父 class 的所有字段,這對復制沒有幫助:
abstract class MyAbstractClient(
    val host: String,
    val someOtherField: Int,
    val someFieldWithDefaultValue: String = "default value"
)
@ConstructorBinding
@ConfigurationProperties(prefix = "rest.client")
class MyImplematationClient(
    val host: String,
    val someOtherField: Int,
    val someFieldWithDefaultValue: String = "default value"
): MyAbstractClient(
    host,
    someOtherField,
    someFieldWithDefaultValue
)
  • 使用@ConfigurationProperties將屬性實例化為@Bean方法,但這也不能很好地工作,因為它迫使我將帶有@Value的字段放在@Configuration class 中:
@Configuration
class MyConfigurationClass {

    @Value("${my.client.host}")
    lateinit var host: String

    @Value("${my.client.someOtherField}")
    lateinit var someOtherField: Int

    @Value("${my.client.someFieldWithDefaultValue:default value}")
    lateinit var someFieldWithDefaultValue: String

    @Bean
    @ConfigurationProperties
    fun myClient() = MyDuplicatedRestClientProperties(
        host,
        someOtherField,
        someFieldWithDefaultValue
    )

}

根據我的經驗,你走錯了路。 為什么?

  1. 允許在微服務中復制。 代碼不是太大,它是解耦的,可以很容易地改變。
  2. 從分布式系統理論來看,在多個組件之間共享類是一件壞事。 為什么? 因為這樣做會通過這些類耦合組件。
  3. 更好的方法是將所有集成封裝到特定庫中,例如 REST 客戶端。 例如,可以通過 service-a-client.jar 訪問服務 A,其中將包含調用服務 A 所需的配置和集成,並將公開一個或多個可用作Spring Beans的接口.
  4. 將配置放入庫中沒有任何優勢,配置與業務無關,它們在某種程度上是合成對象,在架構中沒有任何價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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