需求描述

接手了一个陈年的 dubbo 项目,现准备抽离某个模块,以前的聚合工程太大了,不想动,就另起了一个项目作为消费者调用之前的服务。
之前只在聚合项目中进行服务互调,现在两个项目之间完全独立,只通过 dubbo 交互,因此出现了一些问题,在此记录一下。

注解

@Refrence

属性

服务消费者引用服务注解。提供了大量的配置属性,实际上使用时,只需标记注解,所有属性采用默认设置即可。
对于消费者而言,期望的是开箱即用的服务,因此服务提供者应该应该装配合理的默认属性,避免消费者进行不透明操作。

接口

@Reference 不能直接标注在接口上,其提供远程服务自动注入功能,类似于 @Autowired、@Resource 注解,应在类属性字段或 setter 方法上使用。
接口的类限定名必须和服务提供者一致,否则出现无法获取服务的异常。
注意:interfaceName 属性指定的接口名并不会生效。

1
Failed to check the status of the service <ServiceName>. No provider available for the service <ServiceName> from the url zookeeper://<URL> to the consume <IP> use dubbo version 2.7.6

同样,接口暴露的参数的类限定名必须和服务提供者一致,否则会出现序列化异常的报错。

1
2
org.apache.dubbo.remoting.RemotingException: Fail to decode request due to: RpcInvocation [methodName=<MethodName>, parameterTypes=null, arguments=null, attachments={path=<ServiceName>, input=348, dubbo=2.0.2, version=0.0.0}]

实际上消费端错误信息并不是很清晰,通过服务端日志,可以看到是在 rpc 解析时出现类无法找到的异常,该类 是接口参数。

1
2
3
[New I/O worker #10] WARN c.a.d.r.p.d.DecodeableRpcInvocation [Slf4jLogger.java : 62]  [DUBBO] Decode rpc invocation failed: Read invocation data failed.
java.lang.ClassNotFoundException: <ServiceName>

@EnableDubbo

用于启用 dubbo 服务,需要指定接口的包名提供扫描。

评论