SpringCloud微服务熔断器使用详解

目录
  • 一、简介
  • 二、作用
  • 三、核心概念
    • 3.1 熔断目的
    • 3.2 降级目的
  • 四、实例
    • 4.1 基于Hystrix
      • 4.1.1 熔断触发降级
      • 4.1.2 超时触发降级
      • 4.1.3 资源隔离触发降级
    • 4.2 基于OpenFeign pom.xml

一、简介

当微服务中的某个子服务,发生异常服务器宕机,其他服务在进行时不能正常访问而一直占用资源导致正常的服务也发生资源不能释放而崩溃,这时为了不造成整个微服务群瘫痪,进行的保护机制 就叫做熔断,是一种降级策略

熔断的目的:保护微服务集群

二、作用

  • 对第三方访问的延迟和故障进行保护和控制
  • 防止复杂分布式系统中的雪崩效应(级联故障)
  • 快速失败,快速恢复
  • 回退,尽可能优雅的降级
  • 启用近实时监控、报警和操作控制

三、核心概念

3.1 熔断目的

应对雪崩效应,快速失败,快速恢复

3.2 降级目的

保证整体系统的高可用性

四、实例

4.1 基于Hystrix

pom.xml

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

application

@EnableHystrix // 开启熔断
@SpringBootApplication
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

4.1.1 熔断触发降级

@RestController
@RequestMapping("/hystrix")
public class HystrixController {
    @Autowired
    private RestTemplate restTemplate;
    /**
     * @param num 参数
     * @return 字符串
     */
    @HystrixCommand(
            commandProperties = {
                    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),  // 默认20, 最小产生5次请求
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"), // 熔断时间, 该时间内快速失败
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), // 10s内失败率达到50%触发熔断
            }, // 10s 内最少 5 个请求, 如果失败率大于 50% 则触发熔断
            fallbackMethod = "fallback"
    )  // 服务调用失败时,触发熔断进行降级
    @GetMapping("/test")
    public String test(@RequestParam Integer num) {
        if (num % 2 == 0) {
            return "访问正常";
        }
        List<?> list = restTemplate.getForObject("http://localhost:7070/product/list", List.class);
        assert list != null;
        return list.toString();
    }
    /**
     * 熔断时触发降级
     *
     * @param num 参数
     * @return 字符串
     */
    private String fallback(Integer num) {
        // 降级操作
        return "系统繁忙";
    }
}

4.1.2 超时触发降级

@RestController
@RequestMapping("/hystrix")
public class HystrixController {
    @Autowired
    private RestTemplate restTemplate;
    @HystrixCommand(
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "500")
            },
            fallbackMethod = "timeout"
    )
    @GetMapping("/timeout")
    public String timeoutTest(){
        return restTemplate.getForObject("http://localhost:7070/product/list", String.class);
    }
    /**
     * 超时时触发降级
     *
     * @return 字符串
     */
    private String timeout() {
        // 降级操作
        return "请求超时";
    }
}

4.1.3 资源隔离触发降级

平台隔离、业务隔离、部署隔离

线程池隔离、信号量隔离

4.2 基于OpenFeign pom.xml

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

application

@SpringBootApplication
@ComponentScan(basePackages = {
        "com.study.provider.service",  // feign 包目录
        "com.study.hystrix"  // 当前模块启动目录
})
@EnableFeignClients(basePackages = "com.study.provider.service")  // feign 目录
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

HystrixFeignController

@RestController
@RequestMapping("/hystrixFeign")
public class HystrixFeignController {
    @Qualifier("com.study.provider.service.ProductionService")
    @Autowired
    ProductionService productService;  // feign Client
    @GetMapping("test")
    public String test(){
        return productService.getProduction(1).toString();   // 远程调用
    }
}

feign Client

@FeignClient(value = "provider", fallback = ProductionFallback.class)   // fallback 用于熔断
public interface ProductionService {
    @RequestMapping("/product/getProduction")
    Object getProduction(@RequestParam Integer id);
}

ProductionFallback

@Component
public class ProductionFallback implements ProductionService {
    @Override
    public Object getProduction(Integer id) {
        return "请求失败";
    }
    @Override
    public Map createProduction(Object production) {
        return new HashMap<>();
    }
    @Override
    public Object selectByProduct(Object product) {
        return "请求失败";
    }
}

到此这篇关于SpringCloud微服务熔断器使用详解的文章就介绍到这了,更多相关SpringCloud熔断器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud微服务熔断器Hystrix使用详解

    目录 什么是Hystrix Hystrix实战 总结 什么是Hystrix 在日常生活用电中,如果我们的电路中正确地安置了保险丝,那么在电压异常升高时,保险丝就会熔断以便切断电流,从而起到保护电路安全运行的作用. 在货船中,为了防止漏水和火灾的扩散,一般会将货仓进行分割,避免了一个货仓出事导致整艘船沉没的悲剧,这就是舱壁保护机制. Hystrix提供的熔断器也类似,在调用某个服务提供者时,当一定时间内请求总数超过配置的阈值,且窗口期内错误率过高,那Hystrix就会对调用请求熔断,后续的请求直接

  • SpringCloud微服务开发基于RocketMQ实现分布式事务管理详解

    目录 消息队列实现分布式事务原理 RocketMQ的事务消息 代码实现 基础配置 发送半消息 执行本地事务与回查 Account-Service消费消息 测试 小结 消息队列实现分布式事务原理 首先让我们来看一下基于消息队列实现分布式事务的原理方案. 柔性事务 发送消息的服务有个OUTBOX数据表,在进行INSERT.UPDATE.DELETE 业务操作时也会给OUTBOX数据表INSERT一条消息记录,这样可以保证原子性,因为这是基于本地的ACID事务. OUTBOX表充当临时消息队列,然后我

  • SpringCloud超详细讲解微服务网关Zuul基础

    目录 一.Zuul的简介 1.Zuul是怎么工作的 2.Zuul能干嘛 二.Zuul的使用 1.配置Pom.xml 2.配置Application.yml 3.撰写启动类 4.效果图 三.学会SpringCloud的感触 一.Zuul的简介 1.Zuul是怎么工作的 Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础.Zu

  • SpringCloud微服务剔除下线功能实现原理分析

    目录 一.前言 二.微服务剔除下线源码解析 1.EurekaBootStrap#contextInitialized() 1.1.初始化注册中心上下文 1.2.openForTraffic()逻辑 1.3.postInit()执行任务 1.4.剔除任务 2.服务剔除下线 2.1.AbstractInstanceRegistry#evict()逻辑 2.1.判断是否过期 2.2.从本地列表异常下线处理 一.前言 上一篇SpringCloud微服务续约源码解析已经分析了心跳机制是什么.底层实现.客户

  • SpringCloud 分布式微服务架构操作步骤

    目录 前言 SpringCloud微服务 单体架构和微服务分布式架构 单体架构分析 微服务分布式架构分析 服务拆分和远程调用 服务拆分 案例需求准备 远程调用初步 Eureka注册中心 服务注册与负载均衡 服务注册 Ribbon负载均衡 指定负载均衡规则 Nocas 注册中心 环境配置启动服务注册 Nacos 分级存储模型与集群 负载均衡 namespace 环境隔离 统一配置管理与热更新 前言 这篇笔记文章我还是没有接上之前的java,因为我中间偷懒了,写不动了.打算先把这篇安排下,然后再把之

  • SpringCloud超详细讲解微服务网关Zuul

    目录 网关的作用 Spring Cloud 网关组件Zuul介绍 Zuul网关实战 1.创建服务 2.创建配置文件 3.创建Zuul过滤器 4.编写启动类 5.启动验证 总结 网关的作用 微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来.如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户.权限不能统一处理等.另外基于高内聚低耦合的设计准则来讲,我们也应该将内部系统和外部系统做切割. 因此,这时就需要有一个独立的组件来处理外部的请求

  • SpringCloud超详细讲解微服务网关Gateway

    目录 前言 微服务网关GateWay介绍 GateWay特性介绍 Gateway 中的相关术语 Gateway实战 1.创建项目gateway 2.创建启动类 3.新增配置文件 4.编程方式实现路由 5.启动验证 总结 前言 上一篇:微服务网关Zuul 上文中,我们介绍了微服务网关Zuul,Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件,但是随着 Netflix 公司一系列的停更事件,在最新的 S

  • SpringCloud微服务续约实现源码分析详解

    目录 一.前言 二.客户端续约 1.入口 构造初始化 initScheduledTasks()调度执行心跳任务 2.TimedSupervisorTask组件 构造初始化 TimedSupervisorTask#run()任务逻辑 3.心跳任务 HeartbeatThread私有内部类 发送心跳 4.发送心跳到注册中心 构建请求数据发送心跳 三.服务端处理客户端续约 1.InstanceRegistry#renew()逻辑 2.PeerAwareInstanceRegistryImpl#rene

  • SpringCloud微服务熔断器使用详解

    目录 一.简介 二.作用 三.核心概念 3.1 熔断目的 3.2 降级目的 四.实例 4.1 基于Hystrix 4.1.1 熔断触发降级 4.1.2 超时触发降级 4.1.3 资源隔离触发降级 4.2 基于OpenFeign pom.xml 一.简介 当微服务中的某个子服务,发生异常服务器宕机,其他服务在进行时不能正常访问而一直占用资源导致正常的服务也发生资源不能释放而崩溃,这时为了不造成整个微服务群瘫痪,进行的保护机制 就叫做熔断,是一种降级策略 熔断的目的:保护微服务集群 二.作用 对第三

  • 浅试仿 mapstruct实现微服务编排框架详解

    目录 微服务编排框架 开发背景 接口的方式 通过注解的方式 书写代码方式的选择 方案选择 feign MapStruct 方案总结 Feign @FeignClient MapStruct 微服务编排框架 起始原因 是 我们公司 分布式事务 使用的是 seate 分布式事务框架,现在只在一些小部分使用,因为考虑到seate 对性能 TCP的影响,对事务这块没有更多的选择.我就在想 是不是做一个 微服务 编排框架 来解决这个问题.这里就 开发背景 因为我们是saas 可能A企业要这个功能,B企业不

  • springcloud微服务之Eureka配置详解

    Eureka注册中心/服务发现框架 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能. Eureka包含两个组件:Eureka Server和Eureka Client. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Serve

  • 详解SpringCloud微服务之Rest

    目录 一.什么是RestTemplate? 二.四种请求方式 2.1 GET请求 2.2 POST请求 2.3 PUT请求 2.4 DELETE请求 一.什么是RestTemplate? RestTemplate 是一个HTTP客户端,在Spring Cloud的服务调用方使用它我们可以方便的调用HTTP接口,支持GET.POST.PUT.DELETE等方法. 二.四种请求方式 首先注入Bean对象 @Configuration public class MyConfig { @Bean pub

  • SpringCloud微服务应用config配置中心详解

    目录 前言 一.传统应用配置痛点 二.Config 配置中心介绍 三.服务端Config Server搭建 1.pom依赖 2.application启动类配置 3.application.yml配置 4.test-dev.xml(客户端应读取的配置) 5.项目结构 四.客户端Config Client搭建 1.pom依赖 2.application启动类配置 3.bootstrap.yml配置 4.application.yml配置 5.测试controller 6.项目结构 五.动态刷新 六

  • Spring boot admin 服务监控利器详解

    目录 一.简介 二.搭建 1.服务端 2.客户端 3.启动项目 4.客户端配置 3.微服务 3.1.服务端 3.2.客户端 4.我的微服务预警发送其他服务状态信息思路 一.简介 用于对 Spring Boot 应用的管理和监控.可以用来监控服务是否健康.是否在线.以及一些jvm数据等等.Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用 http 通讯方式实现数据交

  • SpringCloud Feign远程调用实现详解

    目录 1. Feign远程调用 1.1.Feign替代RestTemplate 1.2.自定义配置 1.2.1.配置文件方式 1.2.2.Java代码方式 2.Feign使用优化 3. 最佳实践 3.1.继承方式 3.2.抽取方式 3.3.实现基于抽取的最佳实践 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 1. Feign远程调用 Feign是一个声明式的http客户端,官方地址:https://gith

随机推荐