当前位置: 首页 > 后端技术 > Java

CAT客户端如何读取Apollo的配置?

时间:2023-04-01 19:32:03 Java

运行环境下面是本例的运行环境。如果版本号不同,应该相差不会很大,可以根据实际情况做相应的调整。JDK8springboot2.0.7.RELEASEcat-client3.0.0apollo-client1.3.0去除Apollo对CAT的依赖众所周知,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实例,并且不发送任何消息。如果想去掉CAT的依赖,可以在项目中使用NullMessageProducerManager的实现。在META-INF\services\文件夹下创建如下文件:com.ctrip.framework.apollo.tracer.spi.MessageProducerManager并添加如下内容:com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManagerimportCATclientimport说到CAT客户端,遇到了一个很大的坑,所以告诫大家:不要使用源码中cat-client封装的客户端。因为源码中的cat-client是老代码,不再维护。在这里吐槽一下:不维护为什么不立马删掉呢,看旧代码一周都心疼。最新的源码在lib/java目录下,可以自己使用maven打包,或者在pom.xml中添加Maven依赖:com.dianping.catcat-client3.0.0另外在repositories节点添加如下库,否则无法下载jar包。Unidalhttp://unidal.org/nexus/content/repositories/releases注意:推荐使用打包的cat-client你自己的maven,目前最新的代码在Unidal的Maven存储库中不可用。初始化CAT客户端初始化CAT客户端,我们需要做的就是读取springboot初始化时的Apollo配置,然后初始化CAT客户端。示例如下:importcom.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;importcom.dianping.cat.Cat;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Configuration;importjavax.annotation.PostConstruct;/***@author万猫学社*/@Slf4j@Configuration@EnableApolloConfigpublicclassAppConfig{/***每个项目的域是不同*所以不要从Apollo读取*这里使用的是Apollo的app.id*/@Value("${app.id}")privateStringdomain;/***CAT服务器的端口,从Apollo读取*/@Value("${cat.server.port}")privateintport;/***CAT服务器的HTTP端口,从Apollo读取*/@Value("${cat.server.http.port}")privateinthttpPort;/***CAT服务器IP列表,多个逗号分隔,从Apollo读取*/@Value("${cat.server.servers}")privateStringservers;/***初始化CAT客户端*/@PostConstructpublicvoidinitCat(){try{Cat.initializeByDomain(域,端口,httpPort,servers.split(“,”));}catch(Exceptione){log.error("CAT客户端初始化失败",e);总结一下,CAT客户端从Apollo读取配置,一共分为3步:去除Apollo对CAT的依赖:MessageProducerManager接口使用NullMessageProducerManager类实现CAT客户端的引入:封装自己在源码的lib/java目录下,或者添加Maven依赖。初始化CAT客户端:读取Apollo配置,调用Cat.initializeByDomain方法进行初始化。