Spring Cloud(二):Spring Cloud Config

joytoy發表於2021-09-09

因為涉及到多個子工程,這種情況比較適合gradle擔當構建工具。
配置build.gradle

buildscript {
   
    ext {
        springBootVersion = '2.0.3.RELEASE'
    }
    repositories {
          mavenLocal()
          maven {url ''}
          mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}//這個屬性gradle 用來配置這個專案下所有子專案共同屬性,根專案沒有此屬性subprojects{
    apply plugin: "java"
    apply plugin: "eclipse"
    apply plugin: "io.spring.dependency-management"
    apply plugin: "org.springframework.boot"
    
    repositories {
     mavenLocal()
     maven {url ''}
     mavenCentral()
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:Finchley.RELEASE"
        }
    }
    
    dependencies {
    testImplementation 'junit:junit:4.12'
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-starter-actuator")   // runtime('org.springframework.boot:spring-boot-devtools')
    testCompile('org.springframework.boot:spring-boot-starter-test')
   }
     
}     //下面子專案配置
   //引入spring cloud config 依賴
   project(":config"){
     dependencies{
       compile('org.springframework.cloud:spring-cloud-starter-config')
       compile('org.springframework.cloud:spring-cloud-config-server')
     }
   }

setting.gradle 建立子工程

rootProject.name = 'cloud'include  'config'

然後在在根專案建立子專案目錄cloud 以及類路徑目錄 mkdir p src/main/{java,resources},執行gradle build,spring cloud config入門工程就算構建完成了。

建立本地檔案的spring cloud 配置伺服器

application.yml檔案

server:
  port: 85spring:
  profiles:
    active: native
  cloud:
    config:
      server:        native:
          search-locations:
          - file:///H:/springconfig/

用過spring boot同學,差不多都知道配置什麼意思,我就不具體去說明了。我想說明下spring cloud config 上配置資訊 ,spring .profiles.active:natvie : 表示使用本地檔案儲存應用程式配置資訊。spring.config.server.native.search-location 表示應用程式資料所在的檔案路徑,這個配置是一個陣列,用-表示多個路徑
建立spring cloud config引導類

@SpringBootApplication@EnableConfigServer //成為spring cloud config serverpublic class ConfigCloudApplication {    public static void main(String[] args) {
        SpringApplication.run(ConfigCloudApplication.class, args);
    }
}

在配置檔案路徑下建立多個yml檔案

圖片描述

image.png


啟動專案,使用瀏覽器訪問 ,將會看到config.yml配置內容輸出

圖片描述

config.yml


如果想檢視application-dev.yml配置內容,可以訪問http://localhost:85/application/dev

圖片描述

application-dev.yml


應用程式配置檔案的命名約定“應用程式名-環境名稱.yml” 用圖3更加直觀表示

圖片描述

圖3.png


不單單是這些命名規則,實際上支援的很豐富的


[/{name}-{profiles}.yml || /{name}-{profiles}.yaml][/{name}/{profiles:.*[^-].*}][/{label}/{name}-{profiles}.yml || /{label}/{name}-{profiles}.yaml][/{name}/{profiles}/{label:.*}][/{name}-{profiles}.json][/{label}/{name}-{profiles}.properties][/{label}/{name}-{profiles}.json][/{name}/{profile}/**][/{name}/{profile}/{label}/**][/{name}/{profile}/{label}/**]
  • name 表示 應用名

  • profiles 表示環境名稱

  • label 表示分支 一般都是連線git 使用

  • 支援各種各樣的檔案字尾 .yml、yaml、json、properties等等。

Spring Cloud Config與客戶端整合

為了更加直觀的,引入圖4表示,專案的配置檔案都從Spring Cloud  Config中,使用http://{hostname}/檔名/環境名稱 獲取到配置檔案,Config Server 根據url找到響應的檔案,將資料來源返回給config client。


圖片描述

圖4.jpg

建立config client

文字很難直白清楚,直接上寫程式碼最直觀了。一個小demo,建立一個spring data jpa的工程,資料來源從Spring Cloud Config獲取,向外暴露一個介面,根據id查詢資料,我們呼叫這個介面就知道資料有沒有載入成功了。
引入依賴

project(":config-client"){
     dependencies{
       compile("org.springframework.cloud:spring-cloud-config-client")  
       compile("org.springframework.boot:spring-boot-starter-data-jpa")
       compile("mysql:mysql-connector-java:5.1.46")
     }
   }

建立實體

@Entity@Table(name = "user")public class User {    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    private int id;    
    private String name;    
    private String email;

建立Repository介面查詢資料介面,直接繼承CurdRepository

@Repositorypublic interface UserRepository extends CrudRepository<User, Integer> {

}

建立啟動類

@SpringBootApplication@RestController@RefreshScope //自動重新整理public class ClientApplication {    
    public static void main(String[] args) {
      SpringApplication.run(ClientApplication.class, args);
    }    
    @Value("${str}")
    String str;    
    @Autowired
    private UserRepository userRepository;    
    @GetMapping("/user/{id}")    public User index(@PathVariable Integer id) {        return userRepository.findById(id).get();
    }    
    @GetMapping("/str")    public String str() {        return str;
    }

編寫配置檔案,主要包括應用程式名稱,應用程式profile和連線Spring Cloud Config服務的URI。我們在編寫這些配置的檔案時,會使用bootstrap.yml或不是application.yml,這是因為bootstrap.yml載入等級比application.yml高,並且屬性不允許覆蓋。
bootstrap.yml

server:
  port: 86spring: 
  application:
    name: app
  cloud:
    config:
      profile: dev
      uri: 
  endpoints:
    web:
      exposure:        include: refresh

spring.application.name 告訴伺服器你這個應用程式名稱,Spring Cloud Config會找出對應的檔名。
spring.cloud.config.profile 指定應用程式執行環境檔案
spring.coud.config.url: Spring Cloud Config物理路徑
啟動程式,開啟瀏覽器訪問  ,出現下圖就說明成功了。

圖片描述

image.png


可以從日誌中知道,讀取了那個檔案

圖片描述

image.png


現在有個問題了,如果我們修改了配置檔案,client能否載入到最新的值呢?
我在配置檔案中定義了一個str:aaa的值,有個一個/str的介面會直接返回這個值

圖片描述

image.png


如果我們到檔案中修改配置檔案,將改成str:bbbbb,在訪問這個介面返回的資料是否會變嗎?
多重新整理幾次後,發現根本不會變,這是因為Spring Boot應用程式只會在啟動時讀取他們的屬性,因此Spring Cloud配置伺服器中進行修改的屬性不會被Spring Boot應用程式自動獲取。如果你想修改配置後,又不想啟動應用程式,可以在啟動類上加上@RefreshScope註解,允許開發人員訪問/refresh,這會讓Spring Boot應用程式重新讀取應用程式配置。使用瀏覽器訪問 POST請求,這時再去訪問/str就會發現檔案自動變成修改後的值了。


連線git 檔案儲存



Spring Cloud Config不僅支援本地檔案儲存,也支援git遠端儲存。現在將配置檔案儲存到GitHub上,

圖片描述

image.png


修改配置,新增git url

server:
  port: 85spring:  #profiles:
   # active: native
  cloud:
    config:
      server:
        git:
          uri: 
          search-paths: src/main/resources    #相對目錄,如果是根目錄可以不寫
          #username: 因為使用https 不使用賬號,密碼也可以clone成功 
          #password:


{  "name": "app",  "profiles": [    "dev"
  ],  "label": null,  "version": "651047593f90acf2aeb1885e77b624ddfdd3f721",  "state": null,  "propertySources": [
    {      "name": "/src/main/resources/app-dev.yml",      "source": {        "spring.datasource.url": "jdbc:mysql://localhost/ting?useSSL=false&characterEncoding=utf8",        "spring.datasource.username": "root",        "spring.datasource.password": 123123,        "spring.jpa.database": "mysql",        "spring.jpa.show-sql": true,        "spring.jpa.hibernate.ddl-auto": "update",        "str": "aaa"
      }
    }
  ]
}



作者:神易風
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2815946/,如需轉載,請註明出處,否則將追究法律責任。

相關文章