当前位置:   article > 正文

dubbo 服务调用与容错,服务降级,负载均衡源码_dubbo:method属性 oninvoke

dubbo:method属性 oninvoke

 

图1

图1 服务调用的开始 26行 会使用动态代理来完成调用过程。图2.

图2

图2 默认的javassist执行 ProxyFactory  代理类 的实现类 JavaSsistProxyFactory ; 如图3,图4。 通过调用invoker()方法来完成调用逻辑。图5

图3

图4 

图5

图5 对传进来的参数进行方法校验, 此时的invoker 是MockClusterInvoker.(图6)  ,57行createInvocation() 方法创建RpcInvocation对象。57行调用invoke()方法图9

图6

图6 invoker 是MockClusterInvoker 

图7

5

图 7 创建RpcInvocation对象。

图8

 73行 从服务目录获取mock属性,也就是从zookeeper中获取provder 获取mock属性,只要是<dubbo:reference  mock> 配置了mock 图9。那么 74行 value 的length() 不等于0; 再判断有没有配置force ,如果配置了foce 则强制执行 doMockInvoke方法实现服务降级。如果没有配置 执行86行 调用invoke() 方法 也就是调用下一个FailoverClusterInvoker 类的invoke() (图11),如果有异常,就执行服务降级doMocklnvoke()操作。 总体来说 :如果配置了force  无论调用invoke方法成功不成功都会 执行doMockInvoke方法执行服务降级(图10)。 如果没有配置force , 只有在调用invoke不成功的情况下才会执行doMockInvoke 方法执行服务降级。 95行调用doMockeInvoke()方法详细参照图12。86行执行FailoverClusterInvoker的invoke方法图17 首先调用父类的invoker方法。

图9

图10 

 <dubbo:reference  mock="force : return 1"> 

图11

图12

图13 106行 兼容老逻辑,返回为空; 108行创建一个MockInvoker对象,url进行赋值。  113行 调用MockInvoker 对象的 invoke()方法图14

图14

 

 

图14  90行从url方法中获取mock 获取为空, 95行从url中获取mock方法, 101行  从 <dubbo:reference  mock="force : return 1">  截取force : 或者, fail或者 throw 的内容。如果没有配置force,fail ,throw 这些属性,则直接返回全类型名(图15)。 如果内容中有return 直接封装return 对象返回,102行到108行。 如果throw 直接封装成RpcException异常对象返回 112行到119行。122 行为service生成代理类图16.

图15

图16

图17

图17  239行 是通过路由过滤器 过滤掉后的invoker 对象返回。详细图18,图19,图20,图21. ;24行 图22 初始化负载均衡;242行拿到负载均衡策略来调用图25。

图18

图18  274调用服务目录的list方法。会首先调用父类的list方法图19,父类的list方法调用子类的doList方法。图20

图19

图20

 

图20 564行 经过路由链过滤掉不符合请求的invoker 返回所有的服务提供者,返回图21.

图21

图22

 

图22 初始化负载均衡。

图23

图23默认负载均衡是RandomLoadBalance。 图24位详细的多种实现均衡策略。

图24

 

t图25 

图25真正执行负载均衡策略的方法。

图26

 

图26  58行len 表示从 图27获取的配置retries="2"  ,len = retries+1次 59行。 65行 invoked  属性记录了调用过的的 invoker ,67行到103行 遍历len 调用   76行 过滤掉调用过的invoke.图28.  80行真正调用 invoke。此时的invoke是InvokerDelegate对象图31。

t图27

图28

图28 126行如果配置了sticky则不会重试其他服务器,默认返回配置的服务器。

图29

图30

图30 selected = 图25 65行 invoked  ; 199 行到202行 过滤掉 不可用的Invoker ,invokers是从服务目录里获取的。 204行判断如果selected没有包括invoke,则认为没有执行过invoker。210行把没有执行过的invoker从新调用负载均衡来执行。

图31

图31 执行InvokerDelegate类的 invoke()方法。首先执行父类InvokerWrapper的invoke方法图32.  父类回执行子类ListenerInvokerWrapper,ProtocolFilerWapper 类的invoke方法,图32,图33,图34。图ProtocolFilerWapper执行Filer链路,ConsumerContexFilter的invoke().FutureFilter的invoke()方法,图 42 MonitorFilter  调用invoke()方法。构建消费者信息Url 传给监控中心。下一步执行 网络层调用.HttpProtocol类的refer方法,HttpProtocol没有refer方法执行父类的AbstrstProxyProtocol类的refer方法图44 doInvoke()方法。 AbstrstProxyProtocol类没有doRefer()方法,调用HttpProtocol类的doRefer方法。

图32

 

图33

 

图34

 

图35

 

图36

图37

46行  图40 14行配置了<dubbo:method  oninvoke='test.test'/ >  第一个test 对应上面配置的 <bene id ='test'> 图40。第二个test 对应bene类 test方法39。 配置了oninvoke 属性,则会在网络方法请求前执行该bene方法。OnInvokeTest 类的 result 返回值要与HelloService 的参数username保存一致。图41 

图38

图39

图40

图40当配置了onreturn ,onthrow属性,当返回的时候处理情况,当发生异常后处理一些情况

图41

 

图42

 

图43

图43

图44

图45  

图46

图47

图47 96行  通过 doRefer() 方法,返回 HttpInvokerProxyFactoryBean。 然后为这个对象创建代理类target .

图48 

tp

图48封装成HttpInvokerProxyFactoryBean (类似于httpclient) 对象返回。

t图49

图49 消费者发送给提供者的 数据 封装成RpcInvokcation 对象,

 


提供者调用 

图50

 

图50 buildInvokerChain 构建消费者调用链。

图51

图51 81行bind()的时候,new InternalHandle()就是去启动一个tomcat

图52

图52 203行从request中获取url。 204行从sleletonMap中获取对应的服务提供者的服务的实现类的代理类。 seletonMap什么时候放的值呢,是图51  85行放置的。 210 用代理类处理这个请求 ,处理请求要先执行调用链(图54)。 图53 详细介绍了seletonMap 存的是调用链的代理类,调用链的最后一个节点是是我们的实现类。

图53

图54

图54 30行执行调用 首先调用调用链,图55

图55

图56

图57

图57 回声 过滤器,使用如图58,图59  。36行判断如果是回声的方法直接返回,不在执行以后的逻辑。

图58

图59

图60

图60 设置classLoader

图61

图62

59行是执行调用的当时的时间与当前时间  (当前时间-调用的时间), 63行是从url中获取 提供者xml中配置的timeout 时间。 timeout 和 (当前时间-调用的时间) 进行比较记录日志。

图63

图63 服务提供者接受到请求也会调用监控中心。

图64

 

图64 如果发生什么异常,对异常进行包装。‘

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/165860?site
推荐阅读
相关标签
  

闽ICP备14008679号