SpringCloud-分佈式配置中心(基於SpringBoot2.X)

1、配置中心的做用:能夠將多種應用的配置進行集中式的管理,將這些配置統一存放到git或svn裏面存儲;java

2、搭建SpringCloud-Config-Servergit

2.1如圖後續步驟勾選Config Server便可;github

建立好後的pom.xml文件以下:web

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>me.silentdoer</groupId>
    <artifactId>springcloud-config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-config-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</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>${spring-cloud.version}</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>
        </repository>
    </repositories>

</project>

  

2.2建立好後在Application上加上@EnableConfigServer註解,而且修改application.properties文件(貌似SpringCloud的標準文件是bootstrap.properties|yml,可是我用application.properties也能夠,若是同時存在聽說bootstrap.properties優先於application.properties)爲:spring

# config-server服務的端口
server.port=8888
# 服務名 spring.application.name=config-server #表示這個是config-server不須要去發現服務,它不依賴其餘服務 spring.cloud.config.discovery.enabled=false # 配置git倉庫地址 spring.cloud.config.server.git.uri=https://github.com/Silentdoer/config-server-repo.git # 配置倉庫的搜索目錄,必須配置(相對於根目錄),若是要填寫多種應用的配置能夠用英文逗號分隔 spring.cloud.config.server.git.search-paths=qq-api,wechat-api # 配置倉庫的分支 spring.cloud.config.label=master # 訪問git倉庫的用戶名,若是是私密倉庫須要填這兩個 #spring.cloud.config.server.git.username=xxxx # 訪問git倉庫的用戶密碼 #spring.cloud.config.server.git.password=xxxx

到這裏,SpringCloud的Config-Server就建立好了;apache

能夠啓動Config-Server,而後訪問http:localhost:8888/qq-prod.properties來看server是否啓動成功;(若是用的是properties格式的配置還須要添加額外的轉換器不然消費者看到的是中文亂碼【瀏覽器看到是亂碼能夠不用管】)bootstrap

我這邊訪問後是這樣子:api

注意,這裏的訪問方式有不少種:(這裏用的是第二種,第一種的label是能夠省略的)瀏覽器

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

3、接着咱們來建立Config-Server的消費服務,這裏好比就叫qq-api;(注意這是個普通的Webapp,只不過添加了Config-Client的功能)app

步驟和上面差很少,不過勾選時要勾選Ops裏的Actuator和Config Client和以及Web應用相關的東西(根據本身需求);

建立好後的pom.xml以下:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>me.silentdoer</groupId>
    <artifactId>springcloud-qq-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-qq-api</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>${spring-cloud.version}</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>
        </repository>
    </repositories>

</project>

  

接着將qq-api的application.properties內容改成:

#application.properties能夠認爲是application-default.properties
server.port=8080
# 和git裏的文件名對應
spring.application.name=qq-prod
# 遠程倉庫的分支
spring.cloud.config.label=master
# 和git裏的文件名對應
spring.cloud.config.profile=prod
# 指明配置服務中心的網址
spring.cloud.config.uri=http://localhost:8888/
# 暴露刷新配置的接口,而後調用curl -X POST http://localhost:8080/actuator/refresh便可刷新配置,可是相關的bean仍然須要@RefreshScope
# 不然雖然這個config-client程序裏的某個properties屬性刷新了,可是它的老的值已經賦值給了這個bean的對應的屬性,因此仍是用的老的bean值;
management.endpoints.web.exposure.include=health,info,refresh

而後再添加一個Controller用於測試:

@RestController
@RequestMapping("/api/backstage/test")
@RefreshScope
public class TestController {

    @Value("${country:瓜瓜國}")
    private String country;

    @GetMapping("test1")
    public String test1() {
        System.out.println(this.country);
        return this.country;
    }
}

這裏的@RefreshScope是爲了調用curl -X POST http://localhost:8080/actuator/refresh是可以將這個bean刷新從而應用最新的配置值;

調用該接口獲取的配置就是在Git倉庫裏的配置,若是commit更新了該key的value值,那麼調用refresh後這裏再調用接口獲取的會是最新的配置值;

4、健康監測

經過GET請求調用http://localhost:8080/actuator/health,而後能夠看到{"status":"UP"},這裏UP表示Config-Server是好的,若是是DOWN那麼表示沒法鏈接到Config-Server;

5、到此就結束了,SpringCloud的配置中心仍是比較簡單是實現的,後續還能夠結合MQ和消息總線來實現更新配置文件後自動通知應用來刷新配置;

6、一些有問題的地方:

1.通過測試,若是經過spring.cloud.config.name來讀取多配置(必需在指定的搜索目錄的根目錄【Git根目錄也默認會搜索】,網上的searchPaths的*不是指同時搜索子目錄,而是如xxx*表示xxx開頭的目錄,但內部的子目錄不會搜索),那麼qq-api是可以讀取到wechat-api裏的配置的,因此這裏的配置中心其實不是爲多種應用準備的?

相關文章
相關標籤/搜索