1. 程式人生 > >Spring Cloud_31_SpringCloud配置中心/例子

Spring Cloud_31_SpringCloud配置中心/例子

SpringCloud配置中心/例子

  • Config的作用:對叢集配置的統一管理
  • Config的作用:對叢集配置的統一管理
  • 客戶端連線配置伺服器的時候預設連線8888埠

1、建立Config伺服器

  • 建立Config伺服器之前,需要先建立SVN伺服器,上一章節已經建立完成
  • 現在來建立Config伺服器

1.1、引入依賴

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId
>
<artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- Config-Server -->
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- SVN-Kit --> <dependency> <groupId>org.tmatesoft.svnkit</groupId> <artifactId>svnkit</artifactId
>
<version>1.9.0</version> </dependency>

1.2、配置SVN倉庫applicaiton.yml

  • SpringCloud預設使用Git倉庫,如果SVN和GIT倉庫都沒有配置,則會報錯

  • 配置profile
    1. git:預設值,表示去Git倉庫讀取配置檔案
    2. subversion:表示去SVN倉庫讀取配置檔案
    3. native:將會去本地的檔案系統中讀取配置檔案
    4. vault:去Vault中讀取配置檔案,Vault是一款資源控制工具,可對資源實現安全訪問
server:
  port: 8888
##為了方便測試,關閉安全管理機制
management:
  security:
    enabled: false
##配置SVN倉庫
spring:
  profiles:
    active: subversion
  cloud:
    config:
      server:
        svn:
          uri: https://USER-20170523PW/svn/my-aitemi/
          username: aitemi
          password: aitemi
        ##預設到SVN根目錄下的trunk目錄中讀取配置檔案
        default-label: aitemi

1.3、啟動類

package com.atm.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer//開啟伺服器
public class ConfigServerApp {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApp.class, args);
    }
}
  • SVN目錄中建立檔案,注意建立的檔案命名規則,本人在測試時使用first.yml無法訪問,命名為first-test.yml則可以訪問

2、建立Config客戶端

2.1、引入依賴

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.4.RELEASE</version>
</dependency>
<!-- 檢視叢集例項端點 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>1.5.4.RELEASE</version>
</dependency>

2.2、配置檔案bootstrap.yml

spring:
  ## 配置了spring.application.name,和cloud.config.profile,則讀取atm-config-client-dev.yml
  application:
    name: atm-config-client
  cloud:
    config:
      url: http://localhost:8888
      ## 讀取的檔案是 atm-config-client-dev.yml
      profile: dev
spring:
  cloud:
    config:
      url: http://localhost:8888
      ## 沒有配置spring.applicaiton.name,但是配置了spring.cloud.config.name,則讀取檔案不變,依舊是atm-config-client-dev.yml
      profile: dev
      name: atm-config-client
spring:
  cloud:
    config:
      url: http://localhost:8888
      ## 兩者均沒有配置,只配置了spring.cloud.profile,預設讀取application-dev.yml
      profile: dev

2.3、ReadConfigController

package com.atm.cloud;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 讀取遠端的配置
 */
@RestController
public class ReadConfigController {

    @Autowired
    private Environment environment;

    @GetMapping("/read")
    public String readConfig() {
        return environment.getProperty("test.user.name");
    }
}

3、目錄配置讀取總結

  • 讀取總結(伺服器配置目錄,客戶端配置讀取哪份檔案)

    1. 伺服器:spring.cloud.config.server.default-label=aitemi,到SVN下的指定目錄中讀取
    2. 客戶端:spring.application.name=atm-config-client,讀取的配置檔案的名稱,
    3. 客戶端:spring.cloud.config.profile=dev
  • 讀取多分配置檔案:spring.cloud.config.profile=hystrix,zuul

  • 客戶端配置目錄:spring.cloud.config.label,可以配置客戶端讀取配置檔案的目錄,會覆蓋伺服器所配置的default-label
spring:
  cloud:
    config:
      label: aitemi2

4、重新整理配置

  • 訪問/refresh端點
## 為了方便測試,關閉安全管理
management:
  security:
    enabled: false
  • 模擬POST請求
package com.atm.cloud;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class RefreshClientMain {

    public static void main(String[] args) throws Exception {
        CloseableHttpClient client = HttpClients.createDefault();
        // 傳送post請求
        HttpPost post = new HttpPost("http://localhost:8080/refresh");
        HttpResponse response = client.execute(post);
        System.out.println(EntityUtils.toString(response.getEntity()));
    }
}

5、重新整理Bean

  • 在實際應用中,在重新整理配置的情況下,還需要重新整理對應的bean
package com.atm.cloud;

import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class MyConfig {

    @Bean
    @RefreshScope
    public Person person(Environment env) {
        // 讀取名字建立Person
        String name = env.getProperty("test.user.name");
        // 輸出Person名字
        System.out.println("初始化Person bean:" + name);
        // 建立一個Bean
        Person p = new Person();
        p.setName(name);
        return p;
    }
}
@Autowired
private Person person;

@GetMapping("/personName")
public String readPersonName() {
    return person.getName();
}