<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 整合攜程 Apollo 配置中心

          共 10464字,需瀏覽 21分鐘

           ·

          2021-07-11 07:01

          作者:AaronSimon

          blog.csdn.net/AaronSimon/article/details/83657612

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

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

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

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

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

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

          本文的重點(diǎn)在于Apollo在客戶端的使用,所以Apollo服務(wù)端使用的是官網(wǎng)提供的 Quick Start(針對(duì)本地測(cè)試使用),后續(xù)文章會(huì)專門講述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)對(duì)timestamp使用了多個(gè)default聲明,所以需要5.6.5以上版本。筆者本地使用的是8.0.13版本

          3.  下載 Quick Start

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

          1.2 安裝步驟

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

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

          1.2.1.1 創(chuàng)建ApolloPortalDB

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

          source /your_local_path/sql/apolloportaldb.sql

          導(dǎo)入成功后,可以通過(guò)執(zhí)行以下sql語(yǔ)句來(lái)驗(yàn)證:

          select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
          IdAppIdName
          1SampleAppSample App
          1.2.1.2 創(chuàng)建ApolloConfigDB

          通過(guò)各種Mysql客戶端(Navicat,DataGrip等)導(dǎo)入sql/apolloconfigdb.sql即可

          下面以MySQL原生客戶端為例:

          source /your_local_path/sql/apolloconfigdb.sql

          導(dǎo)入成功后,可以通過(guò)執(zhí)行以下sql語(yǔ)句來(lái)驗(yàn)證:

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

          NamespaceIdKeyValueComment
          1timeout100sample


          1.2.2 配置數(shù)據(jù)庫(kù)連接信息

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

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

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

          1.3 啟動(dòng)Apollo配置中心

          1.3.1 確保端口未被占用

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

          lsof -i:8080

          在windows下,可以通過(guò)如下命令檢查:

          netstat -aon|findstr "8080"

          1.3.2 執(zhí)行啟動(dòng)腳本

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

          ./demo.sh start

          當(dāng)看到如下輸出后,就說(shuō)明啟動(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 異常排查

          如果啟動(dòng)遇到了異常,可以分別查看service和portal目錄下的log文件排查問(wèn)題。

          注: 在啟動(dòng)apollo-configservice的過(guò)程中會(huì)在日志中輸出eureka注冊(cè)失敗的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,這個(gè)是預(yù)期的情況,因?yàn)閍pollo-configservice需要向Meta Server(它自己)注冊(cè)服務(wù),但是因?yàn)樵趩?dòng)過(guò)程中,自己還沒(méi)起來(lái),所以會(huì)報(bào)這個(gè)錯(cuò)。后面會(huì)進(jìn)行重試的動(dòng)作,所以等自己服務(wù)起來(lái)后就會(huì)注冊(cè)正常了。

          1.4 使用Apollo配置中心

          1.4.1 查看樣例配置

          1.瀏覽器訪問(wèn)http://localhost:8070

          圖片

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

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

          圖片

          配置中心中包含一個(gè)默認(rèn)的項(xiàng)目SampleApp

          3.點(diǎn)擊SampleApp進(jìn)入配置界面,可以看到當(dāng)前有一個(gè)配置timeout=100

          圖片

          如果提示系統(tǒng)出錯(cuò),請(qǐng)重試或聯(lián)系系統(tǒng)負(fù)責(zé)人,請(qǐng)稍后幾秒鐘重試一下,因?yàn)橥ㄟ^(guò)Eureka注冊(cè)的服務(wù)有一個(gè)刷新的延時(shí)。

          1.4.2 新增項(xiàng)目配置

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

          1.點(diǎn)擊新建項(xiàng)目

          圖片

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

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

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

          2.新增配置信息

          點(diǎn)擊新增配置,填寫(xiě)配置信息

          圖片

          點(diǎn)擊提交,此時(shí)配置還未生效。

          圖片

          3.發(fā)布配置

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

          4.回滾

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

          二、Apollo配置中心客戶端

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

          2.1 客戶端搭建

          1.添加Apollo客戶端依賴

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

          目前最新版本為1.1.1

          2.添加配置信息

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

          3.開(kāi)啟Apollo客戶端

          在項(xiàng)目的啟動(dòng)類上添加@EnableApolloConfig注解

          在項(xiàng)目的啟動(dòng)類上添加@EnableApolloConfig注解

          4.新增一個(gè)測(cè)試接口

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

          5.啟動(dòng)服務(wù)測(cè)試

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

          2.2 客戶端用法

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

          2.2.1 Spring Placeholder的使用

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

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

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

          2.2.1.1 Java Config使用方式

          1.新建配置類JavaConfigBean如下:

          /**
           * Java Config方式
           *
           * @author simon
           **/

          @Configuration
          public class JavaConfigBean {
            @Value("${timeout:20}")
            private int timeout;

            public int getTimeout() {
              return timeout;
            }
          }

          2.新增訪問(wèn)端點(diǎn)

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

            @RequestMapping("/index1")
            public String hello1(){
              return javaConfigBean.getTimeout()+"";
            }

          3.測(cè)試

          瀏覽器訪問(wèn)http://127.0.0.1:8080/index1,正確返回配置的值

          2.2.1.2 ConfigurationProperties使用方式

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

          1.新增配置類SampleRedisConfig如下:

          /**
           * ConfigurationProperties使用方式
           *
           * @author simon
           **/

          @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.新增訪問(wèn)端點(diǎn)

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

            @RequestMapping("/index2")
            public String hello2(){
              return sampleRedisConfig.getCommandTimeout()+"--"+sampleRedisConfig.getExpireSeconds();
            }

          3.測(cè)試

          瀏覽器訪問(wèn)http://127.0.0.1:8080/index2,正確返回配置的值

          注: @ConfigurationProperties如果需要在Apollo配置變化時(shí)自動(dòng)更新注入的值,需要配合使用EnvironmentChangeEventRefreshScope。這個(gè)我會(huì)在后續(xù)文章中詳細(xì)描述。

          2.2.2 Spring Annotation支持

          Apollo同時(shí)還增加了幾個(gè)新的Annotation來(lái)簡(jiǎn)化在Spring環(huán)境中的使用。

          • @ApolloConfig用來(lái)自動(dòng)注入Config對(duì)象

          • @ApolloConfigChangeListener用來(lái)自動(dòng)注冊(cè)ConfigChangeListener

          • @ApolloJsonValue用來(lái)把配置的json字符串自動(dòng)注入為對(duì)象

          2.2.2.1 @ApolloConfig的使用

          1.新增訪問(wèn)端點(diǎn)

          // 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.測(cè)試

          瀏覽器訪問(wèn)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.測(cè)試

          在Apollo服務(wù)端修改timeout配置的值為300,發(fā)布后,控制臺(tái)打印300

          2.2.2.3 @ApolloJsonValue的使用

          1.新增User如下:

          /**
           * 用戶
           *
           * @author simon
           **/

          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.測(cè)試

          瀏覽器訪問(wèn)http://127.0.0.1:8080/index4,正確打印配置的值

          源碼下載

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

          --END--


          分享一下我寫(xiě)的《10萬(wàn)字Springboot經(jīng)典學(xué)習(xí)筆記》中,點(diǎn)擊下面小卡片,進(jìn)入【Java禿頭哥】,回復(fù):筆記,即可免費(fèi)獲取。

          點(diǎn)贊是最大的支持 

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼网123 | 日本免费黄色电影视频 | 在线免费观看黄色的视频网站 | 国产一级二级三级在线观看 | 国产精品第二页 |