SpringCloud篇- Hystrix容错保护

Hystrix容错保护
Hystrix是Netflix的一个开源项目,主要作用是通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 其可以看做是Netflix团队对分布式系统运维的各种理念和实践的总结。
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了断路器的熔断与恢复、服务线程和信号隔离、服务降级Fallback、请求缓存cache、请求合并、服务监控等强大功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
1.断路器 : Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
2.依赖隔离 : 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
3.服务降级 : 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
(1)RestTemplate实现服务降级
1>创建springcloud-consumer-resttemplate项目,保持项目代码不变,
只修改项目名称为springcloud-consumer-resttemplate-hystrix
2>在pom.xml文件中添加Hystrix依赖 spring-cloud-starter-hystrix
<!-- SpringCloud Hystrix 微服务容错监控组件:断路器,依赖隔离,服务降级,服务监控 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
3> 修改 com.ysd.springcloud.service.ConsumerService 添加降级服务
@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服务降级"); }
@HystrixCommand(fallbackMethod=“getProviderFutureFallback”) 含义 为 当 http://serviceprovider/getFuture
不可用时使用备用服务方法 getProviderFutureFallback
4>在项目入口函数上添加 @EnableHystrix和@SpringCloudApplication
5>启动项目,访问注册中心http://localhost:8001/getProviderFuture
可以观察到服务provider不可用时,实现了服务降级。
@SpringCloudApplication相当于@SpringBootApplication+
@EnableDiscoveryClient+
@EnableCircuitBreaker
(2) Feign实现服务降级
编写@FeignClient注解接口的实现类,当Feign调用的远程服务不可用时,使用注解@FeignClient的fallback属性指明备用服务在刚编写的实现类中。
1>创建springcloud-consumer-feign项目,保持项目代码不变,
只修改项目名称为springcloud-consumer-feign-hystrix
2>在pom.xml文件中
添加Hystrix依赖 spring-cloud-starter-hystrix

<!-- SpringCloud Hystrix 微服务容错监控组件:断路器,依赖隔离,服务降级,服务监控 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

3>编写一个@FeignClient注解的com.ysd.springcloud.service.ConsumerService接口实现类

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服务降级");
}
}

4>修改注解@FeignClientfallback属性指向实现类

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)
public interface ConsumerService {
@RequestMapping("/getFuture")
public List<String> getProviderFuture();
}

@FeignClient(value=“service-provider”,fallback=ConsumerServiceImpl.class) 含义为 当远程服务 serviceprovider不可用时使用ConsumerServiceImpl实现类中的getProviderFuture实现方法

5>修改配置文件启用Feign中hystrix服务降级
feign:
hystrix:
enabled: true
6>修改入口函数类上的注解为@EnableFeignClients
@SpringCloudApplication。启动项目,访问注册中心
http://localhost:8001/getProviderFuture
可以观察到服务provider不可用时,实现了服务降级。
雪崩效应。Hystrix容错保护体系中的 断路器、依赖隔离、服务降级 都是为了防止出现雪崩效应。服务降级的运行效果我们也已经在本本章前面分别使用RestTemplate、Feign进行效果实现。
断路器
接下来我们将详细演示断路器、依赖隔离的效果.当provider提供的服务可用但是有延迟时,会触发降级逻辑,但是即使这样,受限于Hystrix超时时间的问题,我们的调用依然很有可能产生堆积。这个时候断路器就会发挥作用,那么断路器是在什么情况下开始起作用呢?这里涉及到断路器的三个重要参数:快照时间窗、请求总数下限、错误百分比下限。
1.首先我们修改服务提供者让提供者进行休眠3s
2.对于 springcloud-consumer-feign 和 springcloud-consumer-feign-hystrix 我们做同样的修改:在项目配置文件中添加tomcat的最大并发线程量为30
3.在控制器中添加其它的方法
此时provider只是有3秒延迟并未拒绝服务;服务消费者只有一个服务且仅被调用一次,不可能达到依赖隔离的最大线程量或信号量;由此引发回退机制执行了降级服务的原因是断路器熔断。
备注:当服务提供者提供健康服务时,已熔断的断路器会自动恢复
依赖隔离
把两个消费者项目最大并发负载修改为 30
使用 Jmeter 并发压力测试工具让消费者项目过载
用100个线程并发请求 http://localhost:8001/getProviderFuture 持续不断30秒。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值