zoukankan      html  css  js  c++  java
  • 转载:springcloud 第五章 熔断器 ( HYSTRIX)

    转载自:https://www.cnblogs.com/haly/p/10905469.html

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用。springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使用feign)。有时为了提高系统的健壮性,某些访问量大的服务模块还会做集群部署。但是服务之间的调用不可能百分之百成功的,如果出现超时、异常会导致服务无法提供功能。这时如果有大量请求访问异常服务,就会造成系统资源耗尽,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。在实际工作中,复杂的系统往往有成百上千个服务模块,某个功能模块出现异常,不能影响其它功能的正常运行,所以熔断器Hystrix就派上用场了。

    一、Hystrix简介:

    Hystrix由Netfilix API团队研发于2011年,2012年开始在Hystrix公司内部推广和使用,Hystrix在Netflix中久经沙场,现在已经是一个非常成熟的系统,而最近流行的微服务架构和Spring Cloud,让Hystrix成为了配套的基础设施,在国内也逐渐流行起来。

    hystrix的出现即为解决服务雪崩效应,它通过四个方面的机制来解决这个问题

    1. 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

    2. 降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

    3. 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

    4. 缓存:提供了请求缓存、请求合并实现。

    如果想要了解更多的Hystrix的底层及实现原理,可以参考相关文章学习,本系列主要讲解如何快速在工作中使用Hystrix。

    二、环境准备:

    最终目录结构:

     

    本系列文章,都是层层递进的,本章内容在前面搭建好的项目框架上进行开发讲解,对搭建springcloud的多模块子项目框架不清楚的同学可以参考一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目 

    工作中,我们基本上都是使用feign进行服务调用的,所以本章只讲解Feign中使用断路器,对上一章feign工程搭建有兴趣的可以参考:一起来学Spring Cloud | 第四章:服务消费者 ( Feign )

    三、Feign中使用断路器:

    1. 在上章的springcloud-feign-client工程的application.properties配置文件中,加入配置:feign.hystrix.enabled=true

    1
    2
    3
    4
    server.port=9600
    spring.application.name=springcloud-feign-client
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    feign.hystrix.enabled=true

    2. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类的实现类,命名为:HystrixFeignRemoteCallBack,做为出现接口异常时的回调方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.haly.romote.hystrix;
     
    import org.springframework.stereotype.Component;
     
    import com.haly.romote.FeignRemoteService;
     
    @Component
    public class HystrixFeignRemoteCallBack implements FeignRemoteService{
     
        @Override
        public String hello(String name) {
            // TODO Auto-generated method stub
            return name + ",Due error,enter Hystrix";
        }
     
    }

    3. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类中加入回调实现类的注解配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.haly.romote;
     
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
     
    import com.haly.romote.hystrix.HystrixFeignRemoteCallBack;
     
    @FeignClient(value = "springcloud-eureka-client",fallback = HystrixFeignRemoteCallBack.class)
    public interface FeignRemoteService {
     
        @RequestMapping(value = "/hello",method = RequestMethod.GET)
        public String hello(@RequestParam(value = "name") String name);
         
    }

    4. 运行项目

    ① 先启动springcloud-eureka-server模块,开启eureka注册中心

    ② 启动springcloud-eureka-client模块,开启提供远程服务功能,并且提供接口能力 /hello

    ③ 启动springcloud-feign-client模块,开启消费模块,用来调用springcloud-eureka-client模块中的/hello接口

    Eureka上的注册信息,如下图:

    打开浏览器,输入网址:http://localhost:9600/getHello?name=young码农,运行结果如下:

    我们模仿生产环境,服务提供者宕机(或者返回超时),这里我们手动停掉springcloud-eureka-client服务

    输入网址:http://localhost:9600/getHello?name=young码农

    本章我们只是在回调接口中,返回一个字符串,工作中,有些场景会做一些业务逻辑处理(比如调用短信发送接口,出现异常会在记录一条异常日志,后面来处理这些异常)。

    工作中我们会遇到很多特殊场景,特别在访问量过大,业务较复杂的时候,会出现一些奇奇怪怪的问题,所以Feign,Hystrix有许多配置项可以使用,我们可以根据相应业务配进行合理配置

  • 相关阅读:
    165. Compare Version Numbers
    164. Maximum Gap
    3、桶排序
    162. Find Peak Element
    160. Intersection of Two Linked Lists
    155. Min Stack
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    Linux/Unix系统编程手册 第二章:基本概念
    Linux/Unix系统编程手册 第一章:历史和标准
  • 原文地址:https://www.cnblogs.com/t96fxi/p/13759176.html
Copyright © 2011-2022 走看看