如下就是这个示例的运行环境,若是版本号不同,区别也应该不会很大,能够根据实际状况作相应调整。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技术干货。