SpringColud——Ribbon(负载均衡)Hystrix(熔断器)

news2024/11/18 7:36:14

目录

1、Ribbon

1.1、什么是Ribbon(负载均衡)

1.2、创建两个user-service实例

1.3、开启负载均衡

2、Histrix(熔断器)

2.1、什么是Histrix

2.2、雪崩问题

2.3、服务降级

2.4、开启熔断

2.5、编写降级逻辑

2.6、编写降级逻辑(默认的Fallback)

2.7、超时设置


 

前言:请先看完我上篇文章——SpringColud——Eureka后再看此篇文章,此文衔接上文 

1、Ribbon

1.1、什么是Ribbon(负载均衡)

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

1.2、创建两个user-service实例

user-service的yml文件

server:
  port: 8081
spring:
  application:
    name: user-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: xxx
mybatis:
  type-aliases-package: cn.itssl.pojo
  mapper-locations: classpath:mappers/*.xml
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
  instance:
    # 更倾向使用ip地址,而不是host名
    prefer-ip-address: true
    # 续约间隔,默认30秒
    lease-renewal-interval-in-seconds: 5
    # 服务失效时间,默认90秒  服务失效时间是要比续约间隔时间大的
    lease-expiration-duration-in-seconds: 10

user-service2的yml文件

server:
  port: 8083
spring:
  application:
    name: user-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: ssl0528
mybatis:
  type-aliases-package: cn.itssl.pojo
  mapper-locations: classpath:mappers/*.xml
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
  instance:
    # 更倾向使用ip地址,而不是host名
    prefer-ip-address: true
    # 续约间隔,默认30秒
    lease-renewal-interval-in-seconds: 5
    # 服务失效时间,默认90秒  服务失效时间是要比续约间隔时间大的
    lease-expiration-duration-in-seconds: 10

启动eureka服务,访问http://127.0.0.1:8761可以看到有两个user-service服务已经注册到了注册中心。 

1.3、开启负载均衡

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。

在客户端consumer-service启动类中的RestTemplate的配置方法上添加 @LoadBalanced 注解:

@SpringCloudApplication //包含@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    //远程调用工具
    @Bean
    //开启负载均衡  要求客户端必须面向服务的去调用
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

不再手动获取ip和端口,而是直接通过服务名称调用;

@GetMapping("{id}") 
public User queryById(@PathVariable("id") Long id){
    String url = "http://user-service/user/" + id; 
    User user = restTemplate.getForObject(url, User.class); 
    return user; 
}

访问查询用户10次,会远程调用到user-service

可以看出,user1和user2的访问次数都是5次,user-service具体调用到那个,会默认轮询的原则去访问,这就是负载均衡。 

如果想要其他的原则,可以改变为随机访问,修改consumer-service的yml文件,改为随机访问

user-service: 
	ribbon: 
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

2、Histrix(熔断器)

2.1、什么是Histrix

Hystrix在英文里面的意思是豪猪,它的logo看下面的图是一头豪猪,它在微服务系统中是一款提供保护机制的组件,和eureka一样也是由netflix公司开发。官网:https://github.com/Netflflix/Hystrix/

那么Hystrix的作用是什么呢?具体要保护什么呢?

Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败

2.2、雪崩问题

微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路:

如图,一次业务请求,需要调用A、P、H、I四个服务,这四个服务又可能调用其它服务。

如果此时,某个服务出现异常:

例如: 微服务I 发生异常,请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:

服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。

这就好比,一个汽车生产线,生产不同的汽车,需要使用不同的零件,如果某个零件因为种种原因无法使用,那么就会造成整台车无法装配,陷入等待零件的状态,直到零件到位,才能继续组装。 此时如果有很多个车型都需要这个零件,那么整个工厂都将陷入等待的状态,导致所有生产都陷入瘫痪。一个零件的波及范围不断扩大。

Hystrix解决雪崩问题的手段主要是服务降级,包括:

线程池隔离 

把每个服务的线程分离开,这样即使有服务崩溃了,其他服务也不会受影响。
服务降级
秒杀的时候,本来是要抢茅台的,结果返回了一条提示:网络拥挤,请稍后重试!没有走抢茅台的方法,走了提示的方法!
服务熔断:

拒绝请求

2.3、服务降级

 在 consumer-service消费端系统的pom.xml文件添加如下依赖:

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

2.4、开启熔断

在启动类 ConsumerApplication 上添加注解:@EnableCircuitBreaker,可以使用@SpringCloudApplication,里面整合的有@EnableCircuitBreaker

@SpringCloudApplication //包含@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    //远程调用工具
    @Bean
    //开启负载均衡  要求客户端必须面向服务的去调用
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2.5、编写降级逻辑

当目标服务的调用出现故障,我们希望快速失败,给用户一个友好提示。因此需要提前编写好失败时的降级处理逻辑,要使用HystrixCommand来完成。

@RestController
@RequestMapping("/consumer")
//服务降级
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/{id}")
    @HystrixCommand(fallbackMethod = "getUserException")
    public User getUser(@PathVariable("id") String id){
        if("1".equals(id)){
            throw new RuntimeException("网络异常!");
        }
        String url="http://user-service/user/"+id;
        return restTemplate.getForObject(url, User.class);
    }
    //编写降级方法  必须与保护方法保持相同的返回值类型和参数值
    public User getUserException(String id){
        User user=new User();
        user.setUsername("当前网络波动异常!");
        return user;
    }
   
}

要注意;因为熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明

失败逻辑中返回User对象没有太大意义,一般会返回友好提示。这里只是演示方便。

@HystrixCommand(fallbackMethod = "xxx"):用来声明一个降级逻辑的方法。

2.6、编写降级逻辑(默认的Fallback)

刚才把fallback写在了某个业务方法上,如果这样的方法很多,那岂不是要写很多。所以可以把Fallback配置加在类上,实现默认fallback;

@RestController
@RequestMapping("/consumer")
@DefaultProperties(defaultFallback = "getUserException2") //默认降级 这个类中所有保护的方法,出现问题后,走的是同一个降级方法
//服务降级
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;


    @GetMapping("/{id}")
    // @HystrixCommand(fallbackMethod = "getUserException")
    @HystrixCommand
    public User getUser(@PathVariable("id") String id){
        if("1".equals(id)){
            throw new RuntimeException("网络异常!");
        }
        String url="http://user-service/user/"+id;
        return restTemplate.getForObject(url, User.class);
    }

    @GetMapping("/getUser/{id}")
    // @HystrixCommand(fallbackMethod = "getUserException")
    @HystrixCommand
    public User getUser2(@PathVariable("id") String id){
        if("1".equals(id)){
            throw new RuntimeException("获取数据异常,请重试!");
        }
        String url="http://user-service/user/"+id;
        return restTemplate.getForObject(url, User.class);
    }

    //编写降级方法  必须与保护方法保持相同的返回值类型和参数值
    public User getUserException(String id){
        User user=new User();
        user.setUsername("当前网络波动异常,请稍后重试!");
        return user;
    }
    //编写默认降级方法  要求必须与保护方法的返回值类型一致,参数列表不要求
    public User getUserException2(){
        User user=new User();
        user.setUsername("当前网络波动异常!");
        return user;
    }

}

2.7、超时设置

在之前的案例中,请求在超过1秒后都会返回错误信息,这是因为Hystrix的默认超时时长为1,我们可以通过配置修改:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2500

我们在查询之前先进行休眠2秒 ,如果不修改超时时间的话,会走降级方法的。因为默认是不到1秒的时间,2秒已经超过了1秒

@RestController
@RequestMapping("/consumer2")
//超时时间
public class ConsumerController2 {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;


    @GetMapping("/{id}")
    @HystrixCommand(fallbackMethod = "getUserException")
    public User getUser(@PathVariable("id") String id){
        try {
            //请求过来先休眠2秒
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String url="http://user-service/user/"+id;
        return restTemplate.getForObject(url, User.class);
    }

    //编写降级方法  必须与保护方法保持相同的返回值类型和参数值
    public User getUserException(String id){
        User user=new User();
        user.setUsername("网络拥挤请稍后重试!");
        return user;
    }

}

在等待了2秒后,依然能够查询出结果 

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

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

相关文章

顶象App加固——助力微投证券融入IOS生态

过去十年里&#xff0c;App几乎重新定义了互联网&#xff0c;如今所有人的智能手机里都有着无数个App。 以App store 为例。最新数据显示&#xff0c;当前61个国家/地区在 App Store 现存的App总数为29,085,727。其中虽包含重复的App&#xff0c;但也可见在不同国家/地区&…

毕业设计 基于STM32单片机的老人防摔倒报警系统 - 物联网 嵌入式

文章目录0 前言1 整体设计2 硬件电路3 软件设计4 跌倒检测算法5 关键代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

Partition of an interval

In mathematics, a partition of an interval [a, b] on the real line is a finite sequence x0, x1, x2, …, xn of real numbers such that a x0 < x1 < x2 < … < xn b. In other terms, a partition of a compact interval I is a strictly increasing seq…

《小白WEB安全入门》01. 扫盲篇

扫盲篇基础知识什么是WEB什么是前端什么是后端什么是数据库什么是协议什么是WEB安全什么是服务器什么是IP地址、端口什么是局域网、广域网、内网、外网什么是URL什么是MAC地址什么是&#xff08;端口&#xff09;映射什么是域名、DNS什么是网卡、网关什么是IPv4/IPv6什么是Linu…

51单片机的温控风扇设计

一.硬件方案 系统采用51单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值&#xff0c;测得温度值在高低温度之间时打开风扇弱风档&#xff0c;当温度升高超过所设定的温度时自动切换到大风档&#xff0c;当温度小于所设定的温度时自动关闭风扇。风扇控制状态随…

论坛系统设计与实现

摘 要 网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于论坛交流将是又一个传统管理到智能化信息管理的改革&#xff0c;设计论坛系统设计与实现的目的就是借助计算机让复杂的论坛交流操作变简单&#xff0c;变…

第8部分 帧中继

帧中继线路是中小企业常用的广域网线路&#xff0c;其通信费用较低。由于帧中继技术的一些特殊性使得帧中继的配置较为复杂&#xff0c;特别是在帧中继上运行路由协议时更是如此。作为入门&#xff0c;对帧中继的理解应着重放在DLCI、PVC、帧中继映射和子接口等概念上。本章通过…

Redis--高级篇 D5 多级缓存(JVM进程缓存、Lua语法、OpenResty安装(通过lua扩展nginx))

1、JVM进程缓存 1.1 导入商品查询案例 案例导入说明 为了演示多级缓存&#xff0c;我们先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到MySQL的主从功能&#xff0c;所以需要大家在虚…

【Pytorch】.item() 方法介绍

文章目录一、.item() 方法介绍1. 方法介绍2. 那么有什么用呢&#xff1f;二、实例参考链接一、.item() 方法介绍 1. 方法介绍 我们先看官网中是怎么介绍的&#xff1a; 返回这个张量的值作为一个标准的Python数字。 详情页中说&#xff1a; # TORCH.TENSOR.ITEM Tensor.ite…

配对交易之统计套利配对:模型的应用

接下来&#xff0c;介绍把协整模型应用到取对数之后的股价上面。 前提假设&#xff1a;股价取对数之后是一个随机游走过程&#xff0c;即非平稳的。 现在有股票A和B,股价取对数之后的两个时间序列是以及。使用误差修正的表达方式&#xff1a; 能够唯一确定以上式子的参数是协…

uView教程-抽屉菜单 #低代码 #小程序 #uView

这种抽屉效果是如何制作的呢&#xff1f; 在guiplan低代码开发工具中&#xff0c; 点击"uView框架", 输入关键字"弹出层"进行搜索&#xff0c; 找到"带用户菜单" 点击"一键插入", 这我们一个抽屉菜单就插入进来了&#xff0c; 底部…

MapReduce编程实例-词频统计实现

文章目录词频统计实现思路词频统计实现步骤1. 准备数据文件1.1 在虚拟机上创建文本文件1.2 上传文件到HDFS指定目录2. 创建Maven项目3. 添加相关依赖4. 创建日志属性文件5. 创建词频统计映射类6. 创建词频统计驱动器类7. 运行词频统计驱动器类&#xff0c;查看结果8. 修改词频统…

设计一个简单HTML爵士音乐网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringCloud Feing 源码 (简单实用) (一)

文章目录1.远程调用2.代码解析2.1 Eureka微服务2.1 微服务结构以及配置类2.2 公共类2.3 provider微服务2.4 Feign-Order微服务3.结果展示1.远程调用 本地过程调用&#xff08;Local Procedure Call&#xff0c;LPC&#xff09;&#xff0c;是指同一台机器上运行的不同进程之间…

从MES到MOM,抓住中国工业软件的机遇

从全球市场看&#xff0c;MES也是正进入MOM阶段&#xff0c;如图四所示。目前很多还是智能化第二代MES&#xff0c;主要是加强数据记录与处理和设备自动化管理&#xff0c;通过更精确的过程状态跟踪和更完整的数据记录&#xff0c;获取更多的数据来优化生产管理&#xff0c;并通…

被微服务轰炸?莫怕!耗时35天整出的「微服务学习教程」送你

又被微服务轰炸&#xff1f;莫慌莫怕&#xff01;小编连续25天&#xff0c;整出这份最新最全「学习教程」送你&#xff01; 微服务架构学习教程&#xff1a;RPCDubboSpirngBootSpringCloud AlibabaDockerK8s 手绘了整个微服务架构的知识体系脑图&#xff0c;还有针对分部的Dub…

LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换

目录 1.LabelImg标注的YOLO格式的TXT标签 OpencvYOLO-V3实现目标跟踪 YOLO-V3实时检测实现&#xff08;opencvpython实现&#xff09;——改进——&#xff1e;更加的易懂 YOLO-V3实时检测实现&#xff08;opencvpython实现&#xff09; 1.LabelImg标注的YOLO格式的TXT标签 …

【Mysql】记录一些特殊的select语句

目录一.分页查询二.多表查询三.自连接四.子查询4.1单行子查询4.2多行子查询4.3临时表子查询4.4多行子查询4.5多列子查询一.分页查询 select...limit start,rows 表示从start1行开始取&#xff0c;取出rows行&#xff0c;start从0开始算 公式&#xff1a;limit 每页显示记录数*…

R语言NLP案例:LDA主题文本挖掘优惠券推荐网站数据

介绍 Groupon是一个优惠券推荐服务&#xff0c;您可以免费注册Groupon&#xff0c;并且Groupon每天都会向您发送包含该地区当天交易的电子邮件。如果您喜欢这笔交易&#xff0c;那么您可以立即从Groupon购买&#xff0c;并在餐馆/商店兑换。 相关视频&#xff1a;文本挖掘&…

微导纳米将于12月14日申购:前三季度收入约4亿元,同比增长67%

12月5日&#xff0c;江苏微导纳米科技股份有限公司&#xff08;下称“微导纳米”&#xff0c;SH:688147&#xff09;披露招股意向书&#xff0c;启动发行招股&#xff0c;初步询价时间定于2022年12月9日&#xff0c;将于2022年12月14日申购。 据了解&#xff0c;微导纳米拟在上…