最近公司因为业务需要,在本人的极力推荐下,开始考虑引入CAT监控系统。而作为一家传统业务公司,技术力量薄弱;所以为了保证CAT能够被推行下去,就必须业余时间自己鼓捣了。毕竟网上的资料基本没有,对底层不了解的话,出点问题就是大问题。 而且,推行新技术时,任何问题都是新技术导致的。
1. 概述
CAT的整体项目结构由五个子项目,加上一个Maven插件项目组成。
而本次我们的主题就是这个Maven插件项目。这个项目并不是CAT必须的,而只是为了简化初学者的学习曲线而准备的。
而之所以选择以这个项目入手,原因不言之名 —— 因为非常简单啦,简单到只有两个类。
2. 项目概览
首先让我们来看看项目结构。正如上面提到的,本项目只有两个类,再加上四个配置文件。
接下来让我们看看一些细节。
3. 四个配置文件
对于部署过CAT的童鞋, src/main/resources
目录下的四个文件应该是非常熟悉了,它们正是在配置CAT服务端时时所需要的。因此不出意外的话,CAT中配置信息的修改或者表结构的变化,这里的应该是最新的。
4. 两个类
这里应该就是本文的重点了。
4.1 类PropertyProviders.java
本类负责收集用户从控制台输入的信息,用作链接MySQL进行操作的链接配置信息。
我们在按照官方文档安装CAT时,会出现以下图示的操作,其实这里我们输入的信息就是被PropertyProviders
所接收到的,
注意这里的jdbc.user
, jdbc.password
, jdbc.url
会首先尝试从系统变量中获取,然后才是读取用户输入的。相关代码可以参见下私有方法PropertyProviders.ConsoleProvider.getString
。
4.2 类InstallMojo.java
这个类可以说是这个项目的核心,借助Mojo实现的Maven插件。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。
本类主要承担了以下两项职责:
1. 负责构建CAT部署所必须的配置文件。
2. 创建指定数据库cat, 并向其中插入CAT服务端正常运行所必须的表结构。
4.2.1 插件机制
我们先来看看该类的声明
/**
* // 该插件的目标(goal) 为 install
* // 以下注释将被Mojo所利用。
* // 可以参见这个链接 : https://blog.csdn.net/chinrui/article/details/66472815
* @goal install
* @aggregator true
*/
public class InstallMojo extends AbstractMojo {
...
}
然后再看看该项目的 pom文件
<groupId>com.dianping.cat</groupId>
<artifactId>cat-maven-plugin</artifactId>
<name>cat-maven-plugin</name>
<packaging>maven-plugin</packaging>
按照约定,最终我们可以通过mvn cat:install
的方式来调用到这个插件。而这条命令,正是我们在按照CAT官方文档进行安装操作时所需要执行的一行命令,这就不谋而合了。
4.2.2 关于InstallMojo.java的其他内容
通过观察其内部的字段,我们可以看到很熟悉的, client.xml,server.xml,datasources.xml 字符串。
使用Mojo来编写插件时,核心方法就是 execute 了,可以看到CAT的代码质量还是相当高的。方法名很清晰地说明了自己要做的事情,并且进行了相应的逻辑切割,用方法的组合来完成任务,而不是将所有的方法搅和在一起。 更多的细节读者可以自行查看源码,这里只做简单的介绍
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Preparing Cat environment...");
// 从系统变量里获取MySQL的链接信息,否则就从用户在控制台的输入中获取MySQL的链接信息
validate();
// setupDatabase 该方法会创建数据库和表结构,
// setupConfigurationFiles
// 1. 该方法会创建 /data/appdatas/cat, /data/applogs/cat目录结构;
// 2. 并对 client.xml, server.xml, datasources.xml进行占位符替换, 然后拷贝到上面的/data/appdatas/cat目录中
if (setupDatabase() && setupConfigurationFiles()) {
getLog().info("Preparing Cat environment ... DONE");
getLog().info("Use following command line to start local Cat server:");
getLog().info(" cd cat-home; mvn jetty:run");
getLog().info("Please open http://localhost:2281/cat in your browser");
}
}
5. 总结
- 我们在按照CAT官方文档进行安装操作时所需要执行的一行命令
mvn cat:install
,正是执行了项目cat-maven-plugin
中的InstallMojo.execute
方法。 - 在
InstallMojo.execute
方法的实现中,会借助PropertyProviders
来读取用户在控制台输入的MySQL相关的链接配置信息,用于创建相应的数据库和表结构;以及相应的配置文件。