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方法初始化。
相关文章
|
SQL 关系型数据库 MySQL
解决MySQL主从慢同步问题的常见的解决方案:
解决MySQL主从慢同步问题的方法有很多,以下是一些常见的解决方案: 1. 检查网络连接:确保主从服务器之间的网络连接稳定,避免网络延迟或丢包导致数据同步缓慢。 2. 优化数据库配置:调整MySQL的配置参数,如增大binlog文件大小、调整innodb_flush_log_at_trx_commit等参数,以提高主从同步性能。 3. 检查IO线程和SQL线程状态:通过SHOW SLAVE STATUS命令检查IO线程和SQL线程的状态,确保它们正常运行并没有出现错误。 4. 检查主从日志位置:确认主从服务器的binlog文件和位置是否正确,避免由于错误的日志位置导致同步延迟。 5.
1816 1
|
传感器 机器学习/深度学习 人工智能
苏黎世理工最新!maplab2.0:模块化的多模态建图定位框架
将多传感器模态和深度学习集成到同时定位和mapping(SLAM)系统中是当前研究的重要领域。多模态是在具有挑战性的环境中实现鲁棒性和具有不同传感器设置的异构多机器人系统的互操作性的一块垫脚石。借助maplab 2.0,这个多功能的开源平台,可帮助开发、测试新模块和功能,并将其集成到一个成熟的SLAM系统中。
苏黎世理工最新!maplab2.0:模块化的多模态建图定位框架
|
SQL 移动开发 算法
SQL 的困难源于关系代数
SQL 作为结构化数据计算的主要语言,虽然广泛应用于关系数据库和大数据平台,但在复杂计算场景中表现不佳,如股票连涨天数和大集合中的 TopN 计算。这些问题源于 SQL 的理论基础——关系代数,缺乏必要的数据类型和运算。相比之下,esProc SPL 通过引入“离散数据集”这一新代数体系,能够更简洁高效地处理复杂计算任务。
|
存储 数据管理 数据库
CRUD操作实战:从理论到代码实现的全面解析
【7月更文挑战第4天】在软件开发领域,CRUD代表了数据管理的四个基本操作:创建(Create)、读取(Read)、更新(Update)和删除(Delete)。这四个操作构成了大多数应用程序数据交互的核心。本文将深入讲解CRUD概念,并通过一个简单的代码示例,展示如何在实际项目中实现这些操作。我们将使用Python语言结合SQLite数据库来演示,因为它们的轻量级特性和易用性非常适合教学目的。
1533 2
|
存储 机器学习/深度学习 人工智能
本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama
在过去的几个月里,大型语言模型(llm)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。
9430 1
|
存储 安全 程序员
C++语言中的内存管理技术
C++语言中的内存管理技术
166 5
|
弹性计算 负载均衡 安全
企业级DMZ上云场景方案
随着企业业务云化进程逐渐进入深水区,简单地使用云上资源出入公网已经无法满足业务的诉求,安全、成本、权限、监控等诉求的迭代,需要企业有系统性地视角来考虑如何做好公网出入口(DMZ)的规划设计。
企业级DMZ上云场景方案
|
网络协议 Ubuntu Linux
frp内网穿透
frp内网穿透
kali linux设置中文方法 汉化教程
有勇气的牛排 官方地址:[https://www.couragesteak.com/article/68](https://www.couragesteak.com/article/68)
kali linux设置中文方法 汉化教程
|
机器学习/深度学习 监控 数据可视化
29个用于石油和天然气等行业的最佳 GIS 软件 上
29个用于石油和天然气等行业的最佳 GIS 软件 上
464 0
29个用于石油和天然气等行业的最佳 GIS 软件  上

热门文章

最新文章