11111111111
知識共享平臺
知識共享平臺

討教大學(xué)平臺

  • 首頁
  • 免費課
  • 精品課
  • 討教題庫
  • 企業(yè)服務(wù)

    hot

  • 下載APP
  • 證書查詢
  • 關(guān)于我們
我問
討教號
搜索
消息
  • 我的文章

    我的關(guān)注

    我的問答

    我的秘密

    我的評論

    我的訂閱

    我的打賞

    我的錢包

    我的通知

    我的設(shè)置

    退出登錄

  • ×

    登錄

    討教 | 通行證

    登錄
    立即注冊
    忘記密碼?
    使用微信登錄

    提問 ×

    寫下你的問題,準(zhǔn)確的表述更容易得到答案

    類型話題

    選擇支付方式
    您的討教幣 111 付費金額

    国产第一亚洲_浪货一天不做就难受呀_欧洲视频在线观看_亚洲精品一区二区三区美女

    <abbr id="uyuky"><code id="uyuky"></code></abbr>
    • <li id="uyuky"></li>
    • <code id="uyuky"><tbody id="uyuky"></tbody></code>
      <s id="uyuky"></s>
    • <s id="uyuky"></s>
      <strike id="uyuky"><tbody id="uyuky"></tbody></strike>
        <s id="uyuky"></s>

        Spring Boot 2.0 整合攜程Apollo配置中心

        JAVA葵花寶典
        2019-06-17 16:22:52
        16篇 作品
        2102 總閱讀量

        Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。

        服務(wù)端基于Spring Boot和Spring Cloud開發(fā),打包后可以直接運行,不需要額外安裝Tomcat等應(yīng)用容器。

        Java客戶端不依賴任何框架,能夠運行于所有Java運行時環(huán)境,同時對Spring/Spring Boot環(huán)境也有較好的支持。

        .Net客戶端不依賴任何框架,能夠運行于所有.Net運行時環(huán)境。

        如果想要深入了解,可以到github上參見Apollo配置中心,官網(wǎng)的介紹很詳細。本章主要講述Spring Boot 2.0 整合Apollo配置中心。


        一、Apollo配置中心服務(wù)端(來源于官網(wǎng))


        本文的重點在于Apollo在客戶端的使用,所以Apollo服務(wù)端使用的是官網(wǎng)提供的 Quick Start(針對本地測試使用),后續(xù)文章會專門講述Apollo服務(wù)端在分布式環(huán)境下的部署。


        1.1 準(zhǔn)備工作


        1. Java
          Apollo服務(wù)端要求Java 1.8+,客戶端要求Java 1.7+,筆者本地使用的是Java 1.8。

        2. MySQL
          Apollo的表結(jié)構(gòu)對timestamp使用了多個default聲明,所以需要5.6.5以上版本。筆者本地使用的是8.0.13版本

        3. 下載 Quick Start
          官網(wǎng)為我們準(zhǔn)備了 Quick Start 安裝包。大家只需要下載到本地,就可以直接使用,免去了編譯、打包過程。大家可以到github下載,也可以通過百度云盤下載


        1.2 安裝步驟


        1.2.1 創(chuàng)建數(shù)據(jù)庫


        Apollo服務(wù)端共需要兩個數(shù)據(jù)庫:ApolloPortalDB和ApolloConfigDB,官網(wǎng)把數(shù)據(jù)庫、表的創(chuàng)建和樣例數(shù)據(jù)都分別準(zhǔn)備了sql文件(在下載的 Quick Start 安裝包的sql目錄下),只需要導(dǎo)入數(shù)據(jù)庫即可。


        1.2.1.1 創(chuàng)建ApolloPortalDB


        通過各種Mysql客戶端(Navicat,DataGrip等)導(dǎo)入sql/apolloportaldb.sql即可
        下面以MySQL原生客戶端為例:

        source /your_local_path/sql/apolloportaldb.sql


        導(dǎo)入成功后,可以通過執(zhí)行以下sql語句來驗證:

        select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
        IdAppIdName
        1SampleAppSample App

        通過各種Mysql客戶端(Navicat,DataGrip等)導(dǎo)入sql/apolloconfigdb.sql即可
        下面以MySQL原生客戶端為例:

        source /your_local_path/sql/apolloconfigdb.sql


        導(dǎo)入成功后,可以通過執(zhí)行以下sql語句來驗證:

        select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
        

        NamespaceId Key Value Comment
        1 timeout 100 sample
        1.2.2 配置數(shù)據(jù)庫連接信息

        Apollo服務(wù)端需要知道如何連接到你前面創(chuàng)建的數(shù)據(jù)庫,所以需要編輯demo.sh,修改ApolloPortalDB和ApolloConfigDB相關(guān)的數(shù)據(jù)庫連接串信息。

        #apollo config db info
        apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
        apollo_config_db_username=用戶名
        apollo_config_db_password=密碼(如果沒有密碼,留空即可)

        # apollo portal db info
        apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
        apollo_portal_db_username=用戶名
        apollo_portal_db_password=密碼(如果沒有密碼,留空即可)

        1.3 啟動Apollo配置中心


        1.3.1 確保端口未被占用


        Quick Start腳本會在本地啟動3個服務(wù),分別使用8070, 8080, 8090端口,請確保這3個端口當(dāng)前沒有被使用。例如,在Linux/Mac下,可以通過如下命令檢查:

        lsof -i:8080


        在windows下,可以通過如下命令檢查:

        netstat -aon|findstr "8080"


        1.3.2 執(zhí)行啟動腳本


        在Quick Start目錄下執(zhí)行如下命令:

        ./demo.sh start


        當(dāng)看到如下輸出后,就說明啟動成功了!

        ==== starting service ====
        Service logging file is ./service/apollo-service.log
        Started [10768]
        Waiting for config service startup.......
        Config service started. You may visit http://localhost:8080 for service status now!
        Waiting for admin service startup....
        Admin service started
        ==== starting portal ====
        Portal logging file is ./portal/apollo-portal.log
        Started [10846]
        Waiting for portal startup......
        Portal started. You can visit http://localhost:8070 now!


        1.3.3 異常排查


        如果啟動遇到了異常,可以分別查看service和portal目錄下的log文件排查問題。

        注: 在啟動apollo-configservice的過程中會在日志中輸出eureka注冊失敗的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,這個是預(yù)期的情況,因為apollo-configservice需要向Meta Server(它自己)注冊服務(wù),但是因為在啟動過程中,自己還沒起來,所以會報這個錯。后面會進行重試的動作,所以等自己服務(wù)起來后就會注冊正常了。


        1.4 使用Apollo配置中心


        1.4.1 查看樣例配置


        1. 瀏覽器訪問http://localhost:8070

        1. Quick Start集成了Spring Security簡單認證,更多信息可以參考Portal 實現(xiàn)用戶登錄功能

        2. 輸入用戶名apollo,密碼admin登錄

        1. 配置中心中包含一個默認的項目SampleApp

        2. 點擊SampleApp進入配置界面,可以看到當(dāng)前有一個配置timeout=100

        1. 如果提示系統(tǒng)出錯,請重試或聯(lián)系系統(tǒng)負責(zé)人,請稍后幾秒鐘重試一下,因為通過Eureka注冊的服務(wù)有一個刷新的延時。


        1.4.2 新增項目配置


        我們的客戶端使用apollo需要新增相關(guān)的項目配置。

        點擊新建項目

        點擊提交,創(chuàng)建完成

          • 應(yīng)用ID:這個ID是應(yīng)用的唯一標(biāo)識

          • 應(yīng)用名稱:應(yīng)用的名稱,會展示在配置中心的首頁上


        1. 新增配置信息
          點擊新增配置,填寫配置信息

        點擊提交,此時配置還未生效。


        發(fā)布配置
        點擊發(fā)布,配置立刻生效


        回滾
        如果配置做了修改之后,發(fā)現(xiàn)配置更改錯誤,這個時候可以使用回滾功能,回到上一個配置

        二、Apollo配置中心客戶端


        我們客戶端基于Spring Boot 2.0搭建,開發(fā)工具是InteIIij IDEA。新建一個項目,項目名稱為apollo-client


        2.1 客戶端搭建


        添加Apollo客戶端依賴

        <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.1.1</version>
        </dependency>

        添加配置信息


        # 應(yīng)用ID(在Apollo服務(wù)端新增項目添加的應(yīng)用ID)
        app.id=testclient
        # apollo-configservice地址
        apollo.meta=http://127.0.0.1:808

          在項目的啟動類上添加@EnableApolloConfig注解


        新增一個測試接口

        @RequestMapping("/index")
        public String hello(){
        return "hello man";
        }

        啟動服務(wù)測試
        在Apollo配置中心中,我們對該項目有一條配置server.port = 9000,啟動服務(wù),訪問http://localhost:9000/index,返回hello man。證明,客戶端是從服務(wù)端獲取的配置。


        2.2 客戶端用法


        在上一節(jié),我們簡單的搭建了客戶端,成功的使用服務(wù)端配置。Apollo為我們提供的使用方式有很多種,下面只介紹Spring Boot 2.0環(huán)境下的使用方式。


        2.2.1 Spring Placeholder的使用


        Spring應(yīng)用通常會使用Placeholder來注入配置,使用的格式形如${someKey:someDefaultValue},如${timeout:100}。冒號前面的是key,冒號后面的是默認值(建議在實際使用時盡量給出默認值,以免由于key沒有定義導(dǎo)致運行時錯誤)。Apollo從v0.10.0開始的版本支持placeholder在運行時自動更新。如果需要關(guān)閉placeholder在運行時自動更新功能,可以通過以下兩種方式關(guān)閉:


        1. 通過設(shè)置System Property apollo.autoUpdateInjectedSpringProperties,如啟動時傳入-Dapollo.autoUpdateInjectedSpringProperties=false

        2. 通過設(shè)置META-INF/app.properties中的apollo.autoUpdateInjectedSpringProperties=false


        2.2.1.1 Java Config使用方式


        1. 新建配置類JavaConfigBean如下:



          /**
          * Java Config方式
          *
          * @author simon
          * @create 2018-11-02 15:00
          **/
          @Configuration
          public class JavaConfigBean {
          @Value("${timeout:20}")
          private int timeout;

          public int getTimeout() {
          return timeout;
          }
          }
        2. 新增訪問端點

            
          //1.Java Config方式
          @Autowired
          JavaConfigBean javaConfigBean;

          @RequestMapping("/index1")
          public String hello1(){
          return javaConfigBean.getTimeout()+"";
          }
        3. 測試
          瀏覽器訪問http://127.0.0.1:8080/index1,正確返回配置的值


        2.2.1.2 ConfigurationProperties使用方式


        Spring Boot提供了@ConfigurationProperties把配置注入到bean對象中。Apollo也支持這種方式,下面的例子會把redis.cache.expireSeconds和redis.cache.commandTimeout分別注入到SampleRedisConfig的expireSeconds和commandTimeout字段中。


        1. 新增配置類SampleRedisConfig如下:



          /**
          * ConfigurationProperties使用方式
          *
          * @author simon
          * @create 2018-11-02 9:30
          **/
          @Configuration
          @ConfigurationProperties(prefix = "redis.cache")
          public class SampleRedisConfig {
          private int expireSeconds;
          private int commandTimeout;

          public void setExpireSeconds(int expireSeconds) {
          this.expireSeconds = expireSeconds;
          }

          public void setCommandTimeout(int commandTimeout) {
          this.commandTimeout = commandTimeout;
          }

          public int getExpireSeconds() {
          return expireSeconds;
          }

          public int getCommandTimeout() {
          return commandTimeout;
          }
          }

        2. 新增訪問端點


          //2. ConfigurationProperties使用方式
          @Autowired
          SampleRedisConfig sampleRedisConfig;

          @RequestMapping("/index2")
          public String hello2(){
          return sampleRedisConfig.getCommandTimeout()+"--"+sampleRedisConfig.getExpireSeconds();
          }
        3. 測試
          瀏覽器訪問http://127.0.0.1:8080/index2,正確返回配置的值


        注: @ConfigurationProperties如果需要在Apollo配置變化時自動更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。這個我會在后續(xù)文章中詳細描述。


        2.2.2 Spring Annotation支持


        Apollo同時還增加了幾個新的Annotation來簡化在Spring環(huán)境中的使用。


        • @ApolloConfig用來自動注入Config對象

        • @ApolloConfigChangeListener用來自動注冊ConfigChangeListener

        • @ApolloJsonValue用來把配置的json字符串自動注入為對象


        2.2.2.1 @ApolloConfig的使用


        1. 新增訪問端點



          // 3. @ApolloConfig使用
          @ApolloConfig
          private Config config;

          @RequestMapping("/index3")
          public String hello3(){
          Set <String> propertyNames = config.getPropertyNames();
          propertyNames.forEach(key -> {
          System.err.println(key+"="+config.getIntProperty(key,0));
          });
          return propertyNames.toString();
          }
        2. 測試
          瀏覽器訪問http://127.0.0.1:8080/index3,正確打印配置的值



          redis.cache.commandTimeout=3000
          redis.cache.expireSeconds=20
          server.port=800
          timeout=200


        @ApolloConfigChangeListener的使用


        1. 新增以下代碼



          @ApolloConfigChangeListener
          private void someOnChange(ConfigChangeEvent changeEvent) {
          //update injected value of batch if it is changed in Apollo
          if (changeEvent.isChanged("timeout")) {
          System.out.println(config.getIntProperty("timeout", 0));
          }
          }
        2. 測試
          在Apollo服務(wù)端修改timeout配置的值為300,發(fā)布后,控制臺打印300


        2.2.2.3 @ApolloJsonValue的使用


        1. 新增User如下:

        1. /**
          * 用戶
          *
          * @author simon
          * @create 2018-11-02 16:41
          **/
          public class User {
          private String username;
          private String password;

          public String getUsername() {
          return username;
          }

          public void setUsername(String username) {
          this.username = username;
          }

          public String getPassword() {
          return password;
          }

          public void setPassword(String password) {
          this.password = password;
          }
          }
        2. 服務(wù)端新增配置

          jsonBeanProperty=[ { "username": "john", "password": "1234" }, { "username": "simon", "password": "222132" } ]
        3. 客戶端獲取配置


          //4. @ApolloJsonValue使用
          @ApolloJsonValue("${jsonBeanProperty:[]}")
          private List<User> anotherJsonBeans;

          @RequestMapping("/index4")
          public void hello4(){
          anotherJsonBeans.forEach(item -> {
          System.err.println(item.getUsername()+"--"+item.getPassword());
          });
          }
        4. 測試
          瀏覽器訪問http://127.0.0.1:8080/index4,正確打印配置的值


        源碼下載

        https://github.com/simondongji/SpringCloudProject/tree/master/apollo

        本網(wǎng)站內(nèi)容僅代表作者本人的觀點,不代表本網(wǎng)站的觀點和看法,與本網(wǎng)站立場無關(guān),如有侵權(quán)請聯(lián)系討教。
        給作者打賞,鼓勵TA抓緊創(chuàng)作
        0人打賞金額
        JAVA葵花寶典
        16篇 作品
        2102 總閱讀量
        評論
        您可能感興趣的文章

        項目管理服務(wù)模式

        敏捷項目管理與傳統(tǒng)項目管理比較

        項目管理的特點

        PMO是什么?是管項目經(jīng)理的嘛?

        項目經(jīng)理必須關(guān)注的開會十大關(guān)鍵問題!

        項目的組成要素

        熱門話題 更多話題
        精益生產(chǎn) 質(zhì)量管理 智能制造
        職場效率 項目管理 討教
        AI 大數(shù)據(jù) 六西格瑪
        ×

        給作者打賞,鼓勵TA抓緊創(chuàng)作!

        選擇支付方式
        選擇打賞金額
        注:打賞的收益歸作者,非平臺

        微信掃描支付

        打賞金額: 1元

        ×

        給作者打賞,鼓勵TA抓緊創(chuàng)作!

        您的討教幣
        填寫您打賞討教幣數(shù)量
        輸入密碼

        111

        注:打賞的收益歸作者,非平臺

        微信掃描支付

        打賞金額: 1元

        国产第一亚洲_浪货一天不做就难受呀_欧洲视频在线观看_亚洲精品一区二区三区美女

              9000px;">

                    一区二区三区在线不卡| 一本色道久久综合亚洲精品按摩| 777xxx欧美| 奇米一区二区三区| 久久色.com| 欧美专区在线观看一区| 亚洲国产精品精华液网站| 6080日韩午夜伦伦午夜伦| 日韩有码一区二区三区| 国产日韩精品久久久| 99在线视频精品| 一区二区三区四区精品在线视频| 欧美精品一级二级三级| 韩日欧美一区二区三区| 亚洲高清视频中文字幕| 精品美女一区二区三区| 91麻豆精品一区二区三区| 韩国精品在线观看| 亚洲超丰满肉感bbw| 精品福利在线导航| 欧美日韩一级视频| 欧美狂野另类xxxxoooo| 国产精品久久久久久久久快鸭| 精品成人一区二区三区四区| 久久久久久电影| 日韩伦理免费电影| 香蕉久久一区二区不卡无毒影院| 亚洲国产视频a| 亚洲天堂av一区| 国产精品美日韩| www激情久久| 欧美美女黄视频| 色噜噜久久综合| 91在线视频18| 91麻豆swag| 成人国产精品免费观看动漫| 久久精品av麻豆的观看方式| 亚洲va中文字幕| 香蕉成人伊视频在线观看| 亚洲精品精品亚洲| 亚洲午夜精品久久久久久久久| 亚洲人一二三区| 亚洲精品国产a| 视频一区国产视频| 国产在线乱码一区二区三区| 久久激五月天综合精品| 国产精品一区在线| 蜜臀精品久久久久久蜜臀| 亚洲成人久久影院| 老司机精品视频一区二区三区| 另类小说视频一区二区| 国产精品123| 91蝌蚪porny成人天涯| 欧美视频三区在线播放| 欧美日韩一级二级三级| 91精品国产91热久久久做人人| 日韩精品一区二区在线| 91视视频在线观看入口直接观看www| 日本精品一级二级| 欧美一区二区三区免费大片| 国产调教视频一区| 久久久亚洲精品一区二区三区| 亚洲欧洲精品一区二区三区| 午夜av区久久| 本田岬高潮一区二区三区| 欧美午夜在线一二页| 欧美一区二区黄| 亚洲人成亚洲人成在线观看图片| 美女视频黄免费的久久 | 成人美女视频在线观看| 欧美日韩成人综合天天影院| 中文字幕在线观看一区| 蜜臀av性久久久久av蜜臀妖精| 91国产成人在线| 中文字幕日韩一区| av在线播放一区二区三区| 欧美激情综合网| 国产一二精品视频| 欧美一区二区三区小说| 午夜在线成人av| 久久精品72免费观看| av一区二区三区| 国产欧美一区二区三区在线老狼| 免费的国产精品| 精品伦理精品一区| 精品无人码麻豆乱码1区2区| 精品国产青草久久久久福利| 亚洲一区在线观看网站| 成人精品电影在线观看| 亚洲国产精品高清| 大陆成人av片| 国产欧美一区二区精品婷婷| 国产伦精品一区二区三区在线观看| 欧美成人综合网站| 美脚の诱脚舐め脚责91 | 亚洲精品福利视频网站| 一本大道久久a久久综合| 亚洲影视资源网| 欧美二区三区91| 久久黄色级2电影| 国产欧美日韩精品a在线观看| k8久久久一区二区三区| 亚洲人123区| 欧美日韩视频专区在线播放| 蜜桃一区二区三区四区| 中文一区在线播放| 日韩精品欧美成人高清一区二区| 欧美电影在线免费观看| 老汉av免费一区二区三区 | 中文欧美字幕免费| 欧洲精品在线观看| 毛片不卡一区二区| 国产精品久久久一区麻豆最新章节| 色婷婷av一区二区| 美国精品在线观看| 国产精品久久久久久久久久久免费看 | 精品制服美女久久| 日韩你懂的电影在线观看| 亚洲国产精品久久人人爱| www精品美女久久久tv| 欧美性高清videossexo| 三级一区在线视频先锋| 国产精品美女一区二区三区| 欧美日韩在线播| k8久久久一区二区三区| 蜜臀a∨国产成人精品| 亚洲一区二区成人在线观看| 国产精品丝袜一区| 久久综合九色综合欧美就去吻| 欧美在线一区二区| 99视频国产精品| 国产99久久久国产精品潘金网站| 免费精品视频在线| 日本女优在线视频一区二区| 一区二区三区欧美久久| 亚洲精品免费视频| 亚洲一区二区欧美激情| 亚洲一区在线视频| 亚洲国产视频一区二区| 亚洲国产精品尤物yw在线观看| 亚洲欧美另类在线| 亚洲永久精品大片| 亚洲与欧洲av电影| 日日噜噜夜夜狠狠视频欧美人| 香蕉成人伊视频在线观看| 午夜欧美一区二区三区在线播放| 亚洲mv在线观看| 天天亚洲美女在线视频| 丝袜美腿亚洲综合| 午夜私人影院久久久久| 国产精品盗摄一区二区三区| 久久久久久9999| 午夜在线电影亚洲一区| 一区二区在线观看不卡| 欧美日韩在线电影| 精品视频在线免费| 一本一道久久a久久精品 | 亚洲裸体xxx| 国产亚洲欧美日韩俺去了| 欧美国产一区二区| 国产午夜精品一区二区三区嫩草 | 亚洲色图制服诱惑| 亚洲综合男人的天堂| 亚洲天天做日日做天天谢日日欢| 中文字幕巨乱亚洲| 亚洲综合一区二区三区| 香蕉久久一区二区不卡无毒影院| 丝袜国产日韩另类美女| 天天操天天干天天综合网| 青青国产91久久久久久| 国产一区二区三区久久悠悠色av| 国内偷窥港台综合视频在线播放| 国产剧情一区二区| 色综合久久66| 欧美一级片免费看| 国产精品久久久久久久久动漫| 亚洲一区二区精品久久av| 国产一区在线观看麻豆| 欧美系列一区二区| 欧美一区二区三区免费视频 | 天天综合网天天综合色| 精品伊人久久久久7777人| 99精品视频在线观看| 日韩一卡二卡三卡四卡| 中文字幕在线观看一区二区| 香蕉久久夜色精品国产使用方法| 国产精品一区二区久久不卡| 欧美系列一区二区| 欧美国产日韩在线观看| 日本免费新一区视频| 成人av免费网站| 精品免费视频.| 午夜精品久久久久久久蜜桃app| 成人免费视频播放| 欧美日韩一区国产| 国产精品久久久久久一区二区三区 | 精品国精品自拍自在线| 884aa四虎影成人精品一区| 欧美色爱综合网| 欧美精品一区二区三|
                  1. <s id="6sogc"><tbody id="6sogc"></tbody></s>
                      • <bdo id="6sogc"></bdo>
                        <del id="6sogc"></del>
                        • <abbr id="6sogc"><code id="6sogc"></code></abbr>