title: dubbo 源码解析 4
date: 2020/05/27 16:45
本节内容
远程服务调用(注册中心版)
远程服务调用
通过协议对象获取服务调用端的 invoker官方的注释好像写错了,经过测试多个服务提供者不会走 else。
image image剩下的代码如下:
image因为与集群有关,所以暂时不看了。
然后这个方法返回 invoker 对象,剩下的流程和本地的一样,创建一个代理对象。
我们着重看一下下面这行代码
// 订阅 providers、configurators、routers 等节点数据
directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY,
Constants.PROVIDERS_CATEGORY
+ "," + Constants.CONFIGURATORS_CATEGORY
+ "," + Constants.ROUTERS_CATEGORY));
image
image
注:当启动了 2 个服务提供者时,会触发两次监听器,最终 invokers 中有了两个 dubbo Invoker
image
image
image
image
image
image.png
image
image
image
tag1 doOpen();
imagetag2 connect();
image以上内容就是
DemoService demoService = (DemoService) context.getBean("demoService");
这句话调用的,因为 FactoryBean 对象只有在使用到的时候才会调用 getObject() 方法。
服务调用
下面开始介绍调用方法(demoService.sayHello("world")
)时的流程:
image 中间和之前相同的流程还有过滤器我就跳过了 注意:如果有多个服务提供者 FailoverClusterInvoker 会从中选择一个 中间就是对请求进行封装,封装方法名,方法参数类型,方法参数等信息 因为我们在创建 NettyClient 的时候添加了这个处理器,所以在发送请求前和响应到来时都会调用这个处理器的方法 imageinvoker.toString():interface com.alibaba.dubbo.demo.DemoService2 -> zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=demo-consumer&bean.name=com.alibaba.dubbo.demo.DemoService2&check=false&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService2&methods=sayHello&pid=31924&qos.port=33333®ister.ip=192.168.2.89&remote.timestamp=1591148261144&side=consumer×tamp=1591149268097
然后就是发送请求,服务提供者接收请求,然后进行处理,这些上节我们已经讲过了。
网友评论