专栏首页波波烤鸭SpringCloud-Hystrix【解决灾难性雪崩-熔断】

SpringCloud-Hystrix【解决灾难性雪崩-熔断】

  本文我们来演示下Hystrix中解决雪崩效应的第四种方式熔断的实现

Hystrix熔断

  熔断其实是在降级的基础上引入了重试的机制。当某个时间内失败的次数达到了多少次就会触发熔断机制,具体的流程如下

案例演示

1.创建项目

  创建一个普通的SpringCloud项目

2.导入依赖

  在基础依赖之外我们只需要导入Hystrix的依赖即可

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

3.配置文件修改

  配置文件中设置名称,端口及eureka注册

4.启动类

  添加对应的注解即可

@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {

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

}

5.业务层修改

  注意@HystrixCommand注解的内容

@Service
public class UserService {

    /**
     * ribbon 负载均衡
     *    LoadBalancerClient 通过服务名称可以获取对应的服务的相关信息 ip port等
     */
    @Autowired
   private LoadBalancerClient loadBalancerClient;

    @HystrixCommand(fallbackMethod = "fallback",
            commandProperties = {
                    //默认 20 个;10s 内请求数大于 20 个时就启动熔断器,当请求符合熔断条件时将触发 getFallback()。
            @HystrixProperty(name= HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,
                    value="10"),
            //请求错误率大于 50%时就熔断,然后 for 循环发起请求,当请求符合熔断条件时将触发 getFallback()。
            @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,
                    value="50"),
            //默认 5 秒;熔断多少秒后去尝试请求
            @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,
                    value="5000"),
            })
    public List<User> getUsers(Integer id){
        System.out.println("--------->"+id);
        if(id == 1){
            throw new RuntimeException();
        }
        // ServiceInstance 封装的有服务的基本信息  IP和端口等
        ServiceInstance si = this.loadBalancerClient.choose("eureka-ribbon-provider");

        StringBuilder sb = new StringBuilder();
        sb.append("http://")
                .append(si.getHost())
                .append(":")
                .append(si.getPort())
                .append("/user");
        System.out.println("服务地址:"+sb.toString());
        // SpringMVC RestTemplate
        RestTemplate rt = new RestTemplate();
        ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {};
        // ResponseEntity:封装了返回值的信息
        ResponseEntity<List<User>> response = rt.exchange(sb.toString(), HttpMethod.GET,null,type);
        List<User> list = response.getBody();
        return list;
    }

    /**
     * 服务降级
     *   返回托底数据的方法
     * @return
     */
    public List<User> fallback(Integer id){
        List<User> list = new ArrayList<>();
        list.add(new User(3,"我是托底数据",22));
        return list;
    }
}

6.启动测试

  启动provider和consumer访问查看

正常访问,可以从provider获取到数据。

异常访问。获取到的是托底数据,而且我们快速访问的话5秒内都返回的托底数据(同一个请求),5秒后会尝试重试连接,这个测试的细心点可以看到这个效果的

7.熔断参数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java外观模式(门面模式Facade)

      外观模式也叫门面模式,是开发过程中使用频率非常高的一种设计模式,但非常容易理解。

    用户4919348
  • Nginx实战操作-动静分离

      本文我们继续来介绍nginx的实际操作,本文来介绍下Nginx的动静分离的实现。

    用户4919348
  • Spring之BeanFactory和FactoryBean接口的区别

      Spring框架中的BeanFactory接口和FactoryBean接口因为名称相似,老是容易搞混淆,而且也是面试过程中经常会碰到的一个问题。所以本...

    用户4919348
  • 用泛型的IEqualityComparer<T>接口去重复项

    写这个源于CSDN一位网友的提问 题目:下列数据放在一个List中,当ID和Name都相同时,去掉重复数据 ID Name 1  张三 1  李三 1  小伟 ...

    Porschev
  • 【C#】Entity Framework 增删改查和事务操作

      方法二:方法一中每次都需要对所有字段进行修改,效率低,而且麻烦,下面介绍修改部分字段

    跟着阿笨一起玩NET
  • spring BeanFactory

    spring 的BeanFactory包含了最基本的bean操作,像通过bean name 来获取bean,判断bean是否存在等等。这些可以...

    Dylan Liu
  • 深夜惊闻,腾讯机构为什么突然大重组?

    一早醒来,朋友圈一条重磅新闻跳出来。腾讯宣布内部架构调整,新成立云与智慧产业事业群,平台与内容事业群,原来的微信事业群,互动娱乐事业群,技术工程事业群和企业发展...

    用户1564362
  • 壹周鹅厂 | 腾讯资讯大放送

    听说 查小号、消费限额...... 腾讯成长守护平台又双叒升级啦! 针对微信的功能 有小伙伴real问号 为什么消息撤回只有两分钟? 微信转账,为什么还需要对方...

    腾讯高校合作
  • Java网络02 Servlet开胃酒

    在Tomcat初次尝试中,我们搭建了用于测试Servlet和JSP的基本环境。我们现在要转向网络应用的具体开发。 厨师 Web服务器的基本工作方式是请求-处理-...

    Vamei
  • 两万字解密:腾讯为何把产业互联网交给他

    那天中午,他和马化腾一块儿吃了顿工作餐。他的目的很简单,说服Pony,争取把QQ留在自己手里,与云合力。他不想失去这张倾注6年心血的王牌。

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券