溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringCloud-Apollo在Java中的使用是怎樣的

發(fā)布時(shí)間:2021-09-29 14:17:09 來源:億速云 閱讀:126 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關(guān)SpringCloud-Apollo在Java中的使用是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

普通 Java 項(xiàng)目中使用

加入 Apollo Client 的 Maven 依賴,代碼如下所示。

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

使用 API 的方式來獲取配置,具體代碼如下所示。

public class App {public static void main(String[] args) {
        Config config = ConfigService.getAppConfig();String key = "username";String defaultValue = "張三";String username = config.getProperty(key, defaultValue);
        System.out.println("username=" + username);
    }
}

通過 ConfigService 得到 Config 對象,config.getProperty() 方法可以傳入你想獲取的配置 Key,defaultValue 是當(dāng)配置中心找不到配置的時(shí)候返回的默認(rèn)值,避免空指針異常。

運(yùn)行上面這段代碼,輸出的結(jié)果是默認(rèn)值“張三”。因?yàn)槲覀冞€沒有指定 Apollo 需要的一些必要信息,這些信息包括 Meta Server、AppId 和 Environment。Cluster 可以不用指定,用默認(rèn)即可。

1. Meta Server 配置

Apollo 支持應(yīng)用在不同的環(huán)境中有不同的配置,所以需要運(yùn)行提供給 Apollo 客戶端當(dāng)前環(huán)境的 Apollo Meta Server 信息。

在默認(rèn)情況下,meta server 和 config service 是部署在同一個(gè) JVM 進(jìn)程里的,所以 meta server 的地址就是 config service 的地址。

目前我們用的快速啟動(dòng)包只有一個(gè) DEV 環(huán)境,config service 的地址是 http://localhost:8080,這個(gè)已經(jīng)在啟動(dòng)腳本 demo.sh 中定義好了。

為了能夠讓示例代碼在各位讀者的電腦上也能直接運(yùn)行,我們將配置定在 classpath:/META-INF/app.properties 中。內(nèi)容為 apollo.meta=http://localhost:8080。

2. APPid 配置

APPid 是應(yīng)用的身份信息,是從服務(wù)端獲取配置的一個(gè)重要信息。同樣 APPid 的配置方式也有多種,我們采用跟 Meta Server 一樣的方式,配置在 classpath:/META-INF/app.properties 中。內(nèi)容為 app.id=SampleApp。

SampleApp 在 Portal 的項(xiàng)目主頁面中有展示,如果是你自己新建的項(xiàng)目,那么就是你自定義的 AppId。

3. Environment 配置

Environment 跟項(xiàng)目本身沒有關(guān)系,一個(gè)項(xiàng)目可以部署在不同的環(huán)境中,代碼不需要改變,需要變化的只是配置值而已。所以 Environment 的配置不能配置在項(xiàng)目中,最常用的有如下兩種配置方式。

1)通過 Java System Property
  • 可以通過 Java 的 System Property env 來指定環(huán)境。

  • 在 Java 程序啟動(dòng)腳本中,可以指定 -Denv=YOUR-ENVIRONMENT。

  • 如果是運(yùn)行 jar 文件,需要注意格式為 java-Denv=YOUR-ENVIRONMENT-jar xxx.jar。

  • 注意 key 為全小寫。

2)通過配置文件
  • 最后一個(gè)推薦的方式是通過配置文件來指定 env=YOUR-ENVIRONMENT。

  • 對于 Mac/Linux,文件位置為 /opt/settings/server.properties。

  • 對于 Windows,文件位置為 C:\opt\settings\server.properties。


server.properties 內(nèi)容為 env=DEV。

同樣的,為了能夠讓示例代碼能夠更方便地在各位讀者的電腦上運(yùn)行,我們就用 ava System Property 的方式來指定 Environment,要么在 IDE 的啟動(dòng)參數(shù)中指定,要么就在 main 方法的第一行通過代碼指定(僅供開發(fā)演示用,不能用于生產(chǎn)環(huán)境)。具體代碼所示。

public static void main(String[] args) {
    System.setProperty("env", "DEV");// ....}

所有配置完成之后,我們再次運(yùn)行前面的示例代碼,可以看到輸出的內(nèi)容就是我們自己配置的值。

4. 監(jiān)聽配置變化事件

在某些場景下,當(dāng)配置發(fā)生變化的時(shí)候,我們需要進(jìn)行一些特殊的處理。比如,數(shù)據(jù)庫連接串變化后需要重建連接等,就可以使用 API 提供的監(jiān)聽機(jī)制。具體代碼如下所示。

config.addChangeListener(new ConfigChangeListener() {public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("發(fā)生修改數(shù)據(jù)的命名空間是:" + changeEvent.getNamespace());for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.println(
                    String.format("發(fā)現(xiàn)修改 - 配置key: %s, 原來的值: %s, 修改后的值: %s, 操作類型: %s", 
                            change.getPropertyName(),
                            change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});

當(dāng)我們在 Portal 中進(jìn)行修改配置時(shí),就會觸發(fā)監(jiān)聽事件,輸出結(jié)果為:

發(fā)生修改數(shù)據(jù)的命名空間是:application
發(fā)現(xiàn)修改 - 配置key: username, 原來的值: zhangsan, 修改后的值: zhangsan1, 操作類型: MODIFIED

Spring Boot 中使用

首先準(zhǔn)備一個(gè) Spring Boot 項(xiàng)目,加入 Apollo Client 的 Maven 依賴,具體代碼如下所示:

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

然后配置 Apollo 的信息,配置放在 application.properties 中:

app.id=SampleAppapollo.meta=http://localhost:8080apollo.bootstrap.enabled=trueapollo.bootstrap.namespaces=application

其中,

  • app.id:身份信息。

  • apollo.meta:Meta Server(Config Service)。

  • apollo.bootstrap.enabled:項(xiàng)目啟動(dòng)的 bootstrap 階段,向 Spring 容器注入配置信息。

  • apollo.bootstrap.namespaces:注入命名空間。

環(huán)境同樣在 main 方法中指定,代碼如下所示。

@SpringBootApplicationpublic class App {public static void main(String[] args) {// 指定環(huán)境(僅供開發(fā)演示用, 不能用于生產(chǎn)環(huán)境))System.setProperty("env", "DEV");
        SpringApplication.run(App.class, args);
    }
}
1. Placeholder 注入配置

Placeholder 注入配置代碼如下所示。

/**
* 用戶名, 默認(rèn)值為zhangsan
*/@Value("${username:zhangsan}")private String username;
2. Java Config 使用方式

Java Config 使用方式具體代碼如下所示。

@Data@Configurationpublic class UserConfig {@Value("${username:zhangsan}")
    private String username;
}

使用 Config 配置類注入具體代碼如下所示:

@Autowiredprivate UserConfig userConfig;
3. ConfigurationProperties 使用方式

ConfigurationProperties 的使用方法具體代碼如下所示。

@Data@Configuration@ConfigurationProperties(prefix = "redis.cache")
public class RedisConfig {private String host;
}

配置中心只需要增加 redis.cache.host 配置項(xiàng)即可實(shí)現(xiàn)注入,配置內(nèi)容如下:

redis.cache.host = 192.168.1.1

ConfigurationProperties 方式有個(gè)缺點(diǎn),當(dāng)配置的值發(fā)生變化時(shí)不會自動(dòng)刷新,而是需要手動(dòng)實(shí)現(xiàn)刷新邏輯,筆者建議大家不要使用這種方式,比較繁瑣。

如果有配置需要加統(tǒng)一前綴的方式可以用 Java Config 的方式代替。

4. Spring Annotation 支持
1)@ApolloConfig

用來自動(dòng)注入 Apollo Config 對象,代碼如下所示。

@ApolloConfigprivate Config config;@GetMapping("/config/getUserName3")public String getUserName3() {return config.getProperty("username", "zhangsan");
}
2)@ApolloConfigChangeListener

用來自動(dòng)注冊 ConfigChangeListener,代碼如下所示。

@ApolloConfigChangeListenerprivate void someOnChange(ConfigChangeEvent changeEvent) {if(changeEvent.isChanged("username")) {
        System.out.println("username發(fā)生修改了");
    }
}
3)@ApolloJsonValue

用來把配置的 JSON 字符串自動(dòng)注入為對象。

定義一個(gè)實(shí)體類,代碼如下所示。

@Datapublic class Student {private int id;private String name;
}

對象注入,代碼如下所示。

@ApolloJsonValue("${stus:[]}")private List<Student> stus;

后臺增加配置內(nèi)容如下:

stus = [{"id":1,"name":"jason"}]

以上就是SpringCloud-Apollo在Java中的使用是怎樣的,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI