欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-29 09:50:56
运行环境 以下就是这个示例的运行环境,如果版本号不一样,区别也应该不会很大,可以根据实际情况做相应调整。 JDK 8 spring boot 2.0.7.RELEASE cat client 3.0.0 apollo client 1.3.0 欢迎关注微信公众号:万猫学社,每周一分享Java技术干货 ......

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

运行环境

以下就是这个示例的运行环境,如果版本号不一样,区别也应该不会很大,可以根据实际情况做相应调整。

  • jdk 8
  • spring boot 2.0.7.release
  • cat-client 3.0.0
  • apollo-client 1.3.0

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

去除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.nullmessageproducermanager

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

引入cat客户端

引入cat客户端时,我遇到的一个大坑,所以告诫大家:千万不要使用源码中cat-client打包出来的客户端。因为源码中的cat-client是旧代码,已经不维护了。这里吐槽一下:不维护了为什么不马上删除,害的我读了一个星期的旧代码。最新的源码在lib/java目录下,可以自己用maven打包,或者在pom.xml添加maven依赖:

<dependency>
    <groupid>com.dianping.cat</groupid>
    <artifactid>cat-client</artifactid>
    <version>3.0.0</version>
</dependency>

另外,还有在repositories节点中增加如下库,否则是无法下载到jar包的。

<repository>
    <id>unidal</id>
    <url>http://unidal.org/nexus/content/repositories/releases</url>
</repository>

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

初始化cat客户端

初始化cat客户端,我们要做的就是在spring boot初始化时,读取apollo配置,再初始化cat客户端。示例如下:

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技术干货。