dubbo泛化调用细节是如何实现的

清风挽笑 1个月前 已收到2个回答 举报

成浩大斌哥 2星

共回答了204个问题采纳率:94.5% 评论

dubbo泛化调用的实现细节是通过反射机制来实现的。
1.dubbo泛化调用的实现细节是通过反射机制来实现的。
2.泛化调用是dubbo提供的一种动态调用方式,它可以通过任意参数和任意类的接口来调用服务,不需要通过API接口来调用。
而反射机制可以动态获取类的信息以及调用类中的方法和属性,可以实现灵活的动态调用,因此dubbo选择使用反射机制来实现泛化调用。
3.除了反射机制外,dubbo还提供了其他动态调用方式,例如:URL服务自适应、泛化引用调用等。
这些不同的动态调用方式可以根据不同的场景选择使用,从而提供更为灵活和高效的服务调用方式。

11小时前

36

泰迪可爱 3星

共回答了303个问题 评论

服务A与服务B属于不同的应用,通过dubbo远程调用,要做到二者写库操作一同提交/一同回滚,服务A和服务B必须参与同一个跨应用的全局事务,并保证二者对应的DB事务必须作为该全局事务的分支事务。这样,事务管理模块在明确了该全局事务的完成方向(commit/rollback)后,再将该全局事务下的所有分支事务逐个提交/回滚。

这是分布式事务管理的大致逻辑,其中,上述“将所有分支事务逐个提交/回滚”过程是分布式事务处理的关键,需要有相应故障恢复的机制,例如,当服务A的DB事务已经提交(服务B的DB事务尚未提交)时,若服务B所在节点宕机(或其使用的DB宕机)时,如何保证服务B的DB事务仍能正常提交。这个过程的实现机制有很多种,常见的有XA 2PC和TCC。

XA机制将提交过程分成prepare、commit两个阶段,事务管理模块在prepare服务A的DB事务、服务B的DB事务都成功后,再逐个commit这些DB事务。DB在prepare返回OK后,如果没有收到来自事务管理模块的commit/rollback请求则会一直保留该分支事务的数据。因此,若上述宕机故障出现在prepare阶段,则可以通过将prepare过的分支事务回滚,来达到全局事务回滚;若上述宕机故障出现在commit阶段,后续仍然可以再次commit那些未成功commit的分支事务,最终达到全局事务提交。

TCC机制下,事务管理模块是在服务A、服务B执行完毕后即刻提交其参与的DB事务。而后,如果全局事务决定提交,则逐个调用服务A和服务B的confirm逻辑;如果全局事务决定回滚,则逐个调用服务A和服务B的cancel逻辑(当然,confirm/cancel逻辑的执行中又会参与相应的DB事务)。若发生上述宕机故障,则只需要根据全局事务当前状态,将服务A、服务B相应的confirm/cancel逻辑重新调用即可。因confirm/cancel逻辑可能会被多次调用,因此,需要保证其幂等性。

知名的分布式事务管理器主要有atomikos、bitronix、narayana。其中,仅atomikos支持XA和TCC两种机制,bitronix、narayana仅支持XA机制。这三者都不提供对dubbo的开箱即用的支持,需要自行集成。

目前对dubbo提供开箱即用支持的分布式事务管理器有:

ByteJTA

(基于XA机制)、

ByteTCC

(基于TCC机制)。

9小时前

18
可能相似的问题

热门问题推荐

Copyright © 2024 微短问答 All rights reserved. 粤ICP备2021119249号 站务邮箱 service@wdace.com