1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        使用 Spring Cloud Config 統(tǒng)一管理配置,別再到處放配置文件了!

        共 8568字,需瀏覽 18分鐘

         ·

        2022-07-13 07:01

        大家好,我是寶哥!

        1 簡(jiǎn)述

        官方文檔對(duì)Spring Cloud Config的描述如下:

        Spring Cloud Config為分布式系統(tǒng)中的外部配置提供服務(wù)器和客戶端支持,使用Config Server,您可以在所有環(huán)境中管理應(yīng)用程序的外部屬性??蛻舳撕头?wù)器上的概念映射與Spring EnvironmentPropertySource抽象相同。

        因此它們與Spring應(yīng)用程序非常契合,但可以與任何以任何語(yǔ)言運(yùn)行的應(yīng)用程序一起使用。隨著應(yīng)用程序通過(guò)從開(kāi)發(fā)人員到測(cè)試和生產(chǎn)的部署流程,您可以管理這些環(huán)境之間的配置,并確定應(yīng)用程序具有遷移時(shí)需要運(yùn)行的一切。

        服務(wù)器存儲(chǔ)后端的默認(rèn)實(shí)現(xiàn)使用git,因此它輕松支持標(biāo)簽版本的配置環(huán)境,以及可以訪問(wèn)用于管理內(nèi)容的各種工具。很容易添加替代實(shí)現(xiàn),并使用Spring配置將其插入。

        1.1 配置中心存在的意義

        一個(gè)應(yīng)用中不只是代碼,還需要連接資源和其它應(yīng)用,經(jīng)常有很多需要外部設(shè)置的項(xiàng)去調(diào)整應(yīng)用行為,如切換不同的數(shù)據(jù)庫(kù),設(shè)置功能開(kāi)關(guān)等。

        隨著系統(tǒng)微服務(wù)的不斷增加,首要考慮的是系統(tǒng)的可伸縮、可擴(kuò)展性好,隨之就是一個(gè)配置管理的問(wèn)題。各自管各自的開(kāi)發(fā)時(shí)沒(méi)什么問(wèn)題,到了線上之后管理就會(huì)很頭疼,到了要大規(guī)模更新就更煩了。

        而且你不可能停止你的服務(wù)集群去更新的你配置,這是不現(xiàn)實(shí)的做法,因此Spring Cloud配置中心就是一個(gè)比較好的解決方案,下圖就是一個(gè)Spring Cloud配置中心的解決方案:

        架構(gòu)圖如下:

        常見(jiàn)的配置中心的實(shí)現(xiàn)方法有:

        • 硬編碼(缺點(diǎn):需要修改代碼,風(fēng)險(xiǎn)大)
        • 放在xml等配置文件中,和應(yīng)用一起打包(缺點(diǎn):需要重新打包和重啟)
        • 文件系統(tǒng)中(缺點(diǎn):依賴(lài)操作系統(tǒng)等)
        • 環(huán)境變量(缺點(diǎn):有大量的配置需要人工設(shè)置到環(huán)境變量中,不便于管理且依賴(lài)平臺(tái))
        • 云端存儲(chǔ)(缺點(diǎn):與其他應(yīng)用耦合)

        Spring Cloud Config就是云端存儲(chǔ)配置信息的,它具有中心化、版本控制、支持動(dòng)態(tài)更新、平臺(tái)獨(dú)立、語(yǔ)言獨(dú)立等特性。其特點(diǎn)是:

        • 提供服務(wù)端和客戶端支持(spring cloud config serverspring cloud config client
        • 集中式管理分布式環(huán)境下的應(yīng)用配置
        • 基于Spring環(huán)境,無(wú)縫與Spring應(yīng)用集成
        • 可用于任何語(yǔ)言開(kāi)發(fā)的程序
        • 默認(rèn)實(shí)現(xiàn)基于git倉(cāng)庫(kù),可以進(jìn)行版本管理
        • 可替換自定義實(shí)現(xiàn)
        1.1.1 Spring Cloud Config包括兩部分

        1、Spring Cloud Config Server作為配置中心的服務(wù)端:

        • 拉取配置時(shí)更新git倉(cāng)庫(kù)副本,保證是最新結(jié)果
        • 支持?jǐn)?shù)據(jù)結(jié)構(gòu)豐富,yml、json、properties
        • 配合 eureke 可實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),配合 cloud bus 可實(shí)現(xiàn)配置推送更新
        • 配置存儲(chǔ)基于 git倉(cāng)庫(kù),可進(jìn)行版本管理
        • 簡(jiǎn)單可靠,有豐富的配套方案

        2、Spring Cloud Config Client客戶端:

        Spring Boot項(xiàng)目不需要改動(dòng)任何代碼,加入一個(gè)啟動(dòng)配置文件指明使用ConfigServer上哪個(gè)配置文件即可

        1.1.2 SpringCloud Config與百度的disconf之類(lèi)注冊(cè)中心區(qū)別

        主要區(qū)別在于下面三點(diǎn):

        1、配置的存儲(chǔ)方式不同: disconf是把配置信息保存在mysql、zookeeper中,而spring cloud config是將配置保存在git/svn上 (即:配置當(dāng)成源代碼一樣管理)

        2、配置的管理方式不同: spring cloud config沒(méi)有類(lèi)似disconf的統(tǒng)一管理界面,既然把配置都當(dāng)成git之類(lèi)的源碼來(lái)看待了,git的管理界面,就是配置的管理界面

        3、配置變化的通知機(jī)制不同: disconf中配置變化后,依賴(lài)zk的事件watcher來(lái)通知應(yīng)用,而spring cloud config則是依賴(lài)git每次push后,觸發(fā)webhook回調(diào),最終觸發(fā)spring cloud bus(消息總線),然后由消息總線通知相關(guān)的應(yīng)用。

        從配置變化的通知機(jī)制上看,如果有100個(gè)應(yīng)用節(jié)點(diǎn),都依賴(lài)于統(tǒng)一配置,如果修改了配置,只想讓某幾個(gè)節(jié)點(diǎn)"灰度"更新配置,spring cloud config server更容易做到,這一點(diǎn)相對(duì)disconf更靈活

        1.2 代碼示例

        目前SpringCloud Config的使用主要是通過(guò)Git/SVN方式做一個(gè)配置中心,然后每個(gè)服務(wù)從其中獲取自身配置所需的參數(shù)。SpringCloud Config也支持本地參數(shù)配置的獲取。

        如果使用本地存儲(chǔ)的方式,在application.propertiesapplication.yml 文件添加 spring.profiles.active=native 配置即可,它會(huì)從項(xiàng)目的 resources路徑下讀取配置文件。如果是讀取指定的配置文件,那么可以使用 spring.cloud.config.server.native.searchLocations = file:D:/properties/來(lái)讀取。

        1.2.1 服務(wù)端

        首先是服務(wù)端這塊,首先創(chuàng)建一個(gè)注冊(cè)中心,為了進(jìn)行區(qū)分,創(chuàng)建一個(gè)springcloud-config-eureka的項(xiàng)目。

        application.properties配置信息:

        配置信息:

        spring.application.name=springcloud-hystrix-eureka-server
        server.port=8005
        eureka.client.register-with-eureka=false
        eureka.client.fetch-registry=false
        eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/

        配置說(shuō)明:

        • spring.application.name: 這個(gè)是指定服務(wù)名稱(chēng)
        • server.port: 服務(wù)指定的端口
        • eureka.client.register-with-eureka: 表示是否將自己注冊(cè)到Eureka Server,默認(rèn)是true
        • eureka.client.fetch-registry: 表示是否從Eureka Server獲取注冊(cè)信息,默認(rèn)為true
        • eureka.client.serviceUrl.defaultZone: 這個(gè)是設(shè)置與Eureka Server交互的地址,客戶端的查詢(xún)服務(wù)和注冊(cè)服務(wù)都需要依賴(lài)這個(gè)地址

        服務(wù)端這邊只需要在SpringBoot啟動(dòng)類(lèi)添加@EnableEurekaServer注解就可以了,該注解表示此服務(wù)是一個(gè)服務(wù)注冊(cè)中心服務(wù)。

        代碼示例:

        @SpringBootApplication
        @EnableEurekaServer
        public class ConfigEurekaApplication {

         public static void main(String[] args) {
          SpringApplication.run(ConfigEurekaApplication.classargs);
           System.out.println("config 注冊(cè)中心服務(wù)啟動(dòng)...");
         }
        }

        創(chuàng)建好了注冊(cè)中心之后,我們?cè)賮?lái)創(chuàng)建一個(gè)配置中心,用于管理配置。

        創(chuàng)建一個(gè)springcloud-config-server的項(xiàng)目。然后在application.properties配置文件添加如下配置:

        配置信息:

        spring.application.name=springcloud-config-server
        server.port=9005
        eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/
        spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
        spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo
        spring.cloud.config.server.git.username = 
        spring.cloud.config.server.git.password = 

        配置說(shuō)明:

        • spring.application.name: 這個(gè)是指定服務(wù)名稱(chēng)
        • server.port:服務(wù)指定的端口
        • eureka.client.serviceUrl.defaultZone: 這個(gè)是設(shè)置與Eureka Server交互的地址,客戶端的查詢(xún)服務(wù)和注冊(cè)服務(wù)都需要依賴(lài)這個(gè)地址
        • spring.cloud.config.server.git.uri: 配置的Git倉(cāng)庫(kù)的地址
        • spring.cloud.config.server.git.search-paths: git倉(cāng)庫(kù)地址下的相對(duì)地址 多個(gè)用逗號(hào)","分割
        • spring.cloud.config.server.git.username: git倉(cāng)庫(kù)的賬號(hào)
        • spring.cloud.config.server.git.password: git倉(cāng)庫(kù)的密碼

        注:如果想使用本地方式讀取配置信息,那么只需將spring.cloud.config.server.git的配置改成spring.profiles.active=native,然后在resources路徑下新增一個(gè)文件即可。

        這里為了進(jìn)行本地配置文件測(cè)試,新建一個(gè)configtest.properties配置文件,添加如下內(nèi)容:

        word=hello world

        代碼這塊也很簡(jiǎn)單,在程序主類(lèi)中,額外添加@EnableConfigServer注解,該注解表示啟用config配置中心功能。代碼如下:

        @EnableDiscoveryClient
        @EnableConfigServer
        @SpringBootApplication
        public class ConfigServerApplication {

         public static void main(String[] args) {
          SpringApplication.run(ConfigServerApplication.classargs);
          System.out.println("配置中心服務(wù)端啟動(dòng)成功!");
         }
        }

        完成上述代碼之后,我們的配置中心服務(wù)端已經(jīng)構(gòu)建完成了。

        1.2.2 客戶端

        我們新建一個(gè)springcloud-config-client的項(xiàng)目,用于做讀取配置中心的配置。pom依賴(lài)還是和配置中心一樣,不過(guò)需要新增一個(gè)配置,用于指定配置的讀取。

        創(chuàng)建一個(gè)bootstrap.properties文件,并添加如下信息:

        配置信息:

        spring.cloud.config.name=configtest
        spring.cloud.config.profile=pro
        spring.cloud.config.label=master
        spring.cloud.config.discovery.enabled=true
        spring.cloud.config.discovery.serviceId=springcloud-config-server
        eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/

        配置說(shuō)明:

        • spring.cloud.config.name: 獲取配置文件的名稱(chēng)
        • spring.cloud.config.profile: 獲取配置的策略
        • spring.cloud.config.label: 獲取配置文件的分支,默認(rèn)是master。如果是是本地獲取的話,則無(wú)用
        • spring.cloud.config.discovery.enabled: 開(kāi)啟配置信息發(fā)現(xiàn)
        • spring.cloud.config.discovery.serviceId: 指定配置中心的service-id,便于擴(kuò)展為高可用配置集群
        • eureka.client.serviceUrl.defaultZone: 這個(gè)是設(shè)置與Eureka Server交互的地址,客戶端的查詢(xún)服務(wù)和注冊(cè)服務(wù)都需要依賴(lài)這個(gè)地址

        注:上面這些與spring-cloud相關(guān)的屬性必須配置在bootstrap.properties中,config部分內(nèi)容才能被正確加載。因?yàn)?code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;color: #1e6bb8;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;">bootstrap.properties的相關(guān)配置會(huì)先于application.properties,而bootstrap.properties的加載也是先于application.properties。需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.properties,不然客戶端是無(wú)法獲取配置中心參數(shù)的,會(huì)啟動(dòng)失??!

        application.properties配置

        spring.application.name=springcloud-config-client
        server.port=9006

        配置說(shuō)明:

        spring.application.name: 這個(gè)是指定服務(wù)名稱(chēng)
        server.port:服務(wù)指定的端口

        程序主類(lèi)代碼,和之前的基本一致。代碼如下:

        代碼示例:

        @EnableDiscoveryClient
        @SpringBootApplication
        public class ConfigClientApplication {

         public static void main(String[] args) {
          SpringApplication.run(ConfigClientApplication.classargs);
          System.out.println("配置中心客戶端啟動(dòng)成功!");
         }
        }

        為了方便查詢(xún),在控制中進(jìn)行參數(shù)的獲取,并返回。@Value注解是默認(rèn)是從application.properties配置文件獲取參數(shù),但是這里我們?cè)诳蛻舳瞬](méi)有進(jìn)行配置,該配置在配置中心服務(wù)端,我們只需指定好了配置文件之后即可進(jìn)行使用。

        代碼示例:

        @RestController
        public class ClientController {
         
         @Value("${word}")
         private String word;
         
            @RequestMapping("/hello")
            public String index(@RequestParam String name) {
                return name+","+this.word;
            }
        }

        到此,客戶端項(xiàng)目也就構(gòu)建完成了。

        1.2.3 功能測(cè)試

        完成如上的工程開(kāi)發(fā)之后,我們來(lái)進(jìn)行測(cè)試。

        1.2.3.1 本地測(cè)試

        首先我們把springcloud-config-server項(xiàng)目的application.properties配置文件添加spring.profiles.active=native配置,注釋掉spring.cloud.config.server.git相關(guān)的配置,然后在src/main/resources目錄下新建一個(gè)configtest.properties文件,然后在里面添加一個(gè)配置word=hello world。

        添加完成之后,我們依次啟動(dòng)springcloud-config-eureka、springcloud-config-server、springcloud-config-client這三個(gè)項(xiàng)目。啟動(dòng)成功之前,先看來(lái)看看配置中心服務(wù)端的配置文件獲取,在瀏覽器輸入:

        http://localhost:9005/configtest-1.properties

        查看該文件的配置信息。

        注:配置文件的名稱(chēng)是configtest.properties,但是如果直接該名稱(chēng)的話是獲取不到的,因?yàn)樵谂渲梦募枰ㄟ^(guò)-來(lái)進(jìn)行獲取,如果配置文件名稱(chēng)沒(méi)有-,那么添加了-之后,會(huì)自動(dòng)進(jìn)行匹配搜索。

        springcloud config的URL與配置文件的映射關(guān)系如下:

        /{application}/{profile}[/{label}]
        /{application}-{profile}.yml
        /{label}/{application}-{profile}.yml
        /{application}-{profile}.properties
        /{label}/{application}-{profile}.properties

        上面的url會(huì)映射{application}-{profile}.properties對(duì)應(yīng)的配置文件,{label}對(duì)應(yīng)git上不同的分支,默認(rèn)為master。

        界面返回:

        word: hello world

        然后調(diào)用客戶端的接口,查看是否能夠獲取配置信息。在瀏覽器上輸入:

        http://localhost:9006//hello?name=pancm

        界面返回:

        pancm,hello world

        示例圖:

        1.2.3.2 Git測(cè)試

        在完成本地測(cè)試之后,我們把這個(gè)spring.profiles.active=native配置注釋掉,解除spring.cloud.config.server.git相關(guān)的注釋(賬號(hào)和密碼要填寫(xiě)真實(shí)的),然后在git倉(cāng)庫(kù)上建立一個(gè)config-repo文件夾,新建configtest-pro.propertiesconfigtest-dev.properties兩個(gè)配置,這兩個(gè)的配置分別是word=hello world?。?/code>和word=hello world!, 然后和configtest.properties配置文件一起上傳到config-repo文件夾中。

        首先在瀏覽器輸入:

        http://localhost:9005/configtest-dev.properties

        瀏覽器返回:

        word: hello world!

        然后再瀏覽器輸入:

        http://localhost:9005/configtest-pro.properties

        瀏覽器返回:

        word: hello world!!

        上傳了configtest.properties文件,但是這個(gè)文件名稱(chēng)沒(méi)有-,我們想獲取其中參數(shù)的信息的話,可以在然后-隨意添加一個(gè)參數(shù),它會(huì)自動(dòng)進(jìn)行匹配,在瀏覽器輸入:

        http://localhost:9005/configtest-1.properties

        瀏覽器返回:

        word: hello world

        然后進(jìn)行客戶端接口調(diào)用測(cè)試,在瀏覽器輸入:

        http://localhost:9006/hello?name=pancm

        瀏覽器返回:

        pancm,Hello World!!

        由于這里我配置的前綴是 pro ,所以讀取的是configtest-pro.properties文件的數(shù)據(jù),想要獲取其他的配置,修改spring.cloud.config.profile配置即可。

        示例圖:

        來(lái)源:blog.csdn.net/weixin_42039228/article

        /details/123786902

        精彩推薦:

        京東一面:Redis 如何實(shí)現(xiàn)庫(kù)存扣減操作?如何防止商品被超賣(mài)?

        SpringBoot 三大開(kāi)發(fā)工具,你都用過(guò)么?

        CTO 說(shuō)了,用錯(cuò)@Autowired 和@Resource 的人可以領(lǐng)盒飯了

        快速搭建一個(gè)網(wǎng)關(guān)服務(wù),動(dòng)態(tài)路由、鑒權(quán)的流程,看完秒會(huì)(含流程圖)

        Nginx 面試 40 連問(wèn),快頂不住了~~

        徹底搞懂 SpringBoot jar 可執(zhí)行原理


        瀏覽 56
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            含着关晓彤的玉足猛烈的槽 | 天天干夜夜操视频免费专区 | 日本年轻漂亮大胸继坶3 | 综合一区| 久久人妻影院 | 男生用机机桶女生机机 | 日本少妇无码精品18p | 色猫AV | 久久欧美一区二区三区 | 桃花仙洞芳草萋萋水潺潺 |