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

运行环境

如下就是这个示例的运行环境,若是版本号不同,区别也应该不会很大,能够根据实际状况作相应调整。java

  • JDK 8
  • spring boot 2.0.7.RELEASE
  • cat-client 3.0.0
  • apollo-client 1.3.0

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。spring

去除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实例,任何消息都不发送。app

想要去除CAT的依赖,在项目里使用NullMessageProducerManager的实现就能够了。在META-INF\services\文件夹中建立以下文件:
com.ctrip.framework.apollo.tracer.spi.MessageProducerManager
并添加以下内容:
com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManagerdom

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。maven

引入CAT客户端

引入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客户端

初始化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步:

  1. 去除Apollo对CAT的依赖:MessageProducerManager接口使用NullMessageProducerManager类实现。
  2. 引入CAT客户端:源码的lib/java目录下本身打包,或者添加Maven依赖。
  3. 初始化CAT客户端:读取Apollo配置,调用Cat.initializeByDomain方法初始化。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

相关文章
相关标签/搜索