dubbo解析 |
您所在的位置:网站首页 › 服务降级原理是什么 › dubbo解析 |
本文基于dubbo 2.7.5版本代码 当远程服务不可用、网络异常或者远程服务执行异常,dubbo提供了Mock功能,可以实现服务降级。远程服务执行异常是远程服务执行过程中出现错误,向客户端返回Exception异常。 dubbo实现该功能是在类MockClusterInvoker中完成,MockClusterInvoker实现了Invoker接口。 在现有dubbo的SPI机制下,客户端发起任何远程调用,都必须通过MockClusterInvoker。先介绍一下MockClusterInvoker是如何被创建的。 在介绍集群容错的时候,提到过类MockClusterWrapper,该类是包装类。在SPI机制下加载Cluster接口对象的时候,MockClusterWrapper会将Cluster对象封装起来返回调用方,所有对Cluster对象的调用都必须通过MockClusterWrapper。 MockClusterWrapper是在上图蓝色方块中通过SPI创建的。MockClusterWrapper根据对cluster的设置,封装了Cluster对象。MockClusterWrapper的join方法如下: public Invoker join(Directory directory) throws RpcException { return new MockClusterInvoker(directory,this.cluster.join(directory)); }代码非常简单。this.cluster.join方法返回一个Cluster Invoker对象,默认是FailoverClusterInvoker。MockClusterWrapper使用MockClusterInvoker对Cluster Invoker对象做了一层封装。之后将MockClusterInvoker对象使用JDK代理再做一次封装,这个JDK代理对象就是客户端调用远程服务时使用的对象了。因此每次客户端访问远程服务时,首先调用MockClusterInvoker的invoke方法。 下面介绍MockClusterInvoker的invoke方法。 invoke方法中首先查看mock参数配置。mock参数在@Reference或者@Service中配置。mock参数可以配置的值以及其作用如下: mock=false或者空,不使用服务降级功能,调用封装的Cluster Invoker对象,默认值是false;mock=以"force"开头,那么直接使用mock服务;mock=其他,那么首先访问远程服务,如果网络不通、访问远程服务失败或者远程服务抛出异常后,再使用mock服务。因为mock参数非常重要,是客户端能正常访问服务的最后一道防线,为了避免在客户端访问远程服务时才暴露问题,所以mock参数在客户端启动的时候,ReferenceConfig的init方法会调用checkMock方法检查mock参数。checkMock方法的检查流程是: 当配置mock不为false或者空时,使用mock服务都是调用doMockInvoke方法。 doMockInvoke方法头: private Result doMockInvoke(Invocation invocation, RpcException e)当配置mock=以"force"开头,入参e是null,否则是异常对象,比如服务超时,e是超时异常对象。 doMockInvoke方法的执行流程是: 调用selectMockInvoker方法选择mock的invoker列表;如果上一步的invoker列表是空的,那么创建MockInvoker对象,否则获取列表中的第一个invoker;调用上一步的invoker对象或者MockInvoker对象的invoke方法。invoke方法的返回值作为服务返回值返回客户端。selectMockInvoker主要调用Directory接口的list方法选择invoker列表,invoker可以简单的认为是远程服务提供者。该方法的流程是: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |