您的位置:

Dubbo直连详解

一、Dubbo直连模式

在Dubbo中,一个节点可以作为服务提供者、消费者或者注册中心。默认情况下,Dubbo的消费者会向注册中心订阅服务提供者地址,在消费者发起调用时,Dubbo会通过注册中心获取服务提供者的地址并进行调用。而Dubbo直连模式则是一种在消费者端直接指定服务提供者地址的方式,绕过注册中心直接与服务提供者通信。

使用Dubbo直连模式可以避免服务提供者注册中心故障影响客户端调用,同时也可以降低系统负担。

二、Dubbo直连与ZooKeeper区别

Dubbo直连和ZooKeeper是两种不同的Dubbo服务消费方式,Dubbo直连是在消费端直接指定服务提供方的ip地址,绕过注册中心直接与服务提供方建立连接。而ZooKeeper则是通过Dubbo注册中心来管理服务提供者的地址信息,并由调用方向ZooKeeper注册中心请求服务提供者地址。

三、Dubbo直连方式

Dubbo直连有两种方式:

  1. 使用点分隔符指定服务提供方的ip:port
  2.    
       reference:
        id: demoService
        url: dubbo://192.168.0.101:20880
        interface: com.demo.interfaces.DemoService
       
       

    以上代码指定了DemoService服务的提供方ip地址为192.168.0.101和端口号为20880。在Dubbo直连模式下,消费端不再向注册中心订阅DemoService服务的提供方地址信息,此时只有192.168.0.101:20880可提供DemoService服务。

  3. 使用registry协议指定服务提供方地址
  4.    
       reference:
         id: demoService
         url: registry://192.168.0.101:2181/com.alibaba.dubbo.registry.RegistryService?registry=zookeeper
         interface: com.demo.interfaces.DemoService
       
       

    以上代码使用registry协议指定了ZooKeeper的地址为192.168.0.101:2181,将注册中心的地址作为参数传给Dubbo调用,然后通过zookeeper协议指定DemoService服务的提供者地址。

四、Dubbo直连调用

Dubbo在消费者端使用直连方式调用服务提供者,与使用注册中心的方式一样,要先创建引用。


  // 服务引用配置
  ReferenceConfig
    reference = new ReferenceConfig<>();
  reference.setInterface(xxxService.class);
  reference.setUrl("dubbo://{host}:{port}");
  // 创建引用实例
  xxxService service = reference.get();
  result = service.invokeMethod();

   

在代码中,我们可以通过ReferenceConfig的setUrl方法指定服务提供者的URL地址,然后通过调用get方法来获取服务实例,然后就可以使用服务的方法进行调用了。

五、Dubbo直连重试

在Dubbo直连模式下,如果服务提供者宕机,消费者会直接失败。因此,Dubbo直连提供了重试机制,可以在服务调用失败后进行重试。

使用Dubbo直连重试机制,需要在reference配置中添加retries字段:


reference.setRetries(3);

以上代码指定了Dubbo直连调用失败后重试3次。对于一些业务场景比较复杂的应用,直连机制下的重试机制可以减少请求失败次数,提高应用的可用性。

六、Dubbo直连本地

Dubbo直连可以将服务提供者直接单独部署在一个服务节点中,这样可以极大地提高服务的响应速度。Dubbo还提供了本地直连模式,可以在同一台机器上的服务中使用Dubbo直连机制,可以避免Dubbo通过网络延迟传输Dubbo协议,从而提高系统的性能表现。

使用Dubbo本地直连方式,需要在服务提供方的dubbo.properties中配置local.only=true,然后再服务消费方的ReferenceConfig中配置url="dubbo://127.0.0.1:20880",将服务提供者地址指定为本地IP地址即可。

七、Dubbo直连的URL

Dubbo直连允许使用不同的URL进行调用逻辑处理,可以在URL中添加一些参数和属性。URL协议格式为:

dubbo://<host>:<port>/<path>?<param1>=<value1>&<param2>=<value2>&...

  • host:服务提供者的IP地址或主机名
  • port:服务提供者的端口号
  • path:对应的实现类接口名
  • param:一些可选参数

八、Dubbo直连version

在Dubbo中,每个服务的实现都有一个版本号。使用Dubbo直连方式调用服务,需要在消费端手动指定版本号。


  // 指定服务版本号
  reference.setVersion("1.0.0");

九、Dubbo直连和使用ZooKeeper的区别

使用Dubbo直连,可以直接指定服务提供者的地址,绕过注册中心直接进行服务调用。而使用ZooKeeper注册中心,Dubbo会通过ZooKeeper获取服务提供方地址信息,在调用时使用负载均衡算法进行调用。

在使用Dubbo直连的情况下,需要保证服务提供者和消费者都处于同一网络环境中。

以上是关于Dubbo直连的详解,这里是代码示例:

代码示例

  1. Dubbo直连方式
  2.    
        reference:
          id: demoService
          url: dubbo://192.168.0.101:20880
          interface: com.demo.interfaces.DemoService
       
       
  3. Dubbo直连调用
  4.    
        // 服务引用配置
        ReferenceConfig
         reference = new ReferenceConfig<>();
        reference.setInterface(xxxService.class);
        reference.setUrl("dubbo://{host}:{port}");
        // 创建引用实例
        xxxService service = reference.get();
        result = service.invokeMethod();
       
        
       
  5. Dubbo直连重试
  6.    
        reference.setRetries(3);
       
       
  7. Dubbo直连本地
  8.    
       reference:
          id: demoService
          url: dubbo://127.0.0.1:20880
          interface: com.demo.interfaces.DemoService
       
       
  9. Dubbo直连的URL
  10.    
        dubbo://192.168.0.101:20880/com.demo.interfaces.DemoService?version=1.0.0
       
       
  11. Dubbo直连version
  12.    
        reference.setVersion("1.0.0");