Dubbo注册中心挂了可以继续通信

234 阅读6分钟

一、工作原理

Dubbo 是一款开源的高性能、轻量级的分布式服务框架,它以 RPC(Remote Procedure Call)远程过程调用为核心,支持优雅的服务治理能力,能够帮助开发者迅速地构建和部署下一代应用。

Dubbo 中的通信是基于 Dubbo Protocol 的,Dubbo Protocol 是一种基于 TCP 和 Netty 的二进制协议,具有高效、简单、易扩展等特点。Dubbo 通过四种角色协同工作:服务提供方、服务消费方、注册中心和监控中心。其中,服务提供方将自己提供的服务注册到注册中心,并在需要调用该服务时,由消费方去注册中心查找相应的服务提供方。

在 Dubbo 的工作原理中,注册中心起到了重要的作用,它负责维护服务提供者的地址信息,并提供服务发现功能,让服务消费者可以通过注册中心快速找到可用的服务提供者。同时,注册中心还支持负载均衡和故障转移功能,使得 Dubbo 能够更好的适应应用的变化。

当注册中心挂了时,Dubbo 依然可以继续通信,因为注册中心的职责仅仅是为服务提供方和服务消费方建立联系,而不是直接参与通信。Dubbo 的服务提供方和服务消费方可以通过缓存来保持联系,例如服务提供方可以将自己的地址信息缓存在本地磁盘中,当注册中心不可用时,服务消费方可以直接从缓存中读取服务提供方的地址信息进行调用。

Dubbo 通过 Dubbo Protocol 和注册中心实现了高效、简单、灵活的远程服务调用机制,即使当注册中心挂了,也能让服务提供方和服务消费方保持通信,这也是 Dubbo 在分布式架构中应用广泛的原因之一。

二、工作流程

Dubbo 的工作流程主要包括服务注册、服务发现、负载均衡、服务调用等几个阶段,具体如下:

  1. 服务注册:服务提供者在启动时会向注册中心注册自己提供的服务,包括服务接口、版本号、协议等信息,以及服务所在的 IP 地址和端口号。注册完成后,注册中心会保存这些信息并通知其他服务消费者。

  2. 服务发现:服务消费者在启动时会向注册中心查询可用的服务提供者,并获取其地址信息。Dubbo 默认采用 ZooKeeper 作为注册中心,具有较好的稳定性和可靠性。

  3. 负载均衡:Dubbo 支持多种负载均衡算法,例如随机、轮询、加权轮询、最小活跃数等。服务消费者可以根据实际业务选择所需的负载均衡算法,默认情况下是基于哈希算法进行负载均衡。

  4. 服务调用:服务消费者通过代理对象去调用远程服务,Dubbo 会将请求数据序列化成 Dubbo 协议进行传输。服务端收到请求后,会解析 Dubbo 协议,反序列化请求数据,并通过反射调用相应的服务方法进行处理。处理完成后,将响应结果再次序列化成 Dubbo 协议进行传输,服务消费者收到响应后进行解析并得到最终结果。

在整个过程中,Dubbo 通过注册中心、负载均衡等技术手段,保证了服务之间的可用性和稳定性。同时,Dubbo 还支持多种高级特性,例如服务治理、容错机制、服务降级等,可以满足不同系统对于服务调用的需求。 image.png

三、是如何继续通信的

Dubbo 在底层是通过缓存机制来解决注册中心挂了仍然能够通信的问题。

具体实现是在服务提供者启动时,Dubbo 会将自己提供的服务信息缓存到本地的内存中,同时定时向注册中心发送心跳信息,一旦注册中心挂了,服务提供者还可以继续提供所缓存的服务信息,因为服务消费者访问服务者时,会先访问本地缓存,如果缓存中没有,则会尝试从注册中心获取。因此,当注册中心不可用时,服务消费者仍然可以通过缓存中的服务提供者地址信息来进行调用。

此外,Dubbo 还支持多种注册中心的协议,例如 Zookeeper、Redis、Multicast 等,这些注册中心之间可以共同组成一个集群,通过互相备份,提高系统的可靠性和可用性。

在 Dubbo 中,通过缓存机制和集群备份策略,使得即使注册中心挂了,服务提供者和消费者之间也能够保持联系,从而继续通信。

假设现在有一个需求,需要实现一个分布式的电商系统,在该系统中,购买商品的业务流程是由前端发起请求,后端根据关键字查询相关的商品信息,将商品信息返回给前端。假设采用 Dubbo 框架来实现该系统,Dubbo 框架的工作原理如下:

  1. 服务的提供方和消费方首先要指定使用 Dubbo 作为 RPC 框架,并且使用对应的协议进行通信(例如 dubbo:// 或者 http://)。

  2. 服务提供方需要将自己提供的服务注册到注册中心中,因此需要配置相应的注册中心地址、服务接口、协议等信息。同时,服务提供方还需要在启动时调用 Dubbo 提供的 API,将自己的服务注册到注册中心上,以便服务消费方能够找到它。例如,可以通过以下代码实现服务的注册:

@Service(interfaceClass = UserService.class, version = "1.0.0", timeout = 5000)
public class UserServiceImpl implements UserService {
    // 服务提供方需要实现 UserService 接口中的方法
    ...
 
    // 将服务注册到注册中心
    public void registerService() {
        String registryAddress = "zookeeper://127.0.0.1:2181";
        RegistryConfig registryConfig = new RegistryConfig(registryAddress);
        ServiceConfig<UserService> service = new ServiceConfig<>();
        service.setInterface(UserService.class);
        service.setRef(new UserServiceImpl());
        service.setRegistry(registryConfig);
        service.export();
    }
}
  1. 服务消费方需要通过相应的协议向注册中心查询可用的服务提供方,并获取相应的服务地址信息。Dubbo 提供了多种负载均衡策略,服务消费方可以根据具体的业务需求选择所需的负载均衡算法。
public class Consumer {
    public static void main(String[] args) {
        String registryAddress = "zookeeper://127.0.0.1:2181";
        ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(UserService.class);
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setTimeout(5000);
        referenceConfig.setRegistry(new RegistryConfig(registryAddress));
        UserService userService = referenceConfig.get();
 
        // 调用远程服务方法
        User user = userService.getUserById(1001L);
        System.out.println(user);
    }
}
  1. 当服务消费方调用远程服务时,Dubbo 框架会自动将请求封装成协议进行传输,服务提供方收到请求后会根据相应的协议进行解析,并调用相应的服务实现方法。服务提供方将返回结果封装成协议进行传输,服务消费方收到结果后进行解析并得到最终的结果。

通过以上步骤,Dubbo 框架将实现电商系统的服务调用功能,同时支持服务的注册、发现、治理等能力,保证了整个系统的可用性和稳定性。