问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

dubbo泛化调用使用及原理解析

发布网友 发布时间:2023-04-03 00:47

我来回答

1个回答

热心网友 时间:2024-03-20 19:26

通常我们想调用别人的bbo服务时,我们需要在项目中引入对应的jar包。而泛化调用的作用是,我们无需依赖相关jar包,也能调用到该服务。

这个特性一般使用在网关类项目中,在业务开发中基本不会使用。

假设我现在要调用下面的接口服务

在xml文件做以下配置

然后注入使用

在两种调用方式中,我们都需要使用被调用接口的字符串参数生成GenericService,通过GenericService的$invoke间接调用目标接口的接口。

$invoke的三个参数分别为,方法名,方法参数类型数组,方法参数数组。

可以看到泛化调用的一个复杂性在于$invoke的第三个参数的组装,下面介绍几种复杂入参的调用方式

首先丰富提供者接口

与入参相似,虽然$invoke的返回定义为Object,实际上针对不同类型有不同的返回。

泛化调用和直接调用在消费者者端,在使用上的区别是,我们调用服务时使用的接口为GenericService,方法为$invoker。在底层的区别是,消费者端发出的rpc报文发生了变化。

在使用上,不管哪种配置方式,我们都需要配置generic=true

设置generic=true后,RefereceConfig的interfaceClass会被强制设置为GenericService

这也使得我们的RefereanceBean返回的是GenericService类型的代理。

生成的代理是GenericService的代理只是我们使用方式上的变化,更为核心的是,底层发送的rpc报文发生了什么变化。

Dubbo的rpc报文分为header和body两部分。我们这边只需要关注body部分。构造逻辑如下

那么我们通过直接调用与泛化调用ByeService的bye方法在报文上有啥区别呢?

我一开始以为报文中的path是GenericeService,其实并没有,path就是我们调用的目标方法。

path来源???todo

而报文中的方法名,方法参数类型以及具体参数,还是按照GenericeService的$invoke方法入参传递的。

这么个二合一的报文,发送到提供者那边,它估计也会很懵*,我应该怎么执行?

所以针对泛化调用报文还会把generic=true放在attchment中传递过去

具体逻辑在GenericImplFilter中。

GenericImplFilter中有很多其他逻辑,比如泛化调用使用的序列化协议,正常接口走泛化调用的模式,我们只需要设置attachment的那部分。

知道消费者端报文发生了什么变化,那么接下来就去看提供者端如何处理这个改造后的报文。

总结一下ReferenceConfig中interfaceClass和interfaceName的区别?(这道面试题好像不错)

interfaceClass用于指定生成代理的接口
interfaceName用于指定发送rpc报文中的path(告诉服务端我要调用那个服务)

消费者泛化调用的rpc报文传递到提供者还不能直接使用,虽然path是对的,但是实际的方法名,参数类型,参数要从rpc报文的参数中提取出来。

GenericFilter就是用来做这件事情。

在提供者这边,针对泛化调用的逻辑全部封装到了GenericFilter,解耦的非常好。

注意第4个条件,一开始很疑惑,后来发现rpc报文中的path是目标接口的,这边invoker.getInterface()返回的肯定就是实际接口了

这边有个疑问,为什么这边还要再次反序列化一次,netty不是有decoder么??

嗯,你别忘了,针对一个POJO你传过来是一个Map,从Map转换为POJO需要这边进一步处理。

这边需要注意一下!!针对接口的泛化调用,抛出的异常都会经过GenericException包装一下。

从功能上来看,泛化调用提供了在没有接口依赖情况下进行的解决方案,丰富框架的使用场景。
从设计上来看,泛化调用的功能还是通过扩展的方式实现的,侵入性不强,值得学习借鉴。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
xbox360和PS3要多少钱 xbox360和ps3买那个好本人只有1500应该够吧我想在这两个游戏机里买一... XBOX360单机标配多少钱 现在买ps2,ps3,还是xbox360好,学生党没什么钱 帮忙看下xbox360能卖多少钱?换台ps3或4行不行? 矛与盾《韩非子》 韩非子·安危第二十五原文4 韩非子·安危第二十五作者简介 韩非子·安危第二十五原文二 韩非子·安危第二十五原文一 RPC(一)简单理解RPC Ⅴⅰ√O丫8多少英寸? 纵贯线的《感应》 歌词 黑龙江桦南那里有卖补光灯的店 oppox5天玑版和x5pro区别 vivoy97换完屏幕开机以后觉得没有以前亮了 vivoy52s处理器相当于骁龙多少 基于android系统的自动售货机软件部分怎么做? JAVA 编程自动售货机系统 售货机智能零售管理系统,大家说哪个比较好? 重生之三界传奇txt全集下载 《不死神传奇》txt下载在线阅读全文,求百度网盘云资源 《死神之白一护传奇》txt全集下载 《三生劫之死神传奇》最新txt全集下载 三七茯苓胶囊是什么东西呢? 电子显示屏需要多少安的电压 第三者责任险包括整容险吗 整容能买保险吗 整容风险,有保险给保吗? 健身俱乐部经营与管理的目录 全字康熙字典多少画 电动门大门不等全开就按停会影响电动寿命吗 门禁系统的门长期门开着,会坏吗 汽车智动门用手关会坏掉吗? OPPOFINDX6和iPhone 14续航能力哪个更强? mate30国产屏幕只要300吗 华为m60手机上市时间 耳机左右声道怎么驱动2.1音箱 3.5转双卡农公分左右声道吗 传奇私服英雄合击战战怎么个玩法 短信收到诉讼通知 收到法院立案通知短信 医生简笔画怎么画 专授的解释 英德麻竹笋一亩产量多少 两份遗嘱哪个有效 遗嘱人立了多份遗嘱,应该以哪份为准? 遗嘱人立有数份遗嘱,以哪一份遗嘱为准? 左眼跳右眼跳 远安为什么深爱远坏了