您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關SpringCloud-Apollo在Java中的使用是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
加入 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 是當配置中心找不到配置的時候返回的默認值,避免空指針異常。
運行上面這段代碼,輸出的結果是默認值“張三”。因為我們還沒有指定 Apollo 需要的一些必要信息,這些信息包括 Meta Server、AppId 和 Environment。Cluster 可以不用指定,用默認即可。
Apollo 支持應用在不同的環境中有不同的配置,所以需要運行提供給 Apollo 客戶端當前環境的 Apollo Meta Server 信息。
在默認情況下,meta server 和 config service 是部署在同一個 JVM 進程里的,所以 meta server 的地址就是 config service 的地址。
目前我們用的快速啟動包只有一個 DEV 環境,config service 的地址是 http://localhost:8080,這個已經在啟動腳本 demo.sh 中定義好了。
為了能夠讓示例代碼在各位讀者的電腦上也能直接運行,我們將配置定在 classpath:/META-INF/app.properties 中。內容為 apollo.meta=http://localhost:8080。
APPid 是應用的身份信息,是從服務端獲取配置的一個重要信息。同樣 APPid 的配置方式也有多種,我們采用跟 Meta Server 一樣的方式,配置在 classpath:/META-INF/app.properties 中。內容為 app.id=SampleApp。
SampleApp 在 Portal 的項目主頁面中有展示,如果是你自己新建的項目,那么就是你自定義的 AppId。
Environment 跟項目本身沒有關系,一個項目可以部署在不同的環境中,代碼不需要改變,需要變化的只是配置值而已。所以 Environment 的配置不能配置在項目中,最常用的有如下兩種配置方式。
可以通過 Java 的 System Property env 來指定環境。
在 Java 程序啟動腳本中,可以指定 -Denv=YOUR-ENVIRONMENT。
如果是運行 jar 文件,需要注意格式為 java-Denv=YOUR-ENVIRONMENT-jar xxx.jar。
注意 key 為全小寫。
最后一個推薦的方式是通過配置文件來指定 env=YOUR-ENVIRONMENT。
對于 Mac/Linux,文件位置為 /opt/settings/server.properties。
對于 Windows,文件位置為 C:\opt\settings\server.properties。
server.properties 內容為 env=DEV。
同樣的,為了能夠讓示例代碼能夠更方便地在各位讀者的電腦上運行,我們就用 ava System Property 的方式來指定 Environment,要么在 IDE 的啟動參數中指定,要么就在 main 方法的第一行通過代碼指定(僅供開發演示用,不能用于生產環境)。具體代碼所示。
public static void main(String[] args) { System.setProperty("env", "DEV");// ....}
所有配置完成之后,我們再次運行前面的示例代碼,可以看到輸出的內容就是我們自己配置的值。
在某些場景下,當配置發生變化的時候,我們需要進行一些特殊的處理。比如,數據庫連接串變化后需要重建連接等,就可以使用 API 提供的監聽機制。具體代碼如下所示。
config.addChangeListener(new ConfigChangeListener() {public void onChange(ConfigChangeEvent changeEvent) { System.out.println("發生修改數據的命名空間是:" + changeEvent.getNamespace());for (String key : changeEvent.changedKeys()) { ConfigChange change = changeEvent.getChange(key); System.out.println( String.format("發現修改 - 配置key: %s, 原來的值: %s, 修改后的值: %s, 操作類型: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType())); } } });
當我們在 Portal 中進行修改配置時,就會觸發監聽事件,輸出結果為:
發生修改數據的命名空間是:application 發現修改 - 配置key: username, 原來的值: zhangsan, 修改后的值: zhangsan1, 操作類型: MODIFIED
首先準備一個 Spring Boot 項目,加入 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:項目啟動的 bootstrap 階段,向 Spring 容器注入配置信息。
apollo.bootstrap.namespaces:注入命名空間。
環境同樣在 main 方法中指定,代碼如下所示。
@SpringBootApplicationpublic class App {public static void main(String[] args) {// 指定環境(僅供開發演示用, 不能用于生產環境))System.setProperty("env", "DEV"); SpringApplication.run(App.class, args); } }
Placeholder 注入配置代碼如下所示。
/** * 用戶名, 默認值為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 配置項即可實現注入,配置內容如下:
redis.cache.host = 192.168.1.1
ConfigurationProperties 方式有個缺點,當配置的值發生變化時不會自動刷新,而是需要手動實現刷新邏輯,筆者建議大家不要使用這種方式,比較繁瑣。
如果有配置需要加統一前綴的方式可以用 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發生修改了"); } }
用來把配置的 JSON 字符串自動注入為對象。
定義一個實體類,代碼如下所示。
@Datapublic class Student {private int id;private String name; }
對象注入,代碼如下所示。
@ApolloJsonValue("${stus:[]}")private List<Student> stus;
后臺增加配置內容如下:
stus = [{"id":1,"name":"jason"}]
以上就是SpringCloud-Apollo在Java中的使用是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。