「Java分享客棧」Nacos設定中心稱王稱霸,我Apollo一生也不弱於人!

2022-06-05 18:02:27

前言

Apollo又稱阿波羅設定中心,在前兩年還是挺火的,但阿里SpringCloud套件席捲國內之後,nacos就成為了最被親睞的分散式設定中心,nacos是設定中心和註冊中心二合一的產品,單純功能上Apollo其實更強大一些。本篇就把Apollo的安裝及使用分享給大家。


安裝

1、安裝包

1)、GitHub下載:https://github.com/nobodyiam/apollo-build-scripts

2)、網路硬碟下載:https://github.com/ctripcorp/apollo/wiki/Quick-Start(看這個檔案下面給的網路硬碟連結)

2、環境要求

虛擬機器器:記憶體2G+

JDK:java1.8k環境

資料庫:mysql在5.7+(如果在低版本資料庫執行阿波羅結構時,預設是不能支援在一個表中有兩個時間戳型別欄位,所以建議大家使用mysql在5.7以上。)

3、建立資料庫表

去Github上下載最新的apollo-build-scripts-master 整個阿波羅環境包

建立兩個資料庫

在apollo-build-scripts-master\sql目錄下有兩個SQL檔案:分別為:apolloconfigdb(存放組態檔資訊)、apolloportaldb(入口網站),在資料庫中執行建立;

4、修改SQL指令碼

修改apollo安裝指令碼demo.sh,修改其中的資料庫連線資訊和相關服務地址資訊。

5、啟動

執行命令:./demo.sh start

PS:記得關閉防火牆,如果連的是遠端資料庫,記得開放mysql使用者的許可權,root@'%',也別用本機資料庫,虛擬機器器可能ping不通本機,連不上本機資料庫。

6、存取

啟動後,存取地址:http://192.168.121.129:8070

預設賬號密碼:apollo admin

7、簡單使用

1)、建立專案

2)、新增設定

3)、點選釋出


常規用法

注意:

1)、這裡範例使用的是renren-fast,是單一專案,所以就建立一個apollo專案即可,然後可以建立多個namespace,存放不同環境的組態檔(開發、測試、生產);

2)、如果是微服務專案,那麼給每一個微服務都建立一個apollo專案,應用ID是每個微服務的appId,應用名稱也儘量見名知意。

1、刪除範例專案

2、建立新專案

3、名稱空間

可以建立不同環境的組態檔名稱空間,並且可以展開伸縮。

PS:這裡是測試,真實環境最好按照規範比如renren.user這樣來命名。

4、yml名稱空間

如果是yml名稱空間,就直接文字拷貝進來。

如果是預設的properties名稱空間,自己專案的設定是yml格式,就要先進行轉換,然後拷貝到文字中。

yml轉properties轉換工具:yml轉properties工具

拷貝到文字中

它會自己轉換

最後點選釋出即可


SpringBoot整合

1、問題說明

使用阿波羅注意事項:

1)、本地快取地址:windows:C:\opt\data\,Linux:/opt/data

2)、本地環境設定地址:windows:C:\opt\settings,Linux:/opt/settings

3)、如果設定完成後可以讀取到apollo釋出的設定資訊,但是修改後再發布,發現專案獲取不到最新的,需要檢查一下本地快取地址data目錄下的組態檔是否更新,或者是否存在這個快取檔案,如果不存在,說明根本沒有快取成功,這個名稱空間大概有問題。

PS:這裡筆者出現的問題就是本地根本沒快取application-dev這個名稱空間的設定資訊,因為我建立的時候用的是yml格式,刪掉後我改用properties格式,然後就可以了。

2、前情回顧

在前面搭建Apollo環境OK的前提下,這是案例環境的截圖,有四個名稱空間。

3、官方檔案

1)、Apollo使用指南:https://github.com/ctripcorp/apollo/wiki/Apollo使用指南

2)、java樣例使用者端啟動:https://github.com/ctripcorp/apollo/wiki/Apollo開發指南#23-java樣例使用者端啟動

3)、spring-boot整合方式推薦:https://github.com/ctripcorp/apollo/wiki/Java使用者端使用指南#3213-spring-boot整合方式推薦

4、引入依賴

<!-- apollo依賴 -->
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.1.0</version>
</dependency>

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-core</artifactId>
    <version>1.1.0</version>
</dependency>

5、組態檔

刪掉專案原本的application.yml等組態檔,在resources下新建一個application.properties檔案。

app.id=renren-fast
apollo.meta=http://192.168.1.128:8080
# 注入非預設application namespace或多個namespace的設定範例
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application,application-dev,application-prod,application-test

6、啟動註解

啟動類加上開啟Apollo的註解:@EnableApolloConfig

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableApolloConfig
public class RenrenApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(RenrenApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
        return app.sources(RenrenApplication.class);
    }

}

7、修改環境

可選項,這個settings/server.properties也可以不建立,在需要切換不同環境時才需要。

修改/opt/settings/server.properties(Mac/Linux)或 C:\opt\settings\server.properties(Windows)檔案,沒有目錄就新建出來,設定env為DEV:env=DEV

說明:

1)、這個環境設定的意義,可以參考:https://github.com/ctripcorp/apollo/wiki/Java使用者端使用指南#3213-spring-boot整合方式推薦,搜尋鍵碼env=DEV,也可以自己去網上找資料;

2)、這個C:\opt\settings\server.properties是需要自己建立的,不會自己生成。

8、本地快取

阿波羅在原生的快取地址,快取的其實就是這些組態檔,如果阿波羅掛掉了,專案會存取這個快取檔案,也不影響專案執行。

9、驗證

測試一個介面看是否能獲取到設定資訊

啟動後存取介面

檢視是否有列印出資料來源url

修改一下設定後再發布,看是否會重新整理:發現刪掉的部分已經沒了。


Java動態讀取設定

此案例參考了每特教育的案例:

閘道器內整合了swagger檔案,把swagger寫死的部分作為json儲存在apollo中,閘道器服務通過java程式碼動態獲取apollo儲存的json資訊,賦給swagger檔案實現。

1、閘道器程式碼

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableSwagger2Doc
@EnableApolloConfig
public class AppGateWay {

      // 獲取ApolloConfig
      @ApolloConfig
      private Config appConfig;

      public static void main(String[] args) {
            SpringApplication.run(AppGateWay.class, args);
      }

      // 新增檔案來源
      @Component
      @Primary
      class DocumentationConfig implements SwaggerResourcesProvider {

            @Override
            public List<SwaggerResource> get() {

                  // 開啟監聽,組態檔發生改變需要更改
                  appConfig.addChangeListener(new ConfigChangeListener() {

                       @Override
                       public void onChange(ConfigChangeEvent changeEvent) {
                             get();
                       }
                  });
                  return resources();
            }

            /**
             * 從阿波羅伺服器中獲取resources
             *
             * @return
             */
            private List<SwaggerResource> resources() {

                  List resources = new ArrayList<>();
                  // app-itmayiedu-order
                  // 閘道器使用服務別名獲取遠端服務的SwaggerApi
                  String swaggerDocJson = swaggerDocument();
                  JSONArray jsonArray = JSONArray.parseArray(swaggerDocJson);
                  for (Object object : jsonArray) {
                       JSONObject jsonObject = (JSONObject) object;
                       String name = jsonObject.getString("name");
                       String location = jsonObject.getString("location");
                       String version = jsonObject.getString("version");
                       resources.add(swaggerResource(name, location, version));
                  }
                  return resources;
            }

            /**
             * 獲取swaggerDocument設定
             * 這裡使用apollo提供的config來獲取mayikt.zuul.swaggerDocument這個key對應的json值
             * @return
             */
            private String swaggerDocument() {
                  String property = appConfig.getProperty("mayikt.zuul.swaggerDocument", "");
                  return property;
            }

            private SwaggerResource swaggerResource(String name, String location, String version) {
                  SwaggerResource swaggerResource = new SwaggerResource();
                  swaggerResource.setName(name);
                  swaggerResource.setLocation(location);
                  swaggerResource.setSwaggerVersion(version);
                  return swaggerResource;
            }
      }

}

2、新建key-value

在apollo中對應的名稱空間內新建一個key-value:mayikt.zuul.swaggerDocument,對應上面config.getProperty("mayikt.zuul.swaggerDocument",""),後面空表示沒取到就返回空串。

key:mayikt.zuul.swaggerDocument

value是如下內容:

[
    {
        "name": "app-mayikt-member",
        "location": "/app-mayikt-member/v2/api-docs",
        "version": "2.0"
    },
    {
        "name": "app-mayikt-weixin",
        "location": "/app-mayikt-weixin/v2/api-docs",
        "version": "2.0"
    }
]

監聽Apollo

PS:這個監聽類會在專案啟動後自動開啟一個執行緒和apollo建立長連線,監聽apollo設定的變化並列印出紀錄檔。切忌使用AOP或者放在get方法裡面,這樣會開啟很多執行緒和apollo連線,導致系統CPU飆高。

新增下面一個監聽類即可:

@Component
@Slf4j
public class MyCommandLineRunner implements CommandLineRunner {

      @ApolloConfig
      private Config config;

      @Override
      public void run(String... args) throws Exception {
        config.addChangeListener(new ConfigChangeListener() {
              @Override
              public void onChange(ConfigChangeEvent changeEvent) {
                   log.debug("分散式設定中心監聽: {}", changeEvent.changedKeys().toString());
              }
        });
      }

}

總結

Apollo設定中心是攜程團隊精心創作的開源產品,哪怕現在Nacos如日中天,Apollo也依然受到很多專案團隊的歡迎。有些公司的研發團隊開發專案並不一定會使用阿里微服務套件,像Apollo這樣的元件就會成為選項之一,大家感興趣的話可以嘗試一下新版本的使用,也可以收藏本篇,以後若用到翻出來參考即可。


分享

8年多工作及學習過程中在雲筆記中記錄了很多內容,我閒暇之餘都做了下整理,本篇只是其中之一,有感興趣的朋友可以私信我獲取,什麼時候用到了翻開說不定就能節省很多時間。



本人原創文章純手打,覺得有一滴滴幫助就請點個推薦吧~
本人持續分享實際工作經驗和主流技術,喜歡的話可以關注下哦~