dubbo客户端

dubbo客户端:

根据配置文件请求服务端

查找服务端方式:直接查找、注册中心查找

直接查找:在配置文件中直接配置服务端地址和实现接口 在没有注册中心,直连提供者的情况下(例如:<dubbo:reference url="dubbo://service-host/com.foo.FooService?version=1.0.0" />),ReferenceConfig 解析出的 URL 的格式为:dubbo://service-host/com.foo.FooService?version=1.0.0。 基于扩展点自适应机制,通过 URL 的 dubbo:// 协议头识别,直接调用 DubboProtocol 的 refer() 方法,返回提供者引用。

 注册中心查询:通过注册中心找到服务端地址和实现接口 在有注册中心,

1、通过注册中心发现提供者地址的情况下 (例如:<dubbo:registry address="zookeeper://10.20.153.10:2181" />),ReferenceConfig 解析出的 URL 的格式为: registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")。 2、基于扩展点自适应机制,通过 URL 的 registry:// 协议头识别,就会调用 RegistryProtocol 的 refer() 方法,基于 refer 参数中的条件,查询提供者 URL,如: dubbo://service-host/com.foo.FooService?version=1.0.0。 

3、基于扩展点自适应机制,通过提供者 URL 的 dubbo:// 协议头识别,就会调用 DubboProtocol 的 refer() 方法,得到提供者引用。 然后 RegistryProtocol 将多个提供者引用,通过 Cluster 扩展点,伪装成单个提供者引用返回。

客户端消费过程:


1、首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。

2、接下来把 Invoker 转换为客户端需要的接口(如:HelloWorld)。 关于每种协议如 RMI/Dubbo/Web service 等它们在调用 refer 方法生成 Invoker 实例:

Dubbo 的实现 Dubbo 协议的 Invoker 转为 Exporter 发生在 DubboProtocol 类的 export 方法,它主要是打开 socket 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现。 

RMI 的实现 RMI 协议的 Invoker 转为 Exporter 发生在 RmiProtocol类的 export 方法,它通过 Spring 或 Dubbo 或 JDK 来实现 RMI 服务,通讯细节这一块由 JDK 底层来实现,这就省了不少工作量。

invoker是什么?


结合服务消费和提供者的代码示例来进行说明: 

 服务消费者代码: 

 public class DemoClientAction {

 private DemoService demoService; 

 public void setDemoService(DemoService demoService) {

      this.demoService = demoService; 

 } 

 public void start() {

      String hello = demoService.sayHello("world" + i); 

    } 

}

上面代码中的 DemoService 就是上图中服务消费端的 proxy,用户代码通过这个 proxy 调用其对应的 Invoker(DubboInvokerHessianRpcInvokerInjvmInvokerRmiInvokerWebServiceInvoker 中的任何一个),而该 Invoker 实现了真正的远程服务调用。

 服务提供者代码: 

 public class DemoServiceImpl implements DemoService { 

     public String sayHello(String name) throws RemoteException {

         return "Hello " + name;

     }

 } 

上面这个类会被封装成为一个 AbstractProxyInvoker 实例,并新生成一个 Exporter 实例。这样当网络通讯层收到一个请求后,会找到对应的 Exporter 实例,并调用它所对应的 AbstractProxyInvoker 实例,从而真正调用了服务提供者的代码。Dubbo 里还有一些其他的 Invoker 类,但上面两种是最重要的。


好的,下面是一个简单的 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 客户端服务端调用示例,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值