Hystrix熔断

为了避免微服务中因为启动某一个服务宕机,而导致“雪崩”,使整个应用阻塞;

熔断器Hystrix使用了线程隔离和服务降级的方式,提高整体应用的容错能力。

我使用的SpringCloud版本是Hoxton.SR3

线程隔离:Hystrix使用自己的线程池,和主应用服务器线程隔离开来。每个服务都使用独立的线程池。

服务降级:优先保证核心服务可用,非核心服务不可用或若可用。

     当某个服务的线程池已满或者响应时间过长,就会响应一个友好提示,而不是无限阻塞或者直接报错。

     Hystrix实现了弹性容错,当情况好转之后可以自动重连。

服务消费方:

Eureka-client包已经依赖导入了Hystrix,可以直接使用,无需再导包才怪咧

第一步:导包

 

 上面那个是Eureka-client包中的,不一样。必须导入以下依赖才可以使用@HystrixCommand注解

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

第二步:启动类加注解

  

package com.company;

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.SpringCloudApplication;import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.ribbon.RibbonClient;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;

//@EnableDiscoveryClient //启用Eureka客户端//@SpringBootApplication//@EnableCircuitBreaker //启用Hystrix熔断功能@SpringCloudApplication //替代以上三个注解public class ConsumerApplication {

    public static void main(String[] args) {        SpringApplication.run(ConsumerApplication.class);    }

    @Bean    @LoadBalanced    public RestTemplate restTemplate(){        return new RestTemplate();    }}

第三步:

@GetMapping("/{id}")@HystrixCommand(defaultFallback = "getUserByIdFallBack")public String getUserById(@PathVariable("id")Long id){    String url="http://user-service/user/"+id;    long start=System.currentTimeMillis();    String user = template.getForObject(url, String.class);    long end=System.currentTimeMillis();    log.debug("调用时长:{}",end-start);    return user;}

public String getUserByIdFallBack(Long id){    return "很抱歉,服务器正忙,请稍后再试。";}尽管方法的参数和返回值都一致,还是报了fallback method wasn‘t found: getUserByIdFallBack([])错误,求大佬指教一下。

使用配置当前类降级函数,配置成功

package com.company.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;

@RestController@RequestMapping("/consumer")@Slf4j@DefaultProperties(defaultFallback = "getUserByIdFallBack")//指定默认降级函数public class ConsumerController {

    @Autowired    private RestTemplate template;

    @GetMapping("/{id}")    @HystrixCommand //启用熔断降级    public String getUserById(@PathVariable("id")Long id){        String url="http://user-service/user/"+id;        long start=System.currentTimeMillis();        String user = template.getForObject(url, String.class);        long end=System.currentTimeMillis();        log.debug("调用时长:{}",end-start);        return user;    }

  //注意此时的返回值没有限制,不能写参数,因为这是当前类通用的降级方法    public String getUserByIdFallBack(){        return "很抱歉,服务器正忙,请稍后再试。";    }

}

默认调用超时时间为1秒,超过一秒就会触发熔断

服务提供方:

  添加休眠模仿超时

package com.company.service.impl;

import com.company.mapper.UserMapper;import com.company.pojo.User;import com.company.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;

import java.util.Random;import java.util.concurrent.TimeUnit;

@Service("userService")public class UserServiceImpl implements UserService{    @Autowired    private UserMapper userMapper;    @Override    public User findOne(Long id) {        try {            TimeUnit.MILLISECONDS.sleep(new Random().nextInt(2000));        } catch (InterruptedException e) {            e.printStackTrace();        }        return userMapper.selectByPrimaryKey(id);    }

    @Override    @Transactional    public void insert(User user) {        user.setUserName("test5");        user.setPassword("test5");        user.setName("ceshi5");        userMapper.insert(user);//        int i=10/0;    }}

测试结果,调用时长超过1秒的都触发了,低于1秒的都响应成功。

  

  

原文地址:https://www.cnblogs.com/zou-rong/p/12589390.html

时间: 2024-10-07 10:39:39

Hystrix熔断的相关文章

SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示,而这个时候如果不想出现这样的错误信息,而希望替换为一个错误时的内容. 一个服务挂了后续的服务跟着不能用了,这就是雪崩效应 对于熔断技术的实现需要考虑以下几种情况: · 出现错误之后可以 fallback 错误的处理信息: · 如果要结合 Feign

spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 eureka-server eureka-client 1 Ribbon工程搭建 1.1 创建spring boot工程:eureka-ribbon 1.2 pom.xml所需要依赖的jar包 <dependency> <groupId>org.springframework.clo

hystrix熔断器之相关配置

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff } p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } span.s1 { color: #3933ff } hystrix.command.[commandkey].circuitBreaker.forceOpen 强制开启熔断. p.p1 { margin: 0.0px

hystrix熔断器之熔断实现

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" } span.s1 { } Hystrix命令(HystrixCommand)封装用户请求方法,对用户调用进行隔离.HystrixCommand在执行用户请求时,会首先HystrixCircuitBreaker进行熔断判断, 如果请求已经被熔断了,直接返回定义的错误信息,如果没有被熔断,调用请求.在执行的各个过程,记录调用的超时和异常,HystrixC

Hystrix 熔断机制原理

相关配置 circuitBreaker.enabled 是否开启熔断 circuitBreaker.requestVolumeThreshold 熔断最低触发请求数阈值 circuitBreaker.sleepWindowInMilliseconds 产生熔断后恢复窗口 circuitBreaker.errorThresholdPercentage 错误率阈值 circuitBreaker.forceOpen 强制打开熔断 circuitBreaker.forceClosed 强制关闭熔断 状态

Hystrix 熔断

熔断机制概述 熔断机制是应对雪崩效应额一种微服务链路保护机制.当扇出链路的某个微服务出错不可用或者响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息. 当检测到该节点微服务调用响应正常后,恢复调用链路. 在Spring Cloud框架里,熔断机制通过Hystrix实现.Hystrix会监控微服务间调用的情况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制,熔断机制的注释是 @HystrixCommand @HystrixCommand(fal

hystrix熔断器之使用入门

用户将命令通过Hytrix调用(通过继承HystrixCommand),通过Hystrix实现对调用异常的控制,以此来隔离被调用方对调用方的影响. 如果某程序或class要使用Hystrix,只需简单继承HystrixCommand/HystrixObservableCommand并重写run()/construct(),然后调用程序实例化此class并执行execute()/queue()/observe()/toObservable() // HelloWorldHystrixCommand

hystrix熔断器之HystrixCommandExecutionHook

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } hystrix在执行命令的各个节点会调用HystrixCommandExecutionHook,通过实现HystrixCommandExecutionHook可以在各个节点执行自己想要执行的代码. 主要可实现的方法有: onStart命令开始执行前会被调用.

hystrix熔断器之metrics

Hystrix的Metrics中保存了当前服务的健康状况, 包括服务调用总次数和服务调用失败次数等. 根据Metrics的计数, 熔断器从而能计算出当前服务的调用失败率, 用来和设定的阈值比较从而决定熔断器的状态切换逻辑. 因此Metrics的实现非常重要. HystrixRollingNumber统计一定时间内的统计数值,基本思想就是分段统计,比如说要统计qps,即1秒内的请求总数.如下图所示,我们可以将1s的时间分成10段,每段100ms.在第一个100ms内,写入第一个段中进行计数,在第二