springcloud-hystrix断路器对微服务的容错处理

使用Hystrix实现微服务的容错处理

1.实现容错的手段

如果服务提供者响应的速度特别慢,那么消费者对提供者的请求就会强制等待,直到提供者响应或者超时。在高负载的情况下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗尽甚至整个系统的崩溃。例如曾经发生的一个案例,某个电子商务网站在某个星期五发生过载,过多的并法请求,导致用户支付请求延迟很久没有响应,在等待很长时间后最终失败,支付失败又导致用户重新刷新页面再次尝试支付,进一步增加了服务器的负载,最终整个系统崩溃了。

1.1雪崩效应

我们常把基础服务故障导致级联服务故障的现象称为雪崩效应。雪崩效应描述的是提供方不可用导致消费方不可用并将不可用逐渐放大的过程。

如下,当请求一直得不到回应,并且新的请求不断涌入,导致了雪崩效应

1.2.如何容错

想要避免雪崩效应,必须有强大的容错机制,该容错机制需要实现以下两点

  • 为网络请求设置超时
  • 使用断路器模式

    正常情况下断路器关闭可正常请求服务,当一定时间内请求达到了一定的阈(yu)值(错误率达到百分之50或者100次/分钟),断路器就会打开此时不会再去请求依赖服务,断路器打开一段时间之后,会自动进入半开的状态。此时断路器允许一个请求请求服务实例,如果该服务可以调用成功,则关闭断路器,否则继续保持打开状态。

断路器Hystrix应该在哪一方使用?

断路器应该在消费者一方使用,这样才能生效,如果设置在服务者一方,请求已经到达服务者,无法保护消费者和服务者。

2.使用hystrix实现容错

hystrix是Netfilx开源的延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性

3.通用方式整合Hystrix

1.为项目添加依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2.在消费者的入口类上添加注解
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class HiApplication {
    public static void main(String[] args) {
        SpringApplication.run(HiApplication.class, args);
}
3.让当前方法具备容错的能力

使用注解:@HystrixCommand(fallbackMethod = "hystrixFallback") ,并指定当断路器生效时调用的方法。

@RestController
@RequestMapping("/query")
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    LoadBalancerClient loadBalancerClient;

    @HystrixCommand(fallbackMethod = "hystrixFallback")
    @RequestMapping("/test")
    public String test(String name){
        String template = restTemplate.getForObject("http://EUREKA-PROVIDER/test/test1?name=" + name, String.class);
        return template;
    }

    //断路器生效时调用的方法
    public String hystrixFallback(String name){
        return "hystrixFallback info "+name;
    }
}
4.测试
1.启动eureka服务
2.启动生产者
3.启动消费者
4.访问消费者 http://localhost:8762/query/test?name=haha
结果
xixixi 8763  :haha
5.关闭生产者
6.访问消费者
结果
hystrixFallback info haha

我们知道,当请求失败,被拒绝超时或者短路器打开时都会进入到回退方法,但是进入回退方法并不是意味着断路器被打开,那怎样才算断路器打开呢?

5.实验 进行健康监测实时查看断路器是否打开
1.启动eureka服务
2.启动生产者
3.启动消费者
4.访问消费者
结果
{"name":"xiaohei","password":null,"age":null}
5.访问 http://ip:port/health
{
    status:"up",
    hystrix:{
        status:"up"
    }
}
6.关闭生产者
7.访问消费者
结果
{"name":"xiaohei","password":null,"age":-1}
8.访问 http://ip:port/health
{
    status:"up",
    hystrix:{
        status:"up"
    }
}
通过这里我们可以发现,尽管执行了fallback方法,但此时hystrix状态依然是up,这是因为咱们的失败率还没有达到阀值(默认5秒20次失败),这里再次强调,执行回退的逻辑并不代表断路器已经打开,请求超时,失败,被拒绝以及断路器打开都会执行回退逻辑
9.5秒请求20次
{
    status:"up",
    hystrix:{
        status:"CIRCUIT_OPEN"(断路器打开的标识)
    }
}

断路器的状态

半开状态

正常运行

开启状态

4.feign整合Hystrix

很显然@HystrixCommand是添加到方法上的,那么对于feign来说一定不适用,如何让Hystrix整合feign?

1.feign方法上添加相关注解
@FeignClient(serviceId = "HI-SERVICE",fallback = FeignClientFallBack.class)
public interface feignPost {
    @RequestMapping(value = "/test/test1", method = RequestMethod.POST)
    public User sayHi(User user);
}
2.实现Feign接口
@Component  //将该类交由工厂管理
public class FeignClientFallBack implements feignPost {
    @Override
    public User sayHi(User user) {
        System.out.println("Hystrix method is invoke");
        return null;
    }
}
3.添加feign的配置文件
为feign开启断路器
feign.hystrix.enabled=true

原文地址:https://www.cnblogs.com/mzc1997/p/10253993.html

时间: 2024-11-05 16:34:33

springcloud-hystrix断路器对微服务的容错处理的相关文章

springCloud(11):使用Hystrix实现微服务的容错处理-简介与实现

一.问题引入 如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到提供者响应或超时.在高负载场景下,如果不作任何处理,此类问题可能会导致服务消费者的资源耗尽甚至整个系统的崩溃. 1.1.雪崩效应 微服务架构的应用系统通常包含多个服务层.微服务之间通过网络进行通信,从而支撑起整个应用系统,因此,微服务之间难免存在依赖关系.任何微服务都并非100%可用,网络往往也很脆弱,因此难免有些请求会失败. 我们通常把"基础服务故障"导致"级联故障"的现象称为雪

springCloud(16):使用Zuul构建微服务网关-容错回退与高可用

一.容错与回退 1.1.容错 在Spring Cloud中,Zuul默认已经整合了Hystrix. 测试: a.依次启动eureka-server(4010).provide-user(4011).hystrix-consumer-movie(5012).microservice-gateway-zuul(5016).hystrix-dashboard(5013) b.访问http://localhost:5016/hystrix-consumer-movie/user/1,可正常获取结果 c.

springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离

1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2.多数据源:(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)支持N个数据源3.阿里数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发工具编辑器5.调用摄像头拍照 自定义裁剪编辑头像,头像图片色度调节6.we

SpringCloud(8)微服务监控Spring Boot Admin

1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring Boot Admin UI部分使用AngularJs将数据展示在前端. 2.工程架构 Eureka Server:服务注册中心,端口为8761. Admin Server:用于对微服务系统进行统一的监控和管理. Admin Clinet:客户端集成Admin. 3.构建Admin Server 新建

springcloud+zuul+swagger2之微服务通过网关进行分发

因公司技术架构需要,我从zk+dubbo+springboot开始接触springcloud一系列架构.首先接触到新东西,我内心是希望得到学习的,毕竟技多不压身,更何况用springcloud也不是新技术了[苦瓜脸].此文章主要讲述整个配置关键点,其他细节请找我家彦宏. 进入正题:用zuul网关的目的,就我目前来看是为了让几个服务对外保证一个域名请求,得到请求后网关进行转发到各个服务上.第一步准备两个及以上的微服务,这些都是注册到eureka上的服务名称 1.user-serive user-s

企业分布式SpringCloud+SpringBoot+Mybatis+shiro+微服务 技术分享

介绍 Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热插拔的设计思想,使用成熟领先的无商业限制的主流开源技术构建.采用服务化的组件开发模式,可实现复杂的业务功能.提供驱动式开发模式,整合内置的代码生成器,将JavaEE开发效率提高5倍以上,减少50%的代码开发量,解决80%的重复工作,让开发者更关注业务逻辑.使用Maven进行项目的构建管理,采用Jenkins进行持续集成,主要定位于大型分布式企业系统或大型分

SpringCloud学习系列-Rest微服务构建-整体父工程Project

总体介绍 承接着我们的springmvc+mybatis+mysql初级高级课程,以Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务    Maven的分包分模块架构   一个Project带着多个Module子模块  MicroServiceCloud父工程(Project)下初次带着3个子模块(Module) microservicecloud-api 封装的整体Entity/接口/公共配置等 micr

SpringCloud(八)Consul的微服务注册

将微服务注册到Consul 1 入门案例 提供一个商品微服务 提供一个订单系统 将微服务注册到Consul 依赖 provider  <!--SpringCloud提供的对于Consul的服务发现-->         <dependency>             <groupId>org.springframework.cloud</groupId>             <artifactId>spring-cloud-starter-

微服务架构【SpringBoot+SpringCloud+VUE】一 || 微服务简介

目录 1.什么是微服务 2.Spring Cloud是什么 3.服务注册中心 4.学习交流QQ群[883210148] 1.什么是微服务 在开发项目之前,我们有必要了解一下,什么是微服务?简单来说:微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下,每个任务代表着一个小的业务能力. 2.Spring Cloud是什么 Spring Cloud是一个微服务框架的规