Jres框架中对Dubbo封装后的注解拆解:远调规则如何设置?

Posted by SFHJavaer on 2025-06-19
Estimated Reading Time 3 Minutes
Words 884 In Total
Viewed Times

现在本地启动Starter,MgHeadCloudservice实现类加到了pom中,Setecloudservice没加入实现类pom

两者的接口都标记了CloudService,启动---------->调用

发现启动是成功的,说明 CloudReference = Autowired (required = false)

其实并不是,因为这里由CloudService产生了代理对象,被注入

这里可以看到两个对象,不管本地有没有,都会生成一个proxy代理对象用于注入,所以CloudService发挥作用,而不是像Autowired (required = false)一样,本地没有就注入一个null


实际调用,不管MgHeadCloudservice有没有显式指定gv,此时都可以执行成功,因为线上本地都有

那么Setecloudservice由于本地没有,所以进入远调策略,默认应当是寻找同gv的服务(没有),所以抛出异常也很合理

所以就有个逻辑:

线上:加了CloudService和CloudComponent会注册到线上

本地:starter.pom引入了会加入到本地容器

消费:本地线上都有会用本地,而不是本地有直接用

生产:先成为本地组件,再注册到远程

最终:(一体化包的前提下,大多不合理的情况会在分布式下出现)

autowired调Component = 合理

autowired调CloudService+CloudComponent = 合理 (复合注解)

CloudReference调Component = CloudReference退化成autowired理论合理,但实际上无法产生代理来处理这些逻辑,所以匹配上只有CloudService标记的接口,才有优先本地这种所谓的优先调用策略。

这里感觉可以改进,理论可实现。

CloudReference调CloudService+CloudComponent = 合理

结合之前一个QI:

之前出现一个问题CloudReference引用一个普通Component,按文档应当可以兼容注入,但是注入不了,对象也不是proxy的,而是null,所以很奇怪,掉的时候报了个-1

复现:尝试将某个远调组件降级,降成普通component,且启动pom且引该实现类,发现即使文档里说了如果存在本地服务,可以直接使用而忽略RPC调用,但是这种情况表述的应该是使用CloudComponent这一套注解且一体化包的形式(既有又有)的情况

这里的CloudService注解最直接的处理:直接导致的注入对象的Proxy对象的产生,最后远调的时候是proxy调用,如果找不到再抛RPC异常

当线上不存在时,仅有本地service时,这个时候还使用CloudReference

觉得理论上是可以直接退化成 Autowired (required = false)

但是这里开发上还是CloudReference的处理逻辑有难点,CloudReference发现标记接口没有CloudService注解,所以无法产生proxy对象,即使此时本地真的有普通Component,生成不了间接代理对象直接给了个null,直接退化成 Autowired的策略也无法实现了。所以所谓的优先逻辑是定义在代理对象中的

最终结论:日常开发中,建议规范上必须一致使用

这个时候调的时候报的异常就不是RpcException了,而是nullpointerException,但是都会报错

这就是为什么远调使用了三个注解

Reference:标记要调用谁

Service:标记接口,控制调用方法,生成统一的调用策略,路由规则等

Component:控制接口实现类服务的具体注册、上线

可以知道:

本地实现:两个注解满足

远调实现:好像也可以完全两个注解满足,类似Dubbo?三个可能是为扩展中间的AOP功能


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !