天天看點

Spring Cloud配置中心Spring Cloud配置中心(Config)

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
           

其中:

  • {application}

    對應用戶端的應用名稱(spring.application.name)
  • {profile}

    對應用戶端的spring.profiles.active
  • {label}

    是可選的git标簽(預設為“master”)。

用戶端調用

以前配置檔案都是放在項目中,這使得我們在切換不同環境時非常麻煩,一些配置的敏感資訊也對開發人員暴露了。

使用統一的配置中心就可以避免這些,讓我們看一看用戶端是如何調用的。

首先,導入必須依賴的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