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

福隆苑居士發表於2022-06-05

前言

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(入口網站),在資料庫中執行建立;

111.png

4、修改SQL指令碼

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

222.png

5、啟動

執行命令:./demo.sh start

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

333.png

6、訪問

啟動後,訪問地址:http://192.168.121.129:8070

預設賬號密碼:apollo admin

444.png

7、簡單使用

1)、建立專案

555.png

666.png

2)、新增配置

777.png

3)、點選發布

888.png

999.png

1010.png


常規用法

注意:

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

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

1、刪除示例專案

1111.png

2、建立新專案

1212.png

1313.png

3、名稱空間

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

1414.png

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

1616.png

4、yml名稱空間

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

1717.png

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

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

拷貝到文字中

1818.png

它會自己轉換

1919.png

最後點選發布即可

2020.png


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的前提下,這是案例環境的截圖,有四個名稱空間。

2121.png

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

2222.png

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、本地快取

阿波羅在本地的快取地址,快取的其實就是這些配置檔案,如果阿波羅掛掉了,專案會訪問這個快取檔案,也不影響專案執行。

2323.png

9、驗證

測試一個介面看是否能獲取到配置資訊

2424.png

啟動後訪問介面

2525.png

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

2626.png

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

2727.png


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



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

相關文章