一、Dubbo直连模式
在Dubbo中,一个节点可以作为服务提供者、消费者或者注册中心。默认情况下,Dubbo的消费者会向注册中心订阅服务提供者地址,在消费者发起调用时,Dubbo会通过注册中心获取服务提供者的地址并进行调用。而Dubbo直连模式则是一种在消费者端直接指定服务提供者地址的方式,绕过注册中心直接与服务提供者通信。
使用Dubbo直连模式可以避免服务提供者注册中心故障影响客户端调用,同时也可以降低系统负担。
二、Dubbo直连与ZooKeeper区别
Dubbo直连和ZooKeeper是两种不同的Dubbo服务消费方式,Dubbo直连是在消费端直接指定服务提供方的ip地址,绕过注册中心直接与服务提供方建立连接。而ZooKeeper则是通过Dubbo注册中心来管理服务提供者的地址信息,并由调用方向ZooKeeper注册中心请求服务提供者地址。
三、Dubbo直连方式
Dubbo直连有两种方式:
- 使用点分隔符指定服务提供方的ip:port
- 使用registry协议指定服务提供方地址
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服务。
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直连的详解,这里是代码示例:代码示例
- Dubbo直连方式
- Dubbo直连调用
- Dubbo直连重试
- Dubbo直连本地
- Dubbo直连的URL
- Dubbo直连version
reference:
id: demoService
url: dubbo://192.168.0.101:20880
interface: com.demo.interfaces.DemoService
// 服务引用配置
ReferenceConfig
reference = new ReferenceConfig<>();
reference.setInterface(xxxService.class);
reference.setUrl("dubbo://{host}:{port}");
// 创建引用实例
xxxService service = reference.get();
result = service.invokeMethod();
reference.setRetries(3);
reference:
id: demoService
url: dubbo://127.0.0.1:20880
interface: com.demo.interfaces.DemoService
dubbo://192.168.0.101:20880/com.demo.interfaces.DemoService?version=1.0.0
reference.setVersion("1.0.0");