【踩坑】cat3.x服务端部署, springboot客户端接入

前言

这两天在看有什么好一点, 全面, 轻量的监控工具. 其中就看到了Cat想要试一试, 结果部署半天出了一堆问题. 这里记录下, 希望能帮到小伙伴们.

总结了下. 服务器部署关键的几步:

  1. 去git上拉代码
  2. 将sql脚本执行,创建数据库和表
  3. 关键, 查看pom依赖, 根据自己的mysql版本选择合适的mysql-connecor-java版本
  4. maven clean package编译出war包, 改名
  5. 创建/data/appdatas/cat文件夹, windows的话一样, mkdir -p/data/appdatas/cat`就好
  6. 目录下创建两个配置文件, 一个是数据库的, 一个是客户端的
  7. war包在tomcat中部署, 正常的话打开cat平台, 在线修改服务配置和路由配置

服务器部署问题

下面的日志文件, 都可以在/data/applogs/cat中找到.

1. 数据库连不上

出现如下日志:

Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!

Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

[02-03 17:08:26.724] [ERROR] [StandardWrapper] Servlet initializing failed. javax.servlet.ServletException: java.lang.RuntimeException: Error when initializing modules! Exception: java.lang.RuntimeException: Unable to get component: class com.dianping.cat.analysis.TcpSocketReceiver.
javax.servlet.ServletException: java.lang.RuntimeException: Error when initializing modules! Exception: java.lang.RuntimeException: Unable to get component: class com.dianping.cat.analysis.TcpSocketReceiver.

  1. 如果是mysql8.x版本, 需要修改git拉取/下载的原码中, pom.xml中的mysql-connecor-java版本到8.x, 默认是5.x. 然后修改配置driver为com.mysql.cj.jdbc.Driver
  2. 确认datasources.xmljdbc相关配置没有填写错误.
  3. 正确配置实例: mysql8.x版本
<?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.cj.jdbc.Driver</driver>
            <url><![CDATA[jdbc:mysql://localhost:3306/cat]]></url>
            <user>root</user>
            <password>123456</password>
            <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
        </properties>
    </data-source>
</data-sources>

2. 不要创建server.xml

我看有些教程中提到, 除了要创建client.xml, datasources.xml, 还要创建server.xml, 其实并不是必要, 而且容易出错, 多一事不如少一事. 不要创建.

这里说下我对这几个配置文件的理解.

  • datasources.xml 不用多说, 数据库的配置
  • client.xml 客户端的配置, 如果cat服务端也在这个机器上, 也会读取这个配置, 因为cat服务本身也是一个客户端.
    然后普通的客户端, 比如springboot应用, 在接入了jar包后, 也是需要读取这个配置中的服务端的ip和端口号, 每隔10s会去尝试连接请求一次, 将自身的信息主动注册到cat服务端.

下面就是我关闭服务端后, 客户端日志的打印情况. (客户端和服务端输出的日志都是/data/applogs/cat, 甚至是同一个文件. 这里要注意)

[02-03 20:52:26.986] [INFO] [ChannelManager] start connect server10.20.6.561:2281
[02-03 20:52:26.988] [ERROR] [ChannelManager] Error when try connecting to 10.20.6.561:2281
[02-03 20:52:37.003] [WARN] [DefaultClientConfigManager] error when connect cat server config url http://10.20.6.561:7070/cat/s/router?domain=cat-demo&ip=10.20.6.56&op=json
[02-03 20:52:37.003] [INFO] [ChannelManager] start connect server10.20.6.561:2281
[02-03 20:52:37.004] [ERROR] [ChannelManager] Error when try connecting to 10.20.6.561:2281

客户端注册问题

下面是能打开cat服务平台, 但是没有看到实例注册, 或者application页面打开直接报错500的情况

1. client.xml信息错误

有些教程中提到不要将ip设置为127.0.0.1, 这其实就是因为如果服务端和客户端如果不在同一个机器的话, 客户端拿到的服务ip就是个错误的本地ip

检查ip, 端口是否设置正确

2. 应用注册名建议不要有特殊符号

因为客户端会主动将应用名通过http请求作为query参数注册到cat服务端. 所以如果含{|}等特殊符号, tomcat会报错.

tomcat9tomcat7,tomcat8 针对这种情况解决的方式也不太一样. 最简单的方式就是不要设置复杂的名字

会出现的错误:

Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

3. 缓存/本地文件的干扰

如果上面的几个问题都多多少少遇到了, 并且也解决了, 但是Application页面的Transaction localhost:8080/cat/r/t打开还是报500, 这里建议删除掉\data\appdatas\cat目录下的除了配置文件的其他东西, 再重启tomcat

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值