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

简介: 众所周知,Apollo对CAT是有依赖的,但不是强依赖,而是使用了SPI技术,只有项目里引用了cat-client才会生效。目前我们想把CAT客户端配置放在Apollo里,也就是在CAT客户端初始化之前从Apollo读取相应配置,这就形成了循环依赖,所以首先要去除Apollo对CAT客户端的依赖。

运行环境

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

  • JDK 8
  • spring boot 2.0.7.RELEASE
  • cat-client 3.0.0
  • apollo-client 1.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.NullMessageProducerManager

引入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>
注意:推荐使用自己maven打包的cat-client,目前Unidal的Maven仓库中不是最新代码。

初始化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);
        }
    }
}

总结

总结一下,CAT客户端从Apollo中读取配置,总共分3步:

  1. 去除Apollo对CAT的依赖:MessageProducerManager接口使用NullMessageProducerManager类实现。
  2. 引入CAT客户端:源码的lib/java目录下自己打包,或者添加Maven依赖。
  3. 初始化CAT客户端:读取Apollo配置,调用Cat.initializeByDomain方法初始化。
相关文章
|
8月前
|
运维 Java Nacos
nacos常见问题之读取不到配置文件如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
4290 2
ly~
|
4月前
|
消息中间件 搜索推荐 大数据
一般情况下在 RocketMQ 中添加 access key 的步骤: 一、确定配置文件位置 RocketMQ 的配置文件通常位于安装目录下的 conf 文件夹中。你需要找到 broker.conf 或相关的配置文件。 二、编辑配置文件 打开配置文件,查找与 ACL(访问控制列表)相关的配置部分。 在配置文件中添加以下内容:
大数据广泛应用于商业、金融、医疗和政府等多个领域。在商业上,它支持精准营销、客户细分及流失预测,并优化供应链管理;金融领域则利用大数据进行风险评估、市场预测及欺诈检测;医疗行业通过大数据预测疾病、提供个性化治疗;政府运用大数据进行城市规划和公共安全管理;工业领域则借助大数据进行设备维护、故障预测及质量控制。
ly~
224 2
|
7月前
|
Java
SpringBoot配置-配置文件分类,server.port修改端口,自定义修改配置内容
SpringBoot配置-配置文件分类,server.port修改端口,自定义修改配置内容
|
8月前
|
微服务
SpringCloud-Config服务端微服务从自己的Gitee上获取配置内容配置读取规则
SpringCloud-Config服务端微服务从自己的Gitee上获取配置内容配置读取规则
68 0
|
Nacos
动态读取nacos配置工具类
动态读取nacos配置工具类
214 0
|
SpringCloudAlibaba Java Nacos
Nacos Config的多环境(Profile)配置信息读取
读取`Profile`多环境下`Nacos Config`的配置信息,了解多环境下相同的配置优先级加载问题。
|
前端开发 Java 开发工具
SpringCloud Config 客户端配置与测试|学习笔记
快速学习 SpringCloud Config 客户端配置与测试
SpringCloud Config 客户端配置与测试|学习笔记
|
数据格式
如何优雅的读取yml配置文件?
如何优雅的读取yml配置文件?
238 0
|
测试技术 Go Docker
Python脚本读取Consul配置信息
consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。目前公司用的是这个东西去管理项目上的一些配置信息。
Python脚本读取Consul配置信息
|
XML 数据格式
搭建 Config 服务端
搭建 Config 服务端
95 0

热门文章

最新文章