微服務(spring cloud配置中心)

Spring  cloud配置中心

用於集中配置數據管理,簡化微服務集羣環境下大量配置的更新工作。

1:理解bootstrap.yaml

   它會在application之前加載,如果和application有同名屬性,先啓動的會被覆蓋。

2:配置中心與我們的註冊中心,必須要有一個先啓動

3:spring的配置與環境化

  在spring3.0-》

<beans profile =”test”>
   <bean id=””>
</beans>

4:搭建一個配置中心

 Git svn 本地文件

讀取本地文件:理解 ${user.dir}的作用

 

1 在配置中心/resources下新建文件夾configs

創建三個文件 eurekaserver-dev.yml eurekaserver-prod.yml eurekaserver-prod.yml

2 引入jar

<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>
    <!--引入核心jar-->
    <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>

3 配置文件:

server:
  port: 5000
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          ##定義去拉取配置的地址
          uri: D:\\lesson-1\\config-server\\src\\main\\resources\\configs


management:
  endpoints:
    web:
      exposure:
        include: "*"

4 打開git初始化:

   git init

   git add .

   git commit -m “frist commit”

在啓動類上加上註解@EnableConfigServer

6 配置中心完成。

 

 客戶端連接:

1 新建文件---bootstrap.yml 配置如下: 

spring:
  application:
    name: eurekaserver
  cloud:
    config:
      name: eurekaserver
      uri : http://localhost:5000/
  profiles:
    active: dev
server:
  port: 10000

2 引入jar

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

在啓動類上加入@EnableDiscoveryClient

客戶端完成,啓動就可以訪問

 

根據在線地址向git去拉取配置:

1:配置文件如下:

##定義一個名字
spring:
  application:
      name: dnconfig
##配置服務器的文件地址git倉庫
  cloud:
      config:
          server:
              git:
                  #這是老師的git地址,可以自己去定義一個git地址去獲取
                  uri: https://github.com/yaojin156/tmp.git
                   #${user.dir}\src\main\resources\configs
​
                   #定義爲強制向git去拉取配置
                  force-pull: true
​
​
##定義當前這個端口
server:
  port: 9090
​
##定義env 和 health的開放 2.0中這個方式已經被取消
#management:
#   security:
#       enabled: true
​
​
##定義env 和health的開放 2.X版本應該這麼寫
​
management:
  endpoints:
      web:
          exposure:
              include: env

2:在計算機中新建三個配置文件(我的文件放在D:\download\tmp)

orderserver-prod.properties表示生產服務配置

orderserver-test.properties表示測試配置

orderserver-dev.properties表示開發配置

指定配置路徑爲:

cloud:
      config:
          server:
              git:
                  #這是老師的git地址,可以自己去定義一個git地址去獲取
                  uri: https://github.com/yaojin156/tmp.git

3:將自己的配置文件提交到在線的git中

git clone https://github.com/yaojin156/tmp.git
​
git add orderserver-*.properties
git commit -m "fritst commit"
git push

4:配置強制拉取git文件

cloud:
      config:
          server:
              git:
                  uri: https://github.com/yaojin156/tmp.git
                   #${user.dir}\src\main\resources\configs
​
                   #定義爲強制向git去拉取配置
                  force-pull: true

6:開始測試本地配置是否生效

http:localhost:9090/order/server-prod

 

搭建一個客戶端configclient

首先了解bootstarp配置

bootstarp配置文件會被先加載,一旦在我們的application中存在同名配置,會直接生效application中的配置,所以,我們可以認爲這個是一個覆蓋的過程。

 

瞭解一下springboot的Actuator監控

Actuator是springboot提供的一個監控方式。

Actuator是Spring Boot提供的對應用系統的自省和監控的集成功能,可以查看應用配置的詳細信息,例如自動化配置信息、創建的Spring beans以及一些環境屬性等。

Actuator的監控分兩類:原生端點和用戶自定義端點;自定義端點主要是指擴展性,用戶可以根據自己的實際應用,定義一些比較關心的指標,在運行期進行監控。

原聲端點分爲三類

  • 應用配置類:可以查看應用在運行期的靜態信息:例如自動配置信息、加載的springbean信息、yml文件配置信息、環境信息、請求映射信息;
  • 度量指標類:主要是運行期的動態信息,例如堆棧、請求連、一些健康指標、metrics信息等;
  • 操作控制類:主要是指shutdown,用戶可以發送一個請求將應用的監控功能關閉。

Actuator 提供了 13 個接口

我們只需要去了解我們今天要用的 env/{name} 根據名稱獲得特定的屬性值

1:配置bootstrap.yml

spring:
 cloud:
  config:
   #定義爲文件的名字
    name: order-server
     #去獲取到配置中心的地址
    uri: http://127.0.0.1:9090/
     #獲取到我們的profile名字
    profile: test

2:配置application.yml

##定義端口號和實例名稱
server:
 port: 8091
​
spring:
 application:
  name: spring-cloud-config-client
###定義開啓env
management:
 endpoints:
  web:
    exposure:
      include: env

3:啓動config-client 訪問

http://localhost:8091/actuator/env

可以看到我們的配置中心內部的配置信息

4:開始從配置中心獲取配置信息

   @Value("${name}")
   private String name;
​
   @Value("${id}")
   private String id;
​
   @RequestMapping("/hi")
   public String hi(){
       System.out.println("輸出的東西是:id:"+id+",name:"+name);
       return "id:"+id+",name:"+name;
  }

5: 如果服務端配置發生變化,客戶端如何發生變化?

我們的配置並不是一成不變的,如果我去移動了服務器,或者我需要新加入一個節點,那麼我就需要在配置項中把配置進行修改,那麼在這個時候,我們難道要去重啓我們的所有服務節點嗎?

在配置文件orderserver-test.properties中新加入配置

dn.name = nick
dn.age = 17

刷新服務,配置已經在配置中心可以顯示了。

 

但是,在我們的客戶端

並沒有相應的配置項存在,那麼問題就來了。

這時候我們該怎麼辦?

spring給我們提供了一個刷新的方式,可以通過刷新配置端點來解決當前的問題。

具體操作如下:修改客戶端配置application.yml

management:
 endpoints:
  web:
    exposure:
     #讓客戶端支持env和refresh方式
      include: env,refresh

通過postman向我們的配置服務器發送請求

http://localhost:8091/actuator/refresh 記得是POST方式

這樣我們就可以獲取到修改後最新的配置了。

正常情況下,我們修改了配置需要cloud的Bus也就是事件總線來對我們客戶端通知進行拉取,現在暫時不講。留在後面一起完成。這裏只需要知道這種方式可以去完成我們的目標即可。

 

理解refresh的作用

官方文檔地址:

https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.1.0.RC3/single/spring-cloud-config.html

在這段話中,官方文檔提到了一個叫做spring-cloud-config-monitor的東西,這一段話中主要的意思其實就是我們的配置中心的變更可以用spring cloud Bus來對我們進行通知。如果在配置服務器中添加Spring - Cloud配置監視器庫的依賴項並激活Spring雲總線,則啓用/monitor端點。

注意文檔中這一段:

When the webhook is activated, the Config Server sends a RefreshRemoteApplicationEvent targeted at the applications it thinks might have changed.

當webhook被激活時,配置服務器發送一個RefreshRemoteApplicationEvent,目標是它認爲可能已經更改的應用程序。

好,這一塊東西我們暫時不講,先寄存着,我們先了解一下refresh的原理

public synchronized Set<String> refresh() {
       //調用下面的刷新方法。
        Set<String> keys = this.refreshEnvironment();
       //清空RefreshScope緩存
    // RefreshScope用新的環境參數重新生成Bean
        this.scope.refreshAll();
        return keys;
}


public synchronized Set<String> refreshEnvironment() {
       //提取標準參數(SYSTEM,JNDI,SERVLET)之外所有參數變量
        Map<String,Object>before= this.extract(this.context.getEnvironment().getPropertySources());
      //把原來的Environment裏的參數放到一個新建的Spring Context容器下重新加載,完事之後關閉新容器
        this.addConfigFilesToEnvironment();
         
    //比較出變更項
        Set<String> keys = this.changes(before,
        this.extract(this.context.getEnvironment().getPropertySources())).keySet();//提取更新過的參數(排除標準參數)  
        //發送EnvironmentChangeEvent
        //發佈環境變更事件,接收:EnvironmentChangeListener/LoggingRebinder
        this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys));
        return keys;
    
}

 

 

 

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