一,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服务停掉

3390

被折叠的 条评论
为什么被折叠?



