SpringCloud中Hystrix容错保护的简单介绍(二)

1.Hystrix简介

Hystrix[(https://github.com/Netflix/Hystrix)]是Netflix[(https://www.netflix.com/global)]的一个开源项目,主要作用是通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是需要做的事情。Hystrix提供了断路器的熔断与恢复、服务线程和信号隔离、服务降级Fallback、请求缓存cache、请求合并、服务监控等强大功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
Hystrix基本工作组件:

  • 断路器 : Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
  • 依赖隔离 : 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
  • 服务降级 : 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法. 若服务执行失败,则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

工作原理

  • 服务降级
    应用场景:consumer无法获取provider提供的服务而由consumer自备二级服务的解决方案。
    解决思路:由consumer提供备用服务来及时响应。

  • 依赖隔离
    应用场景:provider提供的微服务不健康不可用的情况,包括服务请求处理响应严重超时、服务离线宕机等provider拒绝服务场景。
    解决思路:给每个服务设置固定最大量的线程量或信号量,当某个服务负载压力超过最大线程量或信号量时直接拒绝服务,执行降级服务,此时这个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的服务。

  • 熔断保护
    应用场景:服务提供者provider提供的服务健康可用,服务消费者consumer的服务降级并未 触发,依赖隔离也并未拒绝,但是provider却有部分时间延迟。在该延迟时间段内亦可能会引起上游请求连锁堆积引起雪崩效应。
    解决思路:设定时长metrics.rollingStats.timeInMilliseconds(默认为 十秒)时间窗口内,对一个特定服务的请求数大于“circuitBreaker.requestVolumeThreshold”(默认为20个),并且故障率大于“circuitBreaker.errorThresholdPercentage”(默认大于百分之五十)的时候,启用熔 断机制以使请求失效。在熔断和报错的情况下,开发者可以启用回退机制执行降级服务。

1.RestTemplate集成Hystrix

实现步骤
1>拷贝springcloud-consumer-resttemplate项目,保持项目代码不变,只修改项目名为springcloud-consumer-resttemplate-hystrix
2>在pom.xml文件中添加Hystrix依赖 spring-cloud-starter-hystrix
3> 修改 com.ysd.springcloud.service.ConsumerService 添加降级服务
4>在项目入口函数上添加 @EnableHystrix
5>启动项目,访问注册中心http://localhost:8001/getProviderFuture可以观察到服务provider不可用时,实现了服务降级

  1. 添加Hystrix依赖
<!-- SpringCloud Hystrix 微服务容错监控组件:断路器,依赖隔离,服务降级,服务监控 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  1. 添加降级服务
package com.ysd.springcloud.service;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Service
public class ConsumerService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod="getProviderFutureFallback")
public List<String> getProviderFuture() {
return restTemplate.getForObject("http://service-provider/getFuture", List.class);
}
public List<String> getProviderFutureFallback(){
return Arrays.asList("Provider服务调用失败","我是Consumer服务降级");
}
}
  1. 修改入口函数
package com.ysd.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  1. 简化注解 @SpringCloudApplication

对于项目 springcloud-consumer-resttemplate-hystrix 入口函数的注解,我们来深入分析:

  • 查看注解 @EnableEurekaClient
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableDiscoveryClient//:启用注册中心客户端的服务订阅消费功能
public @interface EnableEurekaClient {}
  • 查看注解 @EnableHystrix
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableCircuitBreaker//启用断路器容错保护功能
public @interface EnableHystrix {}
  • 查看注解 @SpringCloudApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
  • 简化后的入口函数
package com.ysd.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
//@EnableHystrix
//@EnableEurekaClient
//@SpringBootApplication
//----------- 以上三个注解可以合并为一个注解-------------
@SpringCloudApplication//启用SpringBoot项目、启用注册中心客户端的服务订阅消费功能、启用断路器、依赖隔离、服务降级等容错保护功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

3.Feign集成Hystrix

实现步骤

  • 添加依赖
<!-- SpringCloud Hystrix 微服务容错监控组件:断路器,依赖隔离,服务降级,服务监控 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  • 编写一个@FeignClient注解的com.ysd.springcloud.service.ConsumerService接口实现类
package com.ysd.springcloud.fallback;
import java.util.Arrays;
import java.util.List;
import org.springframework.stereotype.Service;
import com.ysd.springcloud.service.ConsumerService;
@Service
public class ConsumerServiceImpl implements ConsumerService {
@Override
public List<String> getProviderFuture() {
return Arrays.asList("Provider服务调用失败","我是Consumer服务降级");
}
}
  • 修改接口中的注解@FeignClientfallback属性指向实现类
package com.ysd.springcloud.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ysd.springcloud.fallback.ConsumerServiceImpl;
@FeignClient(value="service-provider",fallback=ConsumerServiceImpl.class)//@FeignClient(value="service-provider",fallback=ConsumerServiceImpl.class) 含义为 当远程服务 serviceprovider不可用时使用ConsumerServiceImpl实现类中的getProviderFuture实现方法
public interface ConsumerService {
@RequestMapping("/getFuture")
public List<String> getProviderFuture();
}
  • 在配置文件 application.yml 添加启用Feign中hystrix服务降级
#启用Feign中hystrix服务降级
feign:
hystrix:
enabled: true
  • 修改项目 springcloud-consumer-feign-hystrix 入口函数注解
package com.ysd.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@EnableFeignClients
@SpringCloudApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

总结:

本章和我所写的SpringCloud基本原理(一)连在一起,如果没有看懂可以先去看上一篇的介绍[SpringCloud基本原理(一)](https://blog.csdn.net/qq_38845362/article/details/84554994)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值