前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud-Hystrix【解决灾难性雪崩-熔断】

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

作者头像
用户4919348
发布2019-06-13 20:46:43
1.6K0
发布2019-06-13 20:46:43
举报
文章被收录于专栏:波波烤鸭波波烤鸭

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

Hystrix熔断

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

在这里插入图片描述
在这里插入图片描述

案例演示

1.创建项目

  创建一个普通的SpringCloud项目

在这里插入图片描述
在这里插入图片描述

2.导入依赖

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

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.3.2.RELEASE</version>
</dependency>

3.配置文件修改

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

在这里插入图片描述
在这里插入图片描述

4.启动类

  添加对应的注解即可

代码语言:javascript
复制
@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {

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

}

5.业务层修改

  注意@HystrixCommand注解的内容

代码语言:javascript
复制
@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.熔断参数

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hystrix熔断
  • 案例演示
    • 1.创建项目
      • 2.导入依赖
        • 3.配置文件修改
          • 4.启动类
            • 5.业务层修改
              • 6.启动测试
                • 7.熔断参数
                相关产品与服务
                负载均衡
                负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档