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元

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

              亚洲在线1234| 伊人久久大香线| 久久一区精品| 亚洲小说春色综合另类电影| 国产一区久久| 国产精品激情av在线播放| 久久精品视频免费| 亚洲视频一区| 亚洲精品国久久99热| 国产一区二区三区观看| 国产精品xnxxcom| 欧美国产精品v| 久久久久在线观看| 亚洲欧美综合| 亚洲永久免费av| 夜夜夜精品看看| 亚洲毛片av| 亚洲第一在线| 一区免费视频| 国产一区二区三区直播精品电影 | 久久综合伊人77777| 欧美在线亚洲| 欧美一区二区三区成人| 亚洲一区在线播放| 亚洲视频视频在线| 夜夜夜久久久| 亚洲一区二区成人| 亚洲一区精品在线| 亚洲制服丝袜在线| 午夜视频精品| 久久av一区二区| 久久免费黄色| 久久综合九色99| 免费观看亚洲视频大全| 久久午夜电影| 欧美a级理论片| 欧美成人免费小视频| 欧美国产视频在线| 欧美激情一区二区三区高清视频| 另类av一区二区| 欧美激情在线播放| 欧美体内谢she精2性欧美| 欧美吻胸吃奶大尺度电影| 国产精品s色| 国产伦理一区| 亚洲大黄网站| 日韩视频在线你懂得| 正在播放欧美视频| 性久久久久久| 欧美777四色影视在线| 欧美日韩国产影片| 国产精品视频一区二区三区| 国产免费成人| 91久久夜色精品国产九色| 99re6热在线精品视频播放速度| 亚洲图片在线观看| 久久人人爽人人爽爽久久| 男男成人高潮片免费网站| 欧美色精品天天在线观看视频 | 欧美日韩在线三区| 国产美女一区| 亚洲黄色一区| 亚洲欧美国产日韩中文字幕| 久久中文在线| 欧美特黄一级大片| 有坂深雪在线一区| 亚洲免费影视| 欧美日本精品在线| 精品成人一区二区三区四区| 日韩一级黄色大片| 久久久www成人免费精品| 欧美日韩国产一区二区三区地区| 国产精品一区二区久久国产| 亚洲激情不卡| 久久视频在线免费观看| 国产精品久久9| 亚洲激情图片小说视频| 久久av红桃一区二区小说| 欧美日韩亚洲一区二区三区四区 | 亚洲视频欧美在线| 美日韩精品免费观看视频| 国产精品免费看久久久香蕉| 亚洲美女av在线播放| 久久综合中文| 极品尤物av久久免费看| 久久大逼视频| 国产欧美在线观看一区| 亚洲天堂偷拍| 欧美日韩国产专区| 亚洲精品乱码久久久久久蜜桃91| 久久久久久久999| 国产欧美日韩免费看aⅴ视频| 在线亚洲精品| 国产精品二区三区四区| 一本久久综合| 欧美金8天国| 亚洲最新视频在线| 欧美精品在线一区| 亚洲国产影院| 欧美激情综合色| 夜夜嗨av一区二区三区四区| 欧美a级大片| 亚洲伦理一区| 欧美日韩直播| 亚洲一区久久久| 国产精品久久一卡二卡| 亚洲欧美国产一区二区三区| 欧美视频一区二区三区| 亚洲欧美国产不卡| 国产精品一区二区女厕厕| 先锋资源久久| 激情欧美一区二区三区| 蜜臀99久久精品久久久久久软件| 激情久久五月天| 欧美激情精品久久久久久黑人| 亚洲激情电影在线| 欧美日韩精品三区| 亚洲一区在线看| 国产一区二区日韩精品欧美精品| 久久久久久久久岛国免费| 91久久精品国产91久久| 欧美日韩亚洲系列| 欧美在线亚洲一区| 亚洲精品久久久久| 国产精品福利在线观看| 久久久久9999亚洲精品| 亚洲精品日韩精品| 国产欧美日韩激情| 美女主播一区| 亚洲一区成人| 亚洲第一中文字幕在线观看| 欧美日韩视频在线一区二区观看视频| 小嫩嫩精品导航| 亚洲国产成人91精品| 国产精品日韩在线一区| 久久网站免费| 欧美亚洲一级| 日韩一二三在线视频播| 国产主播一区二区三区| 欧美日韩网站| 免费日韩av电影| 香蕉精品999视频一区二区| 最近看过的日韩成人| 国产精品你懂的在线欣赏| 欧美电影打屁股sp| 久久国产精品黑丝| 国产精品99久久久久久久久| 亚洲黄色在线| 国模私拍视频一区| 国产精品午夜视频| 欧美成人首页| 久久夜色精品国产欧美乱| 一本大道久久精品懂色aⅴ| 在线欧美不卡| 一区二区三区在线免费观看| 国产精品久久7| 欧美日韩一区二区国产| 欧美国产高清| 免费观看一级特黄欧美大片| 久久青草久久| 久久精品99久久香蕉国产色戒| 亚洲私人影院在线观看| 日韩一级裸体免费视频| 亚洲激情视频网| 在线观看视频欧美| 影音先锋日韩精品| 激情成人综合网| 激情欧美丁香| 在线观看欧美| **性色生活片久久毛片| 精品动漫一区二区| 在线日本成人| 亚洲激情在线播放| 亚洲破处大片| 中文av一区特黄| 亚洲综合精品四区| 亚洲女优在线| 久久aⅴ国产欧美74aaa| 欧美在线视频播放| 久久人人爽人人爽爽久久| 另类尿喷潮videofree| 蜜月aⅴ免费一区二区三区 | 久久九九全国免费精品观看| 欧美一区=区| 另类专区欧美制服同性| 欧美aⅴ一区二区三区视频| 欧美大片18| 国产精品久久久久久久久久三级| 国产精品国产a级| 国产一区二区三区电影在线观看| 国产一区视频网站| 亚洲激情欧美激情| 一区二区三区你懂的| 午夜精彩视频在线观看不卡| 久久精品中文| 欧美日韩精品久久| 国产日韩欧美一区| 亚洲国产毛片完整版| 在线一区二区视频| 久久久久久综合|
            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>