springcloud學習-15 springcloud config【周陽springcloud2020學習筆記】

概念:
Spring Cloud Config項目是一個解決分佈式系統的配置管理方案。
它包含了Client和Server兩個部分,server提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client通過接口獲取數據、並依據此數據初始化自己的應用。

作用:
1.集中統一管理配置文件
2.不同環境不同配置,動態化的配置更新,分環境部署。
3.運行期間動態調整配置,不再需要在每個服務部署的機器上編寫配置文件,服務會向配置中心統一拉取配置自己的信息
4.當配置發生變動時,服務不需要重啓即可感知到配置的變化並應用新的配置
5.將配置信息以REST接口的形式暴露

與github整合配置:
由於SpringCloud Config默認使用Git來存儲配置文件(也有其它方式,比如支持svn和本地文件,但最推薦的還是Git,而且使用的是http/https訪問的形式)

1.在github上新建一個Repository:demo-springcloud-config
2.獲取新建倉庫地址:[email protected]:chenyolo/demo-springcloud-config.git
3.本地磁盤新建git倉庫並clone

mkdir demo2020-cloud-config
git clone [email protected]:chenyolo/demo-springcloud-config.git

在/d/iview_demo/demo2020-cloud-config目錄下

本地磁盤D:\iview_demo\demo2020-cloud-config\demo-springcloud-config下有三份.yml文件
(保存格式必須爲UTF-8)


碰到的問題

[email protected]: Permission denied (publickey).

執行

ssh-keygen -t rsa -C "[email protected]"  一直下一步即可
ssh -v [email protected]

出現

debug1: No more authentication methods to try.
[email protected]: Permission denied (publickey).

執行

       ssh-agent -s
       ssh-add ~/.ssh/id_rsa (我自己執行無效)

Identity added: …這是ssh key文件路徑的信息
打開你剛剛生成的id_rsa.pub,
(執行ssh -v [email protected]是可以看到默認目錄。 id_rsa.pub在C:\Users\Administrator.ssh底下)

將裏面的內容複製,進入你的github賬號,
在settings下,SSH and GPG keys下new SSH key,
然後將id_rsa.pub裏的內容複製到Key中,完成後Add SSH Key

驗證key

ssh -T [email protected]

提示:Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.
解決。


服務端:配置中心模塊cloudConfig Center

1.新建Module模塊:config-center3344

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">
    <parent>
        <artifactId>demo2020</artifactId>
        <groupId>cn.chen.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-center3344</artifactId>

    <dependencies>
        <!-- config-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--公共模塊-->
        <dependency>
            <groupId>cn.chen.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>

</project>

3.yml

server:
  port: 3344

spring:
  application:
    name: config-center
  cloud:
    config:
      server:
        git:
          #uri: [email protected]:chenyolo/demo-springcloud-config.git #github上面的倉庫名稱
          uri: https://github.com/chenyolo/demo-springcloud-config.git #github上面的倉庫名稱
          search-paths:
            - demo-springcloud-config
      label: master

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

注意:
yml中 uri: [email protected]:chenyolo/demo-springcloud-config.git
配置遠程倉庫訪問時會報錯

Cannot clone or checkout repository: [email protected]:chenyolo/demo-springcloud-config.git

修改成 https://github.com/chenyolo/demo-springcloud-config.git 即可

4.主啓動

@SpringBootApplication
@EnableConfigServer
public class ConfigCenterApplication3344 {

	public static void main(String[] args) {
		SpringApplication.run(ConfigCenterApplication3344.class, args);
	}
}

5.業務類:無

6.windows下修改hosts文件,增加映射

127.0.0.1 config-3344.com

7.測試通過Config微服務是否可以從Github上獲取配置內容
1)啓動7001
2)啓動3344
3)訪問:http://config-3344.com:3344/master/config-dev.yml
4)成功實現了用SpringCloud Config 通過GitHub獲取配置信息

8.配置讀取規則
1)/{label}/{application}-{profile}.yml(最推薦使用這種方式)
2)/{application}-{profile}.yml
3)/{application}-{profile}[/{label}]
總結:label爲分支(branch);name爲服務名;profiles爲環境(dev/test/prod等)


客戶端模塊

1.新建module: config-client3355

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">
    <parent>
        <artifactId>demo2020</artifactId>
        <groupId>cn.chen.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-client3355</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--公共模塊-->
        <dependency>
            <groupId>cn.chen.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>

</project>

3.yml:bootstrap.yml
bootstrap.yml:系統級。用來在程序引導時執行,應用於更加早期配置信息讀取,如可以使用來配置application.yml中使用到參數等
application.yml:用戶級。應用程序特有配置信息,可以用來配置後續各個模塊中需使用的公共參數等。
bootstrap.yml先於application.yml加載

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    config: # config客戶端配置
      label: master # 分支名稱
      name: config # 配置文件名稱
      profile: dev # 讀取後綴名稱
      # 上述三個:master分支上的config-dev.yml的配置文件
      uri: http://config-3344.com:3344 # 配置中心地址
      #uri: http://localhost:3344 # 配置中心地址

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

修改config-dev.yml配置並提交到GitHub中,比如加個變量age或者版本號version

4.主啓動

 @SpringBootApplication
 public class ConfigClientApplication3355 {

 	public static void main(String[] args) {
 		SpringApplication.run(ConfigClientApplication3355.class, args);
 	}
 }

5.業務類

 @RestController
 @RequestMapping("/configClient")
 public class ConfigClientController {

 	@Value("${config.info}")
 	private String configInfo;

 	@GetMapping("/info")
 	public String getConfigInfo(){
 		return configInfo;
 	}

 }

6.測試
啓動註冊中心7001
啓動配置中心3344
啓動客戶端3355
訪問:http://localhost:3355/configClient/info
成功實現了客戶端3355訪問SpringCloud Config3344通過GitHub獲取配置信息

7.問題:分佈式配置的動態刷新
1)修改GitHub上的配置文件內容:
config:
info: “master branch,springcloud-config/config-dev.yml version=222222”

2)刷新3344,發現ConfigServer配置中心立刻響應
3)刷新3355,發現ConfigServer客戶端沒有任何響應
4)3355沒有變化除非自己重啓或者重新加載

8.解決:Config客戶端之動態刷新
1)修改3355模塊

  • POM引入actuator監控

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  • 修改yml,暴露端口

    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
  • @RefreshScope業務類Controller修改

  • 需要運維人員發送Post請求刷新3355 (必須是post請求。打開命令行窗口執行一下命令)

    curl -X POST "http://localhost:3355/actuator/refresh"
    

2)繼續修改github配置文件,3344訪問,3355訪問,執行post刷新,完美解決了!

3)如果多個客戶端該怎麼解決?不可能每一個都去發送post請求刷新!(廣播???)
–> springcloud bus消息總線

springcloud學習系列目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章