如下就是這個示例的運行環境,若是版本號不同,區別也應該不會很大,能夠根據實際狀況作相應調整。java
歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。spring
衆所周知,Apollo對CAT是有依賴的,但不是強依賴,而是使用了SPI技術,只有項目裏引用了cat-client纔會生效。目前咱們想把CAT客戶端配置放在Apollo裏,也就是在CAT客戶端初始化以前從Apollo讀取相應配置,這就造成了循環依賴,因此首先要去除Apollo對CAT客戶端的依賴。微信
查看Apollo客戶端的源碼,我發現有一個叫作MessageProducerManager
的接口,再看一下META-INF\services\com.ctrip.framework.apollo.tracer.spi.MessageProducerManager文件,發現這個接口的默認實現是DefaultMessageProducerManager
,若是發現CAT客戶端被引入時,這個類就會初始化CAT客戶端並向CAT客戶端發送消息。MessageProducerManager
接口還有另一個實現,就是NullMessageProducerManager
類,這個類返回的是NullMessageProducer實例,任何消息都不發送。app
想要去除CAT的依賴,在項目裏使用NullMessageProducerManager
的實現就能夠了。在META-INF\services\文件夾中建立以下文件:
com.ctrip.framework.apollo.tracer.spi.MessageProducerManager
並添加以下內容:
com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManager
dom
歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。maven
引入CAT客戶端時,我遇到的一個大坑,因此告誡你們:千萬不要使用源碼中cat-client打包出來的客戶端。由於源碼中的cat-client是舊代碼,已經不維護了。這裏吐槽一下:不維護了爲何不立刻刪除,害的我讀了一個星期的舊代碼。最新的源碼在lib/java目錄下,能夠本身用maven打包,或者在pom.xml添加Maven依賴:url
<dependency> <groupId>com.dianping.cat</groupId> <artifactId>cat-client</artifactId> <version>3.0.0</version> </dependency>
另外,還有在repositories節點中增長以下庫,不然是沒法下載到jar包的。spa
<repository> <id>Unidal</id> <url>http://unidal.org/nexus/content/repositories/releases</url> </repository>
歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。rest
初始化CAT客戶端,咱們要作的就是在spring boot初始化時,讀取Apollo配置,再初始化CAT客戶端。示例以下:code
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; import com.dianping.cat.Cat; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; /** * @author 萬貓學社 */ @Slf4j @Configuration @EnableApolloConfig public class AppConfig { /** * 每一個項目的domain都是不一樣的 * 因此不要從Apollo中讀取 * 這裏使用的Apollo的app.id */ @Value("${app.id}") private String domain; /** * CAT服務端的端口,從Apollo中讀取 */ @Value("${cat.server.port}") private int port; /** * CAT服務端的HTTP端口,從Apollo中讀取 */ @Value("${cat.server.http.port}") private int httpPort; /** * CAT服務端的IP列表,多個以逗號分隔,從Apollo中讀取 */ @Value("${cat.server.servers}") private String servers; /** * 初始化CAT客戶端 */ @PostConstruct public void initCat() { try { Cat.initializeByDomain(domain, port, httpPort, servers.split(",")); } catch (Exception e) { log.error("Initialization of CAT client failed", e); } } }
歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。
總結一下,CAT客戶端從Apollo中讀取配置,總共分3步:
MessageProducerManager
接口使用NullMessageProducerManager
類實現。歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。