Spring Cloud(二):Spring Cloud Config
因為涉及到多個子工程,這種情況比較適合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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spring cloud分散式微服務:Spring Cloud ConfigSpringCloud分散式微服務
- [Spring Cloud Tutorial翻譯系列二]Spring Cloud Config Server與git整合SpringCloudServerGit
- Spring Cloud Config 規範SpringCloud
- spring cloud config 整合svnSpringCloud
- Spring Cloud Config 配置中心SpringCloud
- spring cloud config 原始碼分析SpringCloud原始碼
- Spring Cloud Config伺服器SpringCloud伺服器
- Spring Cloud(八)高可用的分散式配置中心 Spring Cloud ConfigSpringCloud分散式
- Spring Cloud實戰系列(六) - 分散式配置中心Spring Cloud ConfigSpringCloud分散式
- Spring Boot系列(四) Spring Cloud 之 Config ClientSpring BootCloudclient
- Spring Cloud Config-Git後端SpringCloudGit後端
- Spring Cloud Config 實現配置中心SpringCloud
- Spring Cloud Config客戶端使用SpringCloud客戶端
- Spring Cloud專題之五:configSpringCloud
- Spring Cloud Config原碼篇(十)SpringCloud
- Spring Cloud Config應用篇(九)SpringCloud
- Spring Cloud 學習筆記 ——Spring Cloud Config 請求失敗重試SpringCloud筆記
- spring cloud微服務分散式雲架構-Spring Cloud Config環境庫SpringCloud微服務分散式架構
- 為Spring Cloud Config插上管理的翅膀SpringCloud
- Spring Cloud 之 Config與動態路由.SpringCloud路由
- java 教程 Spring Cloud Config環境庫JavaSpringCloud
- Spring Cloud(九)高可用的分散式配置中心 Spring Cloud Config 整合 Eureka 服務SpringCloud分散式
- 非spring boot (即spring) 使用/整合 Spring cloud Config 分散式配置中心Spring BootCloud分散式
- Spring Cloud雲架構-Config Git後端SpringCloud架構Git後端
- Spring cloud config 使用gitHub或者gitee連線SpringCloudGithubGitee
- Spring Cloud Config 分散式配置中心【Finchley 版】SpringCloud分散式
- Spring Cloud Config Client 超時與重試SpringCloudclient
- Spring Cloud 關於:Spring Cloud Netflix HystrixSpringCloud
- 微服務SpringCloud之Spring Cloud Config配置中心Git微服務SpringGCCloudGit
- spring cloud 和 阿里微服務spring cloud AlibabaSpringCloud阿里微服務
- Spring Cloud應用(二)---ribbon使用SpringCloud
- spring cloud config將配置儲存在資料庫中SpringCloud資料庫
- 微服務Spring Cloud17_Spring Cloud概述3微服務SpringCloud
- Spring Cloud 整合SpringCloud
- Spring Cloud (十四):Spring Cloud 開源軟體都有哪些?SpringCloud
- Spring cloud(6)-配置管理及重新整理(Config,Bus)SpringCloud
- spring cloud微服務分散式雲架構Spring Cloud ZuulSpringCloud微服務分散式架構Zuul
- 微服務 | Spring Cloud(一):從單體SSM 到 Spring Cloud微服務SpringCloudSSM