「 從0到1學習微服務SpringCloud 」06 統一配置中心Spring Cloud Config

系列文章(更新ing):

「 從0到1學習微服務SpringCloud 」01 一起來學呀! 「 從0到1學習微服務SpringCloud 」02 Eureka服務註冊與發現
「 從0到1學習微服務SpringCloud 」03 Eureka的自我保護機制
「 從0到1學習微服務SpringCloud 」04服務消費者Ribbon+RestTemplate
「 從0到1學習微服務SpringCloud 」05消費者Fegin

是什麼?

如名字一樣,就是用來統一管理配置文件的組件

爲什麼需要它?

1.不方便維護
多人同時對配置文件進行修改,衝突不斷,很難維護

2.配置內容安全和權限
主要是針對線上的配置來說,一般不對開發公開,只有運維有權限所以需要將配置文件隔離,不放到項目代碼裏

3.更新配置項目需要重啓
每次更新配置文件都需要重啓項目,很耗時。使用了配置中心後,即可實現配置實時更新

原理

1.配置文件存儲在遠端git(比如github,gitee等倉庫),config-server從遠端git拉取配置文件,並保存到本地git。
2.本地git和config-server的交互是雙向的,因爲當遠端git無法訪問時,會從本地git獲取配置文件
3.config-client(即各個微服務),從config-server拉取配置文件

實戰

RabbitMQ

項目需要配合使用RabbitMQ實現,需要先安裝RabbitMQ。
公衆號提供64位win安裝包(公衆號後臺回覆【rbmq】獲取)

安裝成功後,可打開RabbitMQ管理界面http://localhost:15672
默認賬號密碼:guest/guest

git倉庫創建配置文件

1.master分支新建client.yml

server:
  port: 8861
spring:
    application:
        name: client
label: master

2.master分支新建client-dev.yml

server:
  port: 8861
spring:
    application:
        name: client
profile: dev
config-server

1.新建一個配置中心服務端項目,同時勾選Config Server和Eureka Discovery,作爲配置中心服務端和Eureka客戶端

2.啓動類加註解@EnableEurekaClient@EnableConfigServer

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigApplication {

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

}

3.編寫configServer配置

server:
  port: 8961
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
    application:
        name: config
    cloud:
        config:
          server:
            git:
              uri: 配置中心git地址
              username: 賬號
              password: 密碼
              #本地git保存地址
              basedir: D:\Work\HqProject\config\basedir
#向外暴露接口 
#主要是爲了暴露/actuator/bus-refresh,刷新配置信息
management:
  endpoints:
    web:
      exposure:
        include: "*"

4.添加Spring cloud bus的maven(Spring cloud bus作爲消息總線,mq作爲消息中間件,傳遞信息)

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

5.啓動Config 項目,註冊到Eureka,啓動成功後會自動添加RabbitMQ隊列

6.訪問地址http://localhost:8961/client-dev.yml可以訪問到配置文件

config-client

繼續使用上節的項目eureka-client
1.添加Config-client和Spring cloud bus的maven

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

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

2.修改配置文件名字,改爲bootstrap.yml,這個配置文件默認優先級最高,如果不這樣做,項目會默認Config-Server的端口號爲localhost:8888(bootstrap意爲:引導啓動 只是剛好和前端框架bootstrap名字相同,它們沒有關係)

3.修改配置

server:
  port: 8861
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
        name: client
  cloud:
      #Config相關配置
      config:
          discovery:
              enabled: true
              #Config-server的服務名
              service-id: CONFIG
          #環境
          profile: dev
          #分支
          label: master

這裏的配置關乎拉取的規則,如下

1.{name}.yml
2.{name}-{profile}.yml
3.{label}/{name}-{profile}.yml

name:服務名
profile:環境
label:分支

1.若沒有聲明profile(環境),採用第1種規則,默認爲master分支
2.若沒有聲明label(分支)時,採用第2種規則,默認爲master分支

ps:當聲明瞭profile(環境)時,會同時獲取{name}.yml和{name}-{profile}.yml文件,然後合併。所以在{name}.yml文件中可寫一些通用的配置

4.新建兩個controller,測試從獲取到的配置

@RestController
//這個註解爲 刷新區域
//有這個註解,配置才能刷新
@RefreshScope
public class EnvController {
    @Value("${env}")
    private String env;

    @GetMapping("env")
    public String getEnv(){
        return env;
    }
}
@RestController
@RefreshScope
public class FenzhiController {
    @Value("${fenzhi}")
    private String fenzhi;

    @GetMapping("fenzhi")
    public String getFenzhi(){
        return fenzhi;
    }
}

5.啓動項目,註冊到Eureka,啓動成功後,控制檯會顯示成功拉取配置,並自動添加RabbitMQ隊列

6.分別訪問http://localhost:8861/envhttp://localhost:8861/fenzhi可獲取到相應配置

下面的效果就表名,聲明瞭profile(環境)時,會同時獲取{name}.yml和{name}-{profile}.yml文件

手動刷新配置

1.修改git倉庫中client-dev.yml的env改爲test

2.使用Postman發送Post請求http://localhost:8961/actuator/bus-refresh(ConfigServer的服務),告訴ConfigServer,配置更新了,拉取最新配置到ConfigServer,並通過bus發送給各個ConfigClient,讓它們拉取最新配置

3.訪問http://localhost:8861/env,env已修改爲了test,表明已獲取最新配置

自動刷新配置

1.安裝內網穿透軟件(使外網能訪問本機),我這裏使用的ngrok(官網:https://ngrok.com) 官方了提供免費的,可用於測試
註冊登錄後,會有操作說明,如下(我想,你應該能看懂)

2.我這直接跳到第4步,開啓ngrok,映射到本地8961端口(ConfigServer的端口)
到ngrok所在目錄,打開console控制檯,輸入ngrok http 8961

3.訪問ngrok所給的域名,已成功映射(有時可能會有網絡問題,多刷新幾次)

4.ConfigServer應用添加maven依賴,重啓應用

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

5.配置 WebHooks
5.1 Gitlab WebHooks 配置方法:

5.2 Github WebHooks 配置方法:

5.3 Gitee(碼雲) WebHooks 配置方法:

可點擊測試按鈕,測試一下鉤子是否能訪問。(如果失敗,可更換內網穿透軟件,比如natapp等)
配置成功後,會在每次 push 代碼後,都會給遠程 HTTP URL 發送一個 POST 請求。

上面的URL就需要使用到內網穿透獲取到的域名了,url爲內網穿透域名/monitor

6.修改git倉庫上client-dev.yml的env改爲test123,通過ConfigClient獲取env已更新爲test123,已實現自動刷新

好叻,搞定,下節繼續!

如果覺得不錯,分享給你的朋友!

THANDKS

  • End -

一個立志成大腿而每天努力奮鬥的年輕人

伴學習伴成長,成長之路你並不孤單!

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