dubbo客户端(consumer层)大概调用过程

本文介绍了Dubbo 2.6.1版本中客户端(consumer层)的调用过程,详细讲解了从referenceConfig的get方法开始,如何通过init()方法初始化,包括参数赋值和校验,直至createProxy(map)生成代理对象。当URL只有一个时,直接创建Invoker,若有多个URL(多注册中心),则将Invoker加入集合。解析出的protocol与服务端类似,经过层层包装,最后由dubboProtocol执行实际通信。客户端还涉及到注册中心的failBack机制,确保调用的健壮性。整体流程提供了一个理解和跟踪代码的简化思路。

dubbo版本:2.6.1

dubbo客户端硬编码方式的实现:最终通过referenceConfig的get方法完成消息的订阅.

get方法中调用init()方法:

在init()方法中完成了参数的赋值和一些校验,接着调用:

ref = createProxy(map);

如果客户端传递的url(代表着前面各种参数的集合)只有一个,则调用:

invoker = refprotocol.refer(interfaceClass, urls.get(0));

如果url有多个,即多个注册中心,则循环加入invoker的集合.

根据前台的url解析出最终要调用的protocol,当然和服务端一样,也需要经过

protocolListenerWrapper->protocolFilterWrapper->RegistryProtocol完成与通信模块以及注册中心的调用,最后走到自己在一开始定义的dubboProtocol:

Invoker<T> refer(Class<T> serviceType, URL url)

在registry模块,默认使用的是failBackRegistry,在一个注册中心调用失败的时候会自动寻找下一个.

最后一步就是需要根据返回的invoker实例获取到proxy:

也就是说根据JavassistProxyFactory返回的proxy实例就相当于最后客户端得到的ref.

整体流程思路:

 


在了解过服务端后,客户端理解起来也会简单容易,这里没有多分析内部的代码实现,给个简单的流程思路,在自己跟代码跑的时候就可以清晰一点了. 


好的,下面是一个简单的 Dubbo 客户端和服务端调用示例: 服务端: 1. 定义接口 ```java public interface HelloService { String sayHello(String name); } ``` 2. 实现接口 ```java public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 3. 配置服务 在 resources 目录下创建 dubbo 目录,并在其中新建一个名为 provider.xml 的文件,配置如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <dubbo:service interface="com.example.demo.HelloService" ref="helloService" timeout="5000" version="1.0.0"> </dubbo:service> <bean id="helloService" class="com.example.demo.HelloServiceImpl"/> ``` 4. 启动服务 ```java public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意键退出 } } ``` 客户端: 1. 配置服务 在 resources 目录下创建 dubbo 目录,并在其中新建一个名为 consumer.xml 的文件,配置如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <dubbo:application name="consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="helloService" interface="com.example.demo.HelloService" version="1.0.0"/> ``` 2. 调用服务 ```java public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo/consumer.xml"}); context.start(); HelloService helloService = (HelloService) context.getBean("helloService"); String result = helloService.sayHello("Dubbo"); System.out.println(result); } } ``` 使用 ZooKeeper 作为注册中心,服务端和客户端需要先启动 ZooKeeper,然后再启动服务端和客户端。 以上是一个简单的 Dubbo 客户端和服务端调用示例,希望能对你有所帮助。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值