分離 gossip 組態


gossip 應用程式中有資料庫連線與郵件寄送的相關組態資訊,若這些資訊在其他應用程式或服務中也會用到,直接複製組態,或許已經造成管理上的困擾,來試著把組態分離出來。

組態伺服器的部份,在這邊直接使用〈Git 組態來源〉成果的 configsvr,因為其中的組態,正好就是 gossip 中需要的組態。

基本上,Spring Cloud 應該也可以與 WebFlux 結合運用,不過為了避免遇上問題時缺少管道或資料能解決,在這邊還是使用〈套用 Spring Data JDBC〉 的 gossip 成果來修改。

首先,必須加入 Spring Cloud Config 的相依,不過,除了加入 org.springframework.cloud:spring-cloud-starter-config 之外,在撰寫本文的這個時間點上,mavenCentral 中沒有 Spring Cloud 的相關相依程式庫,你必須增加 repositories 等額外資訊,不然會抓不到相關 JAR 檔案。例如:

...略

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/milestone" }
}

ext['springCloudVersion'] = 'Greenwich.RC2'

dependencies {
    ...略

    implementation('org.springframework.cloud:spring-cloud-starter-config')     
    ...略
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

組態伺服器上的會是服務之間共用的組態,個別應用程式需要的組態,還是放在個別應用程式中,例如,gossip 的 application.properties 中放了:

spring.thymeleaf.cache=false

這是為了頁面修改後,能馬上看到變化,當然實際應用程式上線後,不需要這個特性的話就可以拿掉;頁面路徑相關的組態,在這邊獨立出來成為 path.properties:

path.url.member=/member
path.url.index=/
path.view.register_success=register_success
path.view.register_form=register
path.view.verify=verify
path.view.forgot=forgot
path.view.reset_password_form=reset_password
path.view.reset_password_success=reset_success
path.view.index=index
path.view.user=user
path.view.member=member

為了能讀取 path.properties,要在 GossipApplication 上加註 @PropertySource

...略
@PropertySource("classpath:path.properties")
public class GossipApplication {
    ...略
}

然後,在 bootstrap.properties 中設定應用程式名稱、組態伺服器等資訊:

spring.application.name=gossip
spring.profiles.active=default
spring.cloud.config.uri=http://localhost:8888

接著啟動組態伺服器與 gossip 應用程式(以及 H2 資料庫),應該就可以運行程式了,你可以在 gossip 中找到以上的範例專案。