背景介绍
项目组使用的是阿里专有云V3.12,系统运行在EDAS taobao-tomcat Pandora容器下,使用HSF作为RPC条用框架。
在HSF Consumer调用HSF Provider的时候,在HSF Consumer端抛出了如下异常:
2024-08-22 08:29:37.274||10.xx.xx.xx|SID=254|ERROR|RID=|TID=0ae3cba717242865772664949ddd72|CID=0|BK=|com.taobao.hsf.exception.HSFServiceAddressNotFoundException: HSFServiceAddressNotFoundException- error message : [HSF-Consumer] can't find target service addresses, target serviceName:xx.xx.xx.xx.xx.xx.service.xx:2.0.0.daily Group:uat ERR-CODE: [HSF-0001], Type: [BIZ], More: [http://edas.console.aliyun.com/code?faq=HSF-0001] at com.taobao.hsf.registry.RegistryInvocationHandler.invoke(RegistryInvocationHandler.java:157) at com.taobao.hsf.invocation.DelegateInvocationHandler.invoke(DelegateInvocationHandler.java:12) at com.taobao.hsf.remoting.service.LocalInvocationHandler.invoke(LocalInvocationHandler.java:100) at com.taobao.hsf.invocation.filter.RPCFilterBuilder$TailNode.invoke(RPCFilterBuilder.java:165) at com.taobao.hsf2dubbo.context.DubboRPCContextClientFilter.invoke(DubboRPCContextClientFilter.java:43) at com.taobao.hsf.invocation.filter.RPCFilterNode.invoke(RPCFilterNode.java:71) at com.taobao.hsf.context.RPCContextClientFilter.invoke(RPCContextClientFilter.java:31) at com.taobao.hsf.invocation.filter.RPCFilterNode.invoke(RPCFilterNode.java:71) at com.taobao.hsf.rpc.generic.GenericInvocationClientFilter.invoke(GenericInvocationClientFilter.java:59) at com.taobao.hsf.invocation.filter.RPCFilterNode.invoke(RPCFilterNode.java:71) at com.taobao.hsf.remoting.service.InvocationValidationFilter.invoke(InvocationValidationFilter.java:48) at com.taobao.hsf.invocation.filter.RPCFilterNode.invoke(RPCFilterNode.java:71) at com.taobao.hsf.filter.QosClientFilter.invoke(QosClientFilter.java:67) at com.taobao.hsf.invocation.filter.RPCFilterNode.invoke(RPCFilterNode.java:71) at com.taobao.hsf.plugins.auth.AuthClientFilter.invoke(AuthClientFilter.java:49)
问题分析
从异常栈可知,抛出的异常是:HSFServiceAddressNotFoundException,造成该异常的原因通常是由于在Consumer端找不到要调用的HSF Service对应的target IP地址造成的,所以首先确认一下该HSF Service是否存在。
可以去阿里云EDAS控制台通过服务查询进行确认,如下:
通过对比,异常信息中的HSF Service名称,version、group与EDAS控制台查询结果一致,所以Consumer端HSF Service配置信息是正确的。
接下来,我们在Consumer所在ECS上通过Pandora QOS再进一步确认信息,操作步骤如下。
- 确认QOS端口号
/home/admin/edas-assist/edas-assist.pid文件内容如下:
PID:4124570 HSF PORT:12200 PANDORA QOS PORT:12201 MONITOR PORT:8006 CSP PORT:8719
其中PANDORA QOS PORT后面的端口号是QOS开放的端口号。
- 进入QOS控制台
// 进入QOS控制台 telnet localhost 12201 // 进入控制台后,切换到hsf module cd hsf
- 查看HSF Service Address信息
从图中可知,Consumer调用的HSF Service Provider处于invalid状态。
为什么是invalid状态?
造成invalid的通常原因是Consumer访问不通该Provider,所以我们可以通过telnet进行验证。
从图中可知,Consumer无法访问Provider,造成该问题的原因通常有:
- Consumer与Provider之间网络不通
- Consumer访问的Provider端口号不通
所以,我们可以在Provider端通过/home/admin/edas-assist/edas-assist.pid查看HSF PORT是否与Consumer访问的一致来进行确认,通过对比Provider端HSF PORT确实与Consumer端访问的不一致,所以这个就是造成Consumer端查看HSF Service Address invalid的原因。