Dubbo 服务的定义和消费
1、Dubbo有两个接口是com.alibaba.dubbo.rpc.Invoker和com.alibaba.dubbo.rpc.Exporter,定义位置为dubbo-rpc-api
Dubbo会根据用户配置的协议调用不同协议的Invoker,再通过ReferenceFonfig将Invoker的引用关联到Reference的ref属性上提供给消费端调用。当用户调用一个Service接口的一个方法后由于Dubbo使用javassist动态代理,会调用Invoker的Invoke方法从而初始化一个RPC调用访问请求访问服务端的Service返回结果。下面我们就从Comsumer端开始逐步解析这个框架。
服务消费方发起请求
当服务的消费方引用了某远程服务,服务的应用方在spring的配置实例如下:
1 | <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /> |
demoService实例其实是代理工厂生产的代理对象(大家可以参考代理那部分生成的伪代码),在代码中调用
1 | demoService.sayHello(“world!”) |
1.将方法名、方法参数传入InvokerInvocationHandler的invoke方法,对于Object中的方法toString, hashCode, equals直接调用invoker的对应方法
远程调用层是以Invocation, Result为中心,这里根据要调用的方法以及传入的参数构建RpcInvocation对象,作为Invoker的入参
2.MockClusterInvoker根据参数提供了三种调用策略
不需要mock,直接调用FailoverClusterInvoker
强制mock,调用mock
先调FailoverClusterInvoker,调用失败在mock、
3.FailoverClusterInvoker默认调用策略
通过目录服务查找到所有订阅的服务提供者的Invoker对象
路由服务根据策略来过滤选择调用的Invokers
通过负载均衡策略LoadBalance来选择一个Invoker
4.执行选择的Invoker.inoker(invocation)
经过监听器链,默认没有
经过过滤器链,内置实现了很多
执行到远程调用的DubboInvoker
5.DubboInvoker
根据url也就是根据服务提供者的连接,这里封装成交互层对象ExchangeClient供这里调用,判断远程调用类型同步,异步还是oneway模式ExchangeClient发起远程调用。
获取调用结果:
1、Oneway返回空RpcResult
2、异步,直接返回空RpcResult, ResponseFuture回调
3、同步,ResponseFuture模式同步转异步,等待响应返回
服务提供方接收调用请求
从rpc调用层DubboProtocol层开始分析,对于通信层remoting的数据接收反序列等等过程不做分析。DubboProtocol的requestHandler是ExchangeHandler的实现,是remoting层接收数据后的回调。requestHandler.replay方法接收请求消息,这里只处理远程调用消息Invocation。
1.通过Invocation获取服务名和端口组成serviceKey=com.alibaba.dubbo.demo.DemoService:20880, 从DubboProtocol的exproterMap中获取暴露服务的DubboExporter, 在从dubboExporter获取invoker返回
2.经过过滤器链
3.经过监听器链
4.到达执行真正调用的invoker,这个invoker由代理工厂创建,调用demoService实例方法,将结果封装成RpcResult返回。代码如下:
1 | com.alibaba.dubbo.rpc.ProxyFactory.getInvoker(demoService, DemoService.class, registryUrl) |
5.交换层构建Response,通过Remoting层编码传输将结果响应给调用方法。