(springCloud-6 Hystrix断路器 与 服务降级)

一,Hystrix熔断器:

在微服务中,经常存在很多服务的相互调用,而且有的服务调用链路还比较长,如果当某个最基础的服务,发生故障,那么服务调用方就会长时间等待或抛出错误给发起请求的服务,这么一来,调用链路上的很多服务都处于等待中或抛出错误,那么就可通过熔断器来给后面的服务一个最基本的初始数据,以至于不用长时间等待或看到对底层的错误,以避免雪崩效应(还有其他的熔断限流工具如阿里的sentinel);

正常情况:                              A→B→C→D

D服务出现了问题:                           A→B→C×D

从而导致C服务无法获取正确的响应,出现对应的问题:           A→B×C×D

最后导致B服务,甚至A服务都同样出现问题,由服务不可用变为应用不可用: A×B×C×D

1,hystrix的基本配置和应用;
第一步:引入依赖

 <!--熔断器Hystrix-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
			<version>2.0.0.RELEASE</version>
		</dependency>

第二部:编写代码

	@PostMapping("/hystrix")
    @HystrixCommand(fallbackMethod = "hystrix")
    public String hystrixTest(@RequestParam("id") String id){
        logger.info("start-hystrixTest:"+id);
        //通过feign来调用其他服务
        String res = hystrixTestService.hystrixTest(id);
        logger.info("end-hystrixTest");
        return res;
    }
    /**
     * 服务熔断备用方法
     * @return
     */
    public  String hystrix(String id){
        return "Error_@HystrixCommand_"+id;
    }

如果这里**hystrixTestService.hystrixTest(id);**这段代码出错,如网络不通,就是执行自定义的备用方法hystrix返回出去;

第三步:主启动类添加@EnableCircuitBreaker注解 开启熔断

@SpringBootApplication
@EnableEurekaClient
/**
 * 开启Feign调用接口的方式
 */
@EnableFeignClients(basePackages = {"com.zt.frank.consumerservice.service"})
/**
 * hystrix服务熔断开启
 */
@EnableCircuitBreaker
//@ComponentScan("com.zt.frank.consumerservice.service")
public class ZtFrankConsumerFeignServiceApplication8002 {
	
	private static Logger logger = Logger.getLogger(ZtFrankConsumerFeignServiceApplication8002.class);

	public static void main(String[] args) {	
		SpringApplication.run(ZtFrankConsumerFeignServiceApplication8002.class, args);
		logger.info("*********ZtFrankConsumerFeignServiceApplication8002启动成功*********");
	}

}

第五步:测试,启动服务调用和被调用的服务
在这里插入图片描述
将被调用的服务关闭
在这里插入图片描述
到这里就是熔断的基本用法了;

二,服务降级:

场景:如双十一这样高并发的场景下,为了保证核心业务正常的运转,而对一些非核心的业务进行限流,暂时关闭的操作,让出服务器的资源给高访问量的服务来保证核心业务的正常运行,当高访问量的时间过了在开启,非紧急,非核心的业务;

上述基本熔断的实现:
spring强调业务逻辑,处理异常信息,要分离,上面的方法会发生方法膨胀,耦合太严重,最终业务主逻辑和熔断的处理方式,在接口绑定,实现与主逻辑解耦

实现:服务调用方:zt-frank-consumer-feign-service-8002
被调用方: zt-frank-config-service-hystrix-7003

第一步:优化熔断 (调用方:zt-frank-consumer-feign-service-8002)

1,熔断备用方法抽出

@Component
public class HystrixTestClientServiceConfig implements FallbackFactory<HystrixTestService> { //HystrixTestService是feign调用其它服务的接口

	@Override
	public HystrixTestService create(Throwable arg0) {
		return new HystrixTestService(){

			@Override
			public String hystrixTest(String req) {
				return "Error_@HystrixCommand_服务调用异常";
			}
			
		};
	}
}

2,此时调用方法就可以 去除@HystrixCommand注解因为feign注解上配置了工厂备用方法 步骤1

    @PostMapping("/hystrix")
 //   @HystrixCommand(fallbackMethod = "hystrix")   去除@HystrixCommand因为feign注解上配置了工厂备用方法 步骤1
    public String hystrixTest(@RequestParam("id") String id){
        logger.info("start-hystrixTest:"+id+"time:"+LocalTime.now());
        //通过feign来调用其他服务
        String res = hystrixTestService.hystrixTest(id);
        logger.info("end-hystrixTest:"+LocalTime.now());
        return res;
    }

3,调用7003服务feign注解的修改。加上fallbackFactory

//@FeignClient(value = "ZT-FRANK-CONFIG-SERVICE",fallbackFactory = HystrixTestClientServiceConfig.class)
/**
 * ip调用方式
 */
@FeignClient(name = "zt-frank-config-service",url = "http://localhost:7003",fallbackFactory = HystrixTestClientServiceConfig.class)
//@FeignClient(value = "zt-frank-config-service",url = "http://localhost:7003",fallbackFactory = HystrixTestClientServiceConfig.class)
public interface HystrixTestService {
    @RequestMapping(value = "/config/hystrix",method = RequestMethod.POST)
    String hystrixTest(@RequestParam("id") String req);
}

4,yml文件配置

feign:  #开启服务熔断服务降级
  hystrix:
    enabled: true
hystrix:   
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000 #接口调用超时时间6秒 超时将调用Fallback方法      circuitBreaker:
        requestVolumeThreshold: 3  #10秒内出现3个以上请求(已临近阀值),并且出错率在50%以上,开启断路器.断开服务,调用Fallback方法

5,启动类加上@EnableCircuitBreaker注解开启熔断

第二步:被调用(zt-frank-config-service-hystrix-7003)方代码编写

这里8002服务调用下面的方法如果传入指定的值将线程将阻塞30秒,8003 hystrix配置的接口超时时间就会调用备用方法

@PostMapping("/hystrix")
@ResponseBody
public String hystrixTest(@RequestParam("id") String id){
    logger.info("进入熔断测试方法"+id);
    /**
     * hystrix测试
     */
    if(id.equals("0")){
        logger.info("hystrix测试 线程休眠30秒-start"+ LocalTime.now());
        try {
            Thread.sleep(30*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("hystrix测试 线程休眠30秒-end"+ LocalTime.now());
    }
    return "SUCCESS_UP7003";
}

第三部:测试

传入id=0 7003将休眠30秒,8003配置的hystrix超时时间6秒将超时
在这里插入图片描述

在这里插入图片描述
id=1 系统将返回正常值
在这里插入图片描述
id=1 将7003服务停掉
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值