Dubbo笔记⑤——服务调用及总结

服务调用

服务调用大致分为两个部分,一个是客户端的服务调用,一个是服务端的接受请求并相应,下面就这两个部分分析。

客户端调用

这里是从服务调用直接分析,在这之前的服务引入已经完成了,已经获得了聚合了所有服务提供者的invoekr对象,这个invoker对象会有几个包装类,下面会以此执行它们的invoke方法。相当于一条invoker链。

因为在服务调用的时候会得到一个invoker代理对象,所以服务调用的入口自然是在代理对象中,这个代理对象叫做InvokerInvocationHandler。
Dubbo笔记⑤——服务调用及总结_第1张图片
接着会执行另外一个invoker对象invoke方法,MockClusterInvoker,在这个对象主要是完成服务降级的操作,具体会在下面分析MockClusterInvoker的作用。

如果没有设置mock属性,那么会直接执行下一个包装类,AbstractClusterInvoker
Dubbo笔记⑤——服务调用及总结_第2张图片
在AbstractClusterInvoker的invoke方法中主要是完成了路由的过滤,通过list方法
Dubbo笔记⑤——服务调用及总结_第3张图片
doListroute方法中就会将所有invoker进行过滤,具体的过滤逻辑就不再这里分析了
Dubbo笔记⑤——服务调用及总结_第4张图片
在完成了路由之后在AbstractClusterInvoker的invoke方法中将负载均衡策略进行了初始化
Dubbo笔记⑤——服务调用及总结_第5张图片
接着会进行下一个invoker对象的执行doInvoke方法,FailoverClusterInvoker对象
Dubbo笔记⑤——服务调用及总结_第6张图片
在这个doInvoke方法中因为服务提供者可能不是只有一个所以会首先通过负载均衡策略选择出一个服务提供者,因为可能选出来的服务会调用失败,为了实现集群容错,也为了不重复选择,这里会将每次选择出来的invoker放到一个list集合中,如果发生重复选择会重试。
Dubbo笔记⑤——服务调用及总结_第7张图片
doSelect方法中会判断服务是否重复调用,如果发生重复调用会执行reselect方法
Dubbo笔记⑤——服务调用及总结_第8张图片
选出合适的服务提供者之后同样是执行invoker对象的invoke方法,这个invoekr对象是ListenerInvokerWrapper对象,直接调用下一个包装对象的invoke方法
Dubbo笔记⑤——服务调用及总结_第9张图片
ProtocolFilterWrapper中的invoke方法,在这里面会完成Filter过滤的,这里会使用一个Filter链来进行过滤
Dubbo笔记⑤——服务调用及总结_第10张图片

  1. ConsumerContextFilter
    Dubbo笔记⑤——服务调用及总结_第11张图片
  2. FutureFilter
    Dubbo笔记⑤——服务调用及总结_第12张图片
  3. MonitorFilter
    Dubbo笔记⑤——服务调用及总结_第13张图片

最后会进入到AbstractInvoker的invoke方法中,执行doInvoke方法
Dubbo笔记⑤——服务调用及总结_第14张图片
在DubboInvoker的doInvoke方法中就会通过httpClient先服务端发送请求,至此客户端的服务调用也就基本执行完了,只需要服务端响应请求返回结果了。
Dubbo笔记⑤——服务调用及总结_第15张图片
至此的调用链如下
Dubbo笔记⑤——服务调用及总结_第16张图片
客户端的大致流程如下:

  1. MockClusterInvoker进行方法降级
  2. 路由过滤
  3. 负载均衡
  4. 容错重试
  5. Filter链
  6. HttpClient发送请求

服务提供者响应

服务提供端已经完成了服务导出,也启动tomcat完成了端口暴露的工作,接下来就是接收消费者的请求。

首先是通过servlet接收请求,这里是通过service方法拦截的,在方法里面是通过handle方法处理的请求
Dubbo笔记⑤——服务调用及总结_第17张图片
这里发送的是http请求,执行的自然是HttpProtocol中的内部类InternalHandler中handle方法。

这里先是通过request中的uri从map中拿到Invoker链的代理类,接着执行这个代理类的处理方法
Dubbo笔记⑤——服务调用及总结_第18张图片
最后同样会来到ProtocolFilterWrapper的invoke方法,执行其中的filter链
Dubbo笔记⑤——服务调用及总结_第19张图片
这里就不一一分析了,只是将这些默认的filter列在下面

  1. EchoFilter
  2. ClassLoaderFilter
  3. GenericFilter
  4. ContextFilter
  5. TraceFilter
  6. TimeoutFilter
  7. MonitorFilter
  8. ExceptionFilter

接着会调用真正服务实现类委托类包装类InvokerWrapper的invoke方法
Dubbo笔记⑤——服务调用及总结_第20张图片
还有就是DelegateProviderMetaDataInvoker的invoke方法
Dubbo笔记⑤——服务调用及总结_第21张图片
最后会调用实现类AbstractProxyInvoker的invoke方法,在doInvoke方法中会直接调用服务实现类的方法
Dubbo笔记⑤——服务调用及总结_第22张图片
最后执行服务端存在的实例方法并返回结果
Dubbo笔记⑤——服务调用及总结_第23张图片
封装结果
Dubbo笔记⑤——服务调用及总结_第24张图片
最后响应消费端的请求

服务降级

可以在消费端定义降级方法,在xml中设置mock属性
在这里插入图片描述

public class DemoServiceMock implements DemoService {
    @Override
    public String sayHello(String name) {
        return "降级方法";
    }
}

在调用失败时会执行mock的逻辑,相当于服务降级
Dubbo笔记⑤——服务调用及总结_第25张图片

负载均衡

在经过路由过滤后会初始化负载均衡策略
Dubbo笔记⑤——服务调用及总结_第26张图片
默认是随机策略
Dubbo笔记⑤——服务调用及总结_第27张图片
在集群提供服务的话,会实现负载均衡,在调用select方法中会实现负载均衡的策略,真正的逻辑在doSelect方法中,而且会和集群容错相结合使用,可以参考下面的集群容错和上面的消费端服务调用分析。

集群容错

AbstractInvoker的逻辑执行完后,会执行下一个invoker,就是AbstractClusterInvoker的子类,可以设置容错模式调用对应的对象,默认是FailoverClusterInvoker,在这个doInvoke方法中,会实现容错机制,在调用失败后会进行重试,并且会尝试其他服务提供者。

这里会将尝试过的invoker加到一个集合中
Dubbo笔记⑤——服务调用及总结_第28张图片
在选择invoker的时候会将这个集合传进去,select方法中负载均衡策略会判断选出来的invoker是否被调用过,如果调用过会重新负载均衡选择。

Dubbo整体流程图

Dubbo笔记⑤——服务调用及总结_第29张图片

你可能感兴趣的:(java笔记——,Dubbo相关)