Dubbo高可用

news2024/10/6 18:25:17

1.zookeeper宕机与dubbo直连

1.1.现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。

原因:

  1. 监控中心宕掉不影响使用,只是丢失部分采样数据
  2. 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  3. 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  4. 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  5. 服务提供者无状态,任意一台宕掉后,不影响使用
  6. 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

高可用:通过设计,减少系统不能提供服务的时间;

1.2.服务直连dubbo

@Reference(url = "127.0.0.1:20881") // dubbo直连
public UserService userService;

2.集群下dubbo负载均衡配置

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

2.1.Random LoadBalance

随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

2.2.RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

2.3.LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

2.4.ConsistentHash LoadBalance

一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。算法参见
缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />
缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key=“hash.nodes” value=“320” />

2.5.配置

2.5.1.服务端服务级别

<dubbo:service interface="..." loadbalance="roundrobin" />

2.5.2.客户端服务级别

<dubbo:reference interface="..." loadbalance="roundrobin" />

2.5.3.服务端方法级别

<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

2.5.4.客户端方法级别

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

3.服务降级

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
向注册中心写入动态配置覆盖规则:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));

其中:
mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响

在这里插入图片描述

还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响

在这里插入图片描述

4.集群容错

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

4.1.集群容错模式

Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。

重试次数配置如下:
<dubbo:service retries=“2” /><dubbo:reference retries=“2” />
或
dubbo:reference
<dubbo:method name=“findFoo” retries=“2” />
</dubbo:reference>

Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。

Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

集群模式配置
按照以下示例在服务提供方和消费方配置集群模式
<dubbo:service cluster=“failsafe” /><dubbo:reference cluster=“failsafe” />

4.2.整合hystrix

4.3.1.配置Provider端

POM

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

启动类

/**
 * 启动类
 * @author liqb
 * @date 2023-05-28 21:36
 */
@EnableHystrix //开启服务容错功能
@EnableDubbo // 开启基于注解的dubbo功能
@ImportResource(locations = "classpath:provider.xml")
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

业务类

在Dubbo的Provider上增加@HystrixCommand配置,这样子调用就会经过Hystrix代理。

/**
 * 按照用户id返回所有的收货地址
 * @author liqb
 * @date 2023-05-28 16:48
 * @param userId 用户id
 * @return
 */
@Override
@HystrixCommand(commandProperties = {
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 失败次数
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") // 超时时间
})
public List<UserAddress> getUserAddressList(String userId) {
    UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");
    UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");
    
    if (Math.random() > 0.5) {
        throw new RuntimeException("Exception to show hystrix enabled.");
    }
    return Arrays.asList(address1,address2);
}

4.3.2.配置Consumer端

POM

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

启动类

/**
 * 启动类
 * @author liqb
 * @date 2023-05-28 21:46
 */
@EnableHystrix
@EnableDubbo // 开启基于注解的dubbo功能
@SpringBootApplication
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

业务类

对于Consumer端,则可以增加一层method调用,并在method上配置@HystrixCommand。当调用出错时,会走到fallbackMethod = "reliable"的调用里。

/**
 * 初始化订单
 * @author liqb
 * @date 2023-05-28 16:52
 * @param userId 用户id
 */
@Override
@HystrixCommand(fallbackMethod = "reliable")
public List<UserAddress> initOrder(String userId) {
    log.info("用户id:{}", userId);
    // 查询用户的收货地址
    List<UserAddress> userAddressList = userService.getUserAddressList(userId);
    return userAddressList;
}
public List<UserAddress> reliable(String name) {
    return Arrays.asList(new UserAddress(1, "测试用户地址", "测试用户id", "测试收货人", "测试电话号码", "否"));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见的Linux发行版配置要求到底有多低?

常见的Linux发行版配置要求主要包括以下几个方面&#xff1a; 处理器&#xff1a; 一般来说&#xff0c;64位的Linux发行版需要至少2GHz的CPU速度&#xff0c;对于较老的处理器&#xff0c;可以选择使用32位的Linux发行版。 内存&#xff1a; Linux发行版通常需要至少1GB的…

AdaIN

AdaIN的全名是Adaptive Instance Normalization&#xff0c;源自风格迁移的论文Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 假设原图和风格图经过VGG进行特征提取后得到shape分别为CxHxW和CxH‘xW’的特征图c和s&#xff0c;AdaIN的计算如…

AspNetCore中的依赖注入详解

1 概述 ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务&#xff0c;为了方便对这些组件进行定制&#xff0c; ASP.NET Core通过定义接口的方式对它们进行了“标准化”&#xff0c;我们将这些标准化的组件称为服务&#xff0c; …

【高数+复变函数】Laplace变换

文章目录 【高数复变函数】Laplace变换1. 问题引入及定义2. 存在定理3. 常见Laplace变换 【高数复变函数】Laplace变换 1. 问题引入及定义 上一节&#xff1a;【高数复变函数】傅里叶积分 回顾之前我们讲的傅里叶变换要满足的条件有&#xff08;也就是傅里叶积分要满足的条件…

RL - 强化学习 Decaying Epsilon Greedy 算法解决多臂老虎机问题

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130945234 Decaying Epsilon Greedy 算法是一种强化学习中的探索策略&#xff0c;可以平衡开发和探索之间的矛盾。基本思想是&#xff0…

第15章:索引的数据结构

一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则通过索引查找相关数据。如果不符合则需要全表扫描&#xff0c;一条一条查找记录&#xff0c;直到…

Layui源码解读之define函数

一、layui.define 用法 layui.define([mods], callback) 通过layui.define该方法可在新的 JS 文件中定义一个 layui 模块。 mods 是可选的&#xff0c;用于声明该模块所依赖的模块。callback 为模块加载完毕的回调函数&#xff0c;它返回一个 exports 参数&#xff0c;用于输出…

鸿蒙App开发选择Java还是JavaScript?

众所周知&#xff0c; Java和 JavaScript是两种编程语言&#xff0c;这两种语言在不同的环境中都有许多用途。在鸿蒙 App开发中&#xff0c; Java和 JavaScript是两种常见的编程语言&#xff0c;它们都具有广泛的应用&#xff0c;并且都有其独特的优势。下面我们将就这两种编程…

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置 1、位置订阅1.1、国标设备编辑1.2、选择设备开启位置订阅1.3、全局开启位置订阅1.4、通过目录订阅获取位置(少数情况) 2、经纬度信息查询2.1、访问接口获取2.1.…

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速&#xff0c;业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS&#xff08;Integration Platform as a Service&#xff09;与RPA&#xff08;Robotic Process Automation&#xff09;在业务系统集成方面的区别&#xff0c;它们各自的用途和适…

python数据分析案例——零售商店电子销售订单分析

一、项目背景 通过"扫描"零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。 这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。 二、数据来源 https://www.kaggle.com/marian447/retail-store-sales-transactions 三、提出问…

windows11@OpenWith@选择文件打开方式导致卡死@windows11任务栏显示秒

文章目录 OpenWith选择文件打开方式导致卡死解决方案 windows11任务栏显示秒显示秒的注册表设置取消显示秒: OpenWith选择文件打开方式导致卡死 关键在于一个名为openwith的进程出现问题该进程有时会卡死,并且无法关闭,这个bug存在很久了,具体参考:Windows11 - Microsoft Comm…

MySQL 多行函数

文章目录 多行函数1. 求 country 表中&#xff0c;所有国家人口的平均值&#xff0c;其 SQL 语句实现如下&#xff1a;2. 求 country 表中&#xff0c;所有国家人口的总数&#xff0c;其 SQL 语句实现如下&#xff1a;3. 求 country 表中&#xff0c;人口最多和最少国家的人口数…

KD7742耐压接地泄漏绝缘四合一并行测试仪

一、产品简介 KD7742耐压接地泄漏绝缘四合一并行测试仪具有交/直流耐压、绝缘电阻等项目的测试分析功能&#xff0c;能显示电压、电流和电阻的波形图以及趋势图&#xff0c;以便更直观的监测分析绝缘性能和绝缘崩溃时的各项指标&#xff0c;适用于高要求的测试分析场合。 产品具…

Pig项目新加权限类型生成Token并且解决验证问题

前言 这个教程可能不是最好的,也许是最直白的,你只需要找到对应的地方跟着博主一起去修改就能操作成功,今天用添加 mini 的授权模式的例子说一下这个 mini 模式是自己自定义的,你想叫什么都行 最近可烦死了快被折磨死人,在昨天睡了一觉,今天就解决问题了…睡一觉就能解决问题,那…

教你一步步使用实现TensorFlow 进行对象检测

在本文中,我们将学习如何使用 TensorFlow Hub 预训练模型执行对象检测。TensorFlow Hub 是一个库和平台,旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程,从而促进协作、减少冗余工作并加速机器学习的研发。用户可以搜索社区…

【数据结构与算法分析inC-MarkAllen】2-算法分析

文章目录 第二章——算法分析2.1 算法评价的量化理论2.1.1 函数渐进增长四种渐进增长定义运算法则两个函数相对增长率判断 2.1.2 算法分析的计算机模型2.1.3 要分析的目标最坏情况 2.1.4 一般法则for循环嵌套for循环顺序语句分支语句二分函数调用 2.2 计算方法2.2.1 循环主体中…

Android应用的加固与逆向

文章目录 前言名词释义加固手段逆向dex文件resources.arscReact Native TODO文档链接工具参考加固工具逆向工具 前言 加固与逆向是安卓攻防的两个方面。搞安卓研发时间长了就不可避免走到这一步。既要研究别人的实现&#xff0c;又要保护好自己的东西。个人认为&#xff0c;逆…

糖尿病首创新药的中国梦

《多肽链》原创出品 作者&#xff5c;慕白 在中国上市一款first-in-class&#xff08;FIC&#xff09;全球首创新药&#xff0c;有多难&#xff1f;先来看一组数据对比。 按照美国FDA的药品评价和研究中心&#xff08;CDER&#xff09;报告数据&#xff0c;2022年有37款新药…

chatgpt赋能python:介绍Python中二次函数的基本知识

介绍Python中二次函数的基本知识 在Python中&#xff0c;二次函数是一个重要的概念&#xff0c;它是由一个二次项、一次项和一个常数项构成的一个代数式。二次函数在数学和物理学中都有广泛的应用&#xff0c;了解二次函数的基本知识对于学习和理解这些领域都是非常重要的。在…