zk挂了dubbo还能远程调用服务吗?

举报
赵KK日常技术记录 发表于 2023/09/22 23:42:45 2023/09/22
【摘要】 推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间https://drive.uc.cn/s/2aeb6c2dcedd4AIGC资料包https://dr...

推荐阅读

AI文本 OCR识别最佳实践

AI Gamma一键生成PPT工具直达链接

玩转cloud Studio 在线编码神器

玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间

资源分享

「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间
https://drive.uc.cn/s/2aeb6c2dcedd4
AIGC资料包
https://drive.uc.cn/s/6077fc42116d4
https://pan.xunlei.com/s/VN_qC7kwpKFgKLto4KgP4Do_A1?pwd=7kbv#
https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH

引言

在分布式系统中,远程服务调用是一项常见的技术需求。Dubbo作为一个流行的分布式服务框架,提供了便捷的远程服务调用方式。而ZooKeeper(简称zk)作为Dubbo的注册中心之一,被广泛使用来管理和发现服务。

然而,在实际应用中,我们经常会遇到zk宕机的情况。这引发了一个问题:如果zk挂了,是否仍然能够远程调用Dubbo服务?本文将深入探讨这个问题,并给出相应的解决方案。

Dubbo的工作原理

在开始讨论之前,先来回顾一下Dubbo的工作原理。Dubbo采用了一种类似于服务治理的设计模式,其中包含三个核心角色:

  1. 服务提供者(Provider):发布服务并将其注册到注册中心。
  2. 服务消费者(Consumer):从注册中心获取服务提供者的地址,通过网络请求调用服务。
  3. 注册中心(Registry):负责存储和管理服务提供者的信息。

当服务启动时,服务提供者将自己的信息注册到zk上,包括服务接口名、版本、提供者地址等。而服务消费者通过zk获取服务提供者的地址列表,并根据负载均衡策略选择其中一个进行远程调用。

zk挂了,远程调用是否可行?

当zk宕机或者网络故障时,Dubbo的默认行为是不允许任何新的服务注册或发现。这是因为Dubbo的设计哲学是"失败快速",即在遇到问题时立即停止服务,以避免错误传播。

但是对于已经注册过的服务,Dubbo提供了一种优雅降级的机制,使得消费者仍然能够调用已知的服务。

优雅降级的实现

Dubbo的优雅降级是通过本地缓存和本地调用来实现的。具体而言,当zk无法正常工作时,Dubbo会将已知服务提供者的地址列表缓存在本地内存中。消费者在请求服务时,会先检查本地缓存中是否有可用的服务地址,如果有,则直接进行本地调用;如果没有,则抛出异常。

以下是一个示例代码演示如何使用Dubbo进行远程调用,即使zk挂了:

public class DemoServiceConsumer {
    @Reference(url = "dubbo://localhost:20880/com.example.DemoService")
    private DemoService demoService;

    public String invokeRemoteService(String param) {
        try {
            return demoService.remoteMethod(param);
        } catch (Exception e) {
            // 远程调用失败,进行本地降级处理
            return localFallback(param);
        }
    }

    private String localFallback(String param) {
        // 本地降级逻辑,返回默认值或者缓存数据
        return "Fallback Result";
    }
}

在上述示例中,@Reference注解用于声明一个远程服务的引用。如果远程调用失败(即zk挂了),则会捕获异常并执行本地降级逻辑。

需要注意的是,本地降级只能对已知的服务进行,因此在应用启动阶段,消费者需要与服务提供者建立连接并获取服务地址列表。这可以通过预热缓存、定时任务等方式实现。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。