运行环境

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

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

CAT客户端如何从Apollo中读取配置?的更多相关文章

  1. JavaWEB中读取配置信息

    第一种方法是使用java.io和java.util包,缺点是路径的概念要清晰, 例子: Properties prop = new Properties(); InputStream in = get ...

  2. 从properties中读取配置创建对象

    主要做两个事,从properties配置文件中读取信息,通过反射创建对象 思路主要有两种,遍历得到的属性集合,然后设置类的属性 遍历类的属性集合,从配置文件中读取(不推荐,因为类的属性有多样化,会报错 ...

  3. .netcore webapi 在startup中读取配置字符串

    参考微软官方说明:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration 具体为: 读取方法见下图中标红的格式, ...

  4. IntellJ IDEA2017 springboot2.0.2中读取配置

    IDEA 路径 src\main\resources\application.properties 配置文件名称为 application.properties 默认的位置在classpath根目录下 ...

  5. 从SuperSocket的App.config中读取配置,并修改保存,再重启服务

    string XmlPath = System.Windows.Forms.Application.ExecutablePath + ".config"; XmlDocument ...

  6. Apollo 中配置String、Map和List和默认值

    摘要:在Apollo 中,配置String.Map和List等类型的信息,同时设置默认值. 综述   随着业务需求的变更,需要在Apollo中配置一个Map<String, List>类型 ...

  7. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  8. 项目文件中含有两个config文件,app.config与app1.config,如何获取app1.config中的配置

    想要通过配置文件配置C#前台画面,好奇做了以下测试:在项目中新建了app.config与app1.config两个配置文件,请教一下各位高手如果想从app1.config中读取配置信息应该如何读取?采 ...

  9. 如何使用AWS和Azure的配置存储服务保存读取配置

    原文:Want to yank configuration values from your .NET Core apps? 作者:pauljwheeler 译文:https://www.cnblog ...

随机推荐

  1. 教你使用Cocos Creator制作国旗头像生成器,附源码!

    关注「编程小王子」公众号回复[头像生成器]获得源码! 下面我重点介绍一下Cocos Creator H5头像生成的实现方法: 获取手机相册图片 在 Cocos Creator 中加载相册图片 Coco ...

  2. Java基础学习笔记(五) - 常用的API

    API介绍 概念:API 即应用编程程序接口.Java API是JDK中提供给我们使用的类说明文档,这些类将底层的代码实现封装.无需关心这些类是如何实现,只需要学习如何使用. 使用:通过API找到需要 ...

  3. Linux上安装jdk1.8和配置环境变量

    前言 Linux 上安装jdk1.8 和配置环境变量,参考相关文档,本人在此总结,操作归纳如下. 第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容 ...

  4. .NET Core 3.0中IAsyncEnumerable<T>有什么大不了的?

    .NET Core 3.0和C# 8.0最激动人心的特性之一就是IAsyncEnumerable<T>(也就是async流).但它有什么特别之处呢?我们现在可以用它做哪些以前不可能做到的事 ...

  5. tcpdump使用详情及案例

    转载http://starsliao.blog.163.com/blog/static/89048201062333032563/ TCPdump抓包命令tcpdump是一个用于截取网络分组,并输出分 ...

  6. Be Nice!要善良

    [1]  It is nice to be important, but it is more important to be nice. [2]  What simple act of kindne ...

  7. Java的IO操作之关闭流

    我们知道,当结束对一个流的操作时,需要调用流的close()方法对其进行释放,这将释放掉与这个流有关的所有资源,包括文件句柄.端口等.如果不关闭流,垃圾回收机制将无法识别你是否已使用完这个文件,读取的 ...

  8. 想转行做程序员,目前想学WEB前端,想问该自学还是报培训班

    首先我们还是先看一下WEB前端目前的工资情况吧,我在IT招聘网站拉勾网来进行搜索1-3年WEB前端工作经验大专学历的条件来看. 深圳: 可以看出目前深圳的平均的工资都在10K以上,因为大城市给的机会多 ...

  9. 第六版PMBOK中工具与技术的介绍:数据收集数据分析数据表现

    数据收集技术: 1.头脑风暴:收集关于项目方法的创意和解决方案.2.焦点小组:召集预定的相关方和主题专家,了解他们对所讨论的产品服务或成果的期望和态度.主持人引导大家互动式讨论.3.访谈:通过与相关方 ...

  10. composer依赖管理与laravel框架安装

    步骤有点多,生怕哪一天忘记,记录下来会好点 laravel安装有两种途径:1.直接在一些国内第三方网站,如:https://www.golaravel.com/download/ 下载压缩包来解压即可 ...