1. 程式人生 > >SpringCloud入門教程(三)配置管理

SpringCloud入門教程(三)配置管理

配置管理根據字面上理解,就是一些管理專案中使用到的一些配置檔案。以前開發單臺伺服器的時候,我們通過一個配置檔案就可以將平常用到的一些配置記錄下來,但是如果是搭建多臺叢集伺服器部署,當然也可以使用多個配置檔案,但是維護和同步就會比較麻煩。所以配置服務一般分兩種情況:

1.多臺伺服器叢集使用同一配置,比如:資料庫資訊

2.不同的伺服器叢集使用不同的配置,比如:開發、測試、生產環境使用的資料庫不一樣

Spring Cloud的解決方案是, 將這些配置檔案放到版本管理伺服器裡面,Spring Cloud預設配置使用GIT中。所有Web服務均從GIT中獲取這些配置檔案。由於GIT伺服器與具體Web伺服器之間不需要共享儲存, 只要網路可達就行,從而可以實現Web服務於配置資訊的存放位置的解耦。

Spring Cloud統一控制應用和GIT服務的互動,應用只需要按照Spring Cloud的規範配置GIT的URL即可。 使用GIT後,場景2和場景1的區別僅僅是,場景2中不同的client使用不同版本的配置檔案,但應用但訪問的檔案看起來是會是同一個。Spring Cloud的配置服務結構入下圖:

一、建立Maven工程ConfigServer(使用IDEA工具建立Maven工程)

(1)File--New--Probject--Maven

專案資訊填寫完成後點選Next,然後Fishing。

(2)pom檔案配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.springcloud.study</groupId>
    <artifactId>ConfigServer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>springcloud.config.server</name>
    <description>Demo Config Server</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!-- spring boot test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

(3)建立Config Server,它也是一個Spring Boot應用,@EnableConfigServer註解說明了一個Config Server。同樣我們使用@EnableEurekaClient將它註冊到服務中心。

(4)建立配置檔案application.yml

在resources下建立配置檔案application.yml,配置內容臺下:

Git:

uri:可以是任何程式碼管理工具的上的地址

searchPaths:專案路徑

碼雲專案截圖:

配置檔案內容如下:

(5)啟動ConfigServer,訪問http://localhost:8888/aa/xx, 可見如下響應。這個是輸出是並沒有包括具體配置檔案的內容, 這個響應說明,config server可以正常訪問我們配置在application.yml中的GIT服務。

這個URL是啥意思, 需要解釋一下。我們從輸出就可以看到 abc 就是application的名字,xyz是profile的名字, 注意這裡的abc, xyz均是隨便輸入的名字, 並不需要真實存在,config server這個REST介面返回的只是應用名為abc, profile名為xyz時,GIT配置環境的結構。

config server提供的REST介面,Spring Cloud官方文件提供了幾個可選URL可以是如下幾個:

  1. /{application}/{profile}[/{label}]
  2. /{application}-{profile}.yml
  3. /{label}/{application}-{profile}.yml
  4. /{application}-{profile}.properties
  5. /{label}/{application}-{profile}.properties

比如 第三個格式,如果我們在GIT版本庫中有一個配置檔案 SpringCloud/ConfigServer/config-server-dev.properties. 那麼訪問http://localhost:8888/config-server-dev.properties就可以顯示配置檔案內容。這個例子中, application的名字是"config-client"(也是下面我們即將建立的client), profile名字是dev, 檔案字尾是.properties。

二、建立ConfigClient工程

(1)File--New--Probject--Maven

專案資訊填寫完成後點選Next,然後Fishing。

(2)pom檔案配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.springcloud.stydu</groupId>
    <artifactId>ConfigClient</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Springcloud.config.client</name>
    <packaging>jar</packaging>
    <description>Demo Spring Config Client</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

(3)建立ConfigClientApplication

這個應用非常簡單,就是從遠端伺服器(碼雲)專案SpringCloud路徑下ConfigServer資料夾中獲取配置項hello的值,ConfigClient向ConfigServer提交REST請求後,ConfigServer將訪問GIT伺服器,並將取得的配置項hello的值返回給ConfigClient.

(4)建立applicaltion.yml檔案

這個配置定義了應用的名字是config-client(這就是將要用於組裝前面ConfigServer中題到的application), profile採用dev, GIT分支用master。url是ConfigServer的地址。那麼問題來了,我們似乎沒定義配置檔名, 那配置檔名是什麼呢? 這點又體現了約定優於配置的思路,這裡Spring Cloud約定, 應用的配置檔名以如下方式組成:{application}-{profile}.properties(或者{application}-{profile}.yml)。比如我們這個應用的配置檔案就是config-client-dev.properties. 所以只需要在GIT的中建立配置檔案SpringCloud/ConfigServer/config-client-dev.properties就可以了, 內容如下:

(5)啟動ConfigClient應用, 訪問http://locahost/8881/hello, 可以看到,應用本身並沒有直接配置hello的具體內容,也沒指定具體配置檔案,所有這些都由Spring Cloud框架提交給ConfigServer了