这个报错是因为本地未配置cat服务地址,会默认使用org.cat,导致域名无法解析。
在项目启动盘根目录下建文件client.xml
,假如在D盘:D:\data\appdatas\cat\client.xml
里面填写以下内容:
<?xml version="1.0" encoding="utf-8"?>
<config>
<servers>
<server ip="{cat.host}" port="80" http-port="80" enabled="true"/>
</servers>
</config>
必须至少有一个enabled=true
的server,否则会报除0异常,因为对分布式的支持,会做取整处理。
参看:com.dianping.cat.configuration.DefaultClientConfigService.getServerConfigUrl()
{cat.host}
一般使用本地或有效的cat服务地址,也可以使用localhost等无效地址。第一次使用cat时会请求这个地址初始化路由,如果使用无效地址时,会重试3次,每次30秒左右的超时,在这段时间程序无响应。第二次就正常了。
参看:com.dianping.cat.configuration.DefaultClientConfigService.refreshConfig(
)
http-port
是cat服务的端口地址,而不是port
。
启动成功后,会生成D:\data\appdatas\cat\client_cache.xml
<?xml version="1.0" encoding="utf-8"?>
<config enabled="true" max-message-size="5000">
<servers>
<server ip="{route.path}" port="2280" http-port="80" enabled="true"/>
</servers>
</config>
这个地址是访问cat服务地址获得的:http://{cat.host}/cat/s/router?domain={project-name}&ip={local.ip}&op=xml&env=unknown&hostname={local.hostname}
返回:
<?xml version="1.0" encoding="utf-8"?>
<property-config>
<property id="startTransactionTypes" value="Cache.;Squirrel."/>
<property id="matchTransactionTypes" value="SQL"/>
<property id="block" value="false"/>
<property id="routers" value="{route.path:port};"/>
<property id="sample" value="1.0"/>
</property-config>
client.xml
和client_cache.xml
可以只存在一个,CAT会优先使用client_cache.xml
参看:com.dianping.cat.configuration.ApplicationEnvironment.loadAppName()