做者在基于Spring Cloud微服务的架构时,一直苦于寻找一个可靠的性能监控平台,后在大神的推荐下,详细研究了点评CAT,其知足对应用性能监控的需求(包含SQL性能,URL响应性能等),将踩过的坑进行分享一下。mysql
因为微服务集群并非很庞大,且服务器资源有限,因此暂时只采用了单点部署的CAT,集群部署和使用请参考CAT的github,这里暂不作分享git
修改tomcat的server.xml使其支持中文的URLgithub
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443" /> <!-- 增长 URIEncoding="utf-8" -->
建立CAT使用的文件夹,并修改其配置web
mkdir /data chmod -R 777 /data/
修改CAT配置文件,建立/data/appdatas/cat/client.xml并修改以下spring
<?xml version="1.0" encoding="utf-8"?> <config mode="client"> <servers> <server ip="127.0.0.1" port="2280" http-port="8080"/> </servers> </config>
修改cat的数据库配置文件/data/appdatas/cat/datasource.xmlsql
<?xml version="1.0" encoding="utf-8"?> <data-sources> <data-source id="cat"> <maximum-pool-size>3</maximum-pool-size> <connection-timeout>1s</connection-timeout> <idle-timeout>10m</idle-timeout> <statement-cache-size>1000</statement-cache-size> <properties> <driver>com.mysql.jdbc.Driver</driver> <url><![CDATA[jdbc:mysql://127.0.0.1:3306/cat]]></url> <!-- 请替换为真实数据库URL及Port --> <user>root</user> <!-- 请替换为真实数据库用户名 --> <password>root</password> <!-- 请替换为真实数据库密码 --> <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties> </properties> </data-source> </data-sources>
maven引入cat client数据库
<dependency> <groupId>com.dianping.cat</groupId> <artifactId>cat-client</artifactId> <version>3.0.0</version> </dependency>
使用SPI方式配置cat clienttomcat
其中com.dianping.cat.configuration.ClientConfigProvider文件中填写完成实现类名称,实现类代码以下:springboot
public class CatClientConfigProvider implements ClientConfigProvider { @Override public ClientConfig getClientConfig() { List<Server> servers = Lists.newArrayList(); //cat 服务器地址,多个则须要使用,分割 String catServersStr = SpringUtils.getProperties("cat.servers"); if (catServersStr != null) { String[] catServers = catServersStr.split(","); for (String catServer : catServers) { servers.add(new Server(catServer)); } //domain直接去springboot的application name String domain = SpringUtils.getProperties("spring.application.name"); ClientConfig config = new ClientConfig(); config.setServers(servers); config.setDomain(domain); return config; } return null; } }
app.properties文件中填写app.name=应用名称服务器
咱们分别使用了mybatis中的sql跟踪,log4j2的CatAppender,springboot的CatFilter,context中的结合feign对链路进行跟踪(cat链路跟踪不是一个完整的功能,若是对链路跟踪没有很高的要求能够进行使用)
注意:若是项目中使用了Hystrix,由于cat使用ThreadLocal保存跟踪的ID,因此若是须要保证链路跟踪的正确性,须要将隔离策略改成SEMAPHORE
Problem很是重要这里显示应用的报错,慢SQL,慢URL等,也是做者最经常使用的模块,其余功能能够参考Documents进行使用,另外做者最近使用Alert功能,能将告警信息发送至钉钉,第一时间响应问题,仍是很嗨的!固然须要本身实现一个相似于webhook的服务。