本篇文章給大家分享的是有關(guān)SpringCloud-Apollo在Java中的使用是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司從2013年成立,先為古交等服務(wù)建站,古交等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為古交企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
加入 Apollo Client 的 Maven 依賴,代碼如下所示。
com.ctrip.framework.apollo apollo-client 1.1.0
使用 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)即可。
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 的地址。
目前我們用的快速啟動包只有一個(gè) DEV 環(huán)境,config service 的地址是 http://localhost:8080,這個(gè)已經(jīng)在啟動腳本 demo.sh 中定義好了。
為了能夠讓示例代碼在各位讀者的電腦上也能直接運(yùn)行,我們將配置定在 classpath:/META-INF/app.properties 中。內(nèi)容為 apollo.meta=http://localhost:8080。
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。
Environment 跟項(xiàng)目本身沒有關(guān)系,一個(gè)項(xiàng)目可以部署在不同的環(huán)境中,代碼不需要改變,需要變化的只是配置值而已。所以 Environment 的配置不能配置在項(xiàng)目中,最常用的有如下兩種配置方式。
可以通過 Java 的 System Property env 來指定環(huán)境。
在 Java 程序啟動腳本中,可以指定 -Denv=YOUR-ENVIRONMENT。
如果是運(yùn)行 jar 文件,需要注意格式為 java-Denv=YOUR-ENVIRONMENT-jar xxx.jar。
注意 key 為全小寫。
最后一個(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 的啟動參數(shù)中指定,要么就在 main 方法的第一行通過代碼指定(僅供開發(fā)演示用,不能用于生產(chǎn)環(huán)境)。具體代碼所示。
public static void main(String[] args) { System.setProperty("env", "DEV");// ....}
所有配置完成之后,我們再次運(yùn)行前面的示例代碼,可以看到輸出的內(nèi)容就是我們自己配置的值。
在某些場景下,當(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
首先準(zhǔn)備一個(gè) Spring Boot 項(xiàng)目,加入 Apollo Client 的 Maven 依賴,具體代碼如下所示:
com.ctrip.framework.apollo apollo-client 1.1.0
然后配置 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)目啟動的 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); } }
Placeholder 注入配置代碼如下所示。
/** * 用戶名, 默認(rèn)值為zhangsan */@Value("${username:zhangsan}")private String username;
Java Config 使用方式具體代碼如下所示。
@Data@Configurationpublic class UserConfig {@Value("${username:zhangsan}") private String username; }
使用 Config 配置類注入具體代碼如下所示:
@Autowiredprivate UserConfig userConfig;
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í)不會自動刷新,而是需要手動實(shí)現(xiàn)刷新邏輯,筆者建議大家不要使用這種方式,比較繁瑣。
如果有配置需要加統(tǒng)一前綴的方式可以用 Java Config 的方式代替。
用來自動注入 Apollo Config 對象,代碼如下所示。
@ApolloConfigprivate Config config;@GetMapping("/config/getUserName3")public String getUserName3() {return config.getProperty("username", "zhangsan"); }
用來自動注冊 ConfigChangeListener,代碼如下所示。
@ApolloConfigChangeListenerprivate void someOnChange(ConfigChangeEvent changeEvent) {if(changeEvent.isChanged("username")) { System.out.println("username發(fā)生修改了"); } }
用來把配置的 JSON 字符串自動注入為對象。
定義一個(gè)實(shí)體類,代碼如下所示。
@Datapublic class Student {private int id;private String name; }
對象注入,代碼如下所示。
@ApolloJsonValue("${stus:[]}")private Liststus;
后臺增加配置內(nèi)容如下:
stus = [{"id":1,"name":"jason"}]
以上就是SpringCloud-Apollo在Java中的使用是怎樣的,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。