Spring Cloud配置中心(Config)
Spring Cloud是現在流行的分布式服務架構,它提供了很多有用的元件。比如:配置中心、Eureka服務發現、
消息總線、熔斷機制等。
配置中心在Spring Cloud的衆多元件中是比較基礎的,它提供了配置檔案的統一管理,可以很輕松的切換不通的環境。
它的具體結構如下:
- 存儲配置檔案的檔案系統(通常使用git)
- 配置中心服務端(從檔案系統擷取最新的配置檔案,為用戶端提供配置資訊)
- 配置用戶端(從配置中心擷取配置資訊)
Spring Cloud是建立在Spring Boot基礎上的,Spring Cloud離不開Spring Boot,是以我們的項目都是基于Spring Boot的。
配置檔案一般我們放在git上,也好做版本控制。接下來我們講一下配置中心的搭建。
配置中心搭建
首先,引入Spring Boot和Spring Cloud的依賴BOM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
這裡我們需要仔細看一下官方文檔,Spring Cloud的Finchley版本是基于Spring Boot2.0的,在Spring Boot1.5下
是不能工作的。而Edgware版本是基于1.5的,在2.0下不能正常工作。這點大家要注意,以免出現不必要的麻煩。
這裡我們采用Spring Cloud 的Edgware和Spring Boot的1.5版本。
然後倒入必須的依賴,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
最後編寫配置中心的啟動類,如下:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
@EnableConfigServer
标志着這個服務是一個配置中心服務,具體的資訊在
application.properties
檔案中配置:
#服務端口
server.port=9000
#配置檔案的git位址
spring.cloud.config.server.git.uri=https://github.com/liubo-tech/spring-cloud-properties
#配置檔案的臨時檔案目錄
spring.cloud.config.server.git.basedir=/d:/config-repo
服務端口和git位址大家都比較明白,第三個是配置臨時檔案的目錄。在配置中心被調用後,配置中心會從git
上拉取配置檔案,并在本地緩存,這個就是配置緩存的目錄,也可以不配置,使用系統預設的。
這樣配置中心就搭好了,也可以通過Nginx搭建叢集做的高可用。
通路配置檔案格式的如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中:
-
對應用戶端的應用名稱(spring.application.name){application}
-
對應用戶端的spring.profiles.active{profile}
-
是可選的git标簽(預設為“master”)。{label}
用戶端調用
以前配置檔案都是放在項目中,這使得我們在切換不同環境時非常麻煩,一些配置的敏感資訊也對開發人員暴露了。
使用統一的配置中心就可以避免這些,讓我們看一看用戶端是如何調用的。
首先,導入必須依賴的jar包,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
隻要Spring Cloud Config Client的jar在項目的classpath下,它就會在項目啟動時從配置中心擷取配置,通過
bootstrap配置檔案中的spring.cloud.config.uri屬性指定配置中心。
這使得用戶端的項目必須有一個bootstrap.yml或者bootstrap.properties檔案,否則用戶端是不會從配置中心加載配置檔案的。
我們建立bootstrap.properties,如下:
#配置中心位址
spring.cloud.config.uri=http://localhost:9000
指定配置中心的位址,上面的例子中,配置中心的端口我們指定9000。我們在application.properties檔案中配置應用的名稱:
spring.application.name=eg-config
我們應用叫作“eg-config”,項目啟動時會從配置中心加載eg-config的檔案。接下來我們做個例子,建立一個Bean,并從配置中心注入值
@Component
public class MyBean {
@Value("${my.name}")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
其中,name會從配置中心加載屬性my.name。啟動類如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
//擷取bean并列印name字段
MyBean bean = applicationContext.getBean(MyBean.class);
System.out.println(bean.getName());
}
}
啟動後,控制台列印的結果如下:
test
這樣配置中心就介紹完了,具體請參考項目示例:
https://github.com/liubo-tech/spring-cloud-config。