导言
本篇文章将为大家讲解SpringCloud的-Hystrix,顾名思义,Hystrix就是为更好保护服务,实现断路器原来,当高并发时,可以给客户端返回一个有好的提示!就想春运抢骗时,会提示您排队中一样!
本文相比以前几篇内容多一些,还希望大家仔细阅读!
为更好理解本,您可以阅读往期,关于《SpringCloud》相关文章,进而了解项目的升级演变!
SpringCloud整合Hystrix
- consumer项目
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!-- SpringCloud 整合hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!-- SpringBoot整合fegnin客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
</dependencies>
注: 因为order-api-server-impl项目内已经将consumer引用,所以无需更改
配置文件
#hystrix禁止服务超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: false
注:
此配置内容添加在order-api-server-impl内,当然您也可以不添加,这里只要是为了通过hystrix的超时时间来测试,我们也乐意用压力测试实现!
hystrix默认超时时间为1秒且默认开启,我们在代码内将进行阻塞为1.5秒,验证效果
业务代码
- 定义ConsumserFeign fallback
@FeignClient(value = "consumer",fallback = ConsumerFallback.class)
public interface ConsumserFeign extends IConsumerService {
}
- 定义ConsumerFallback
@Component
public class ConsumerFallback implements ConsumserFeign {
public String getUserInfo() {
return "服务正忙,请稍后再试!";
}
}
- Order实现
@RestController
public class OrderServiceImpl {
@Autowired
private IConsumerService consumerService;
//方案一: 通过@HystrixCommand注解,但是代码冗余
/**
* fallbackMethod 方法的作用:服务降级执行
* @HystrixCommand 默认开启线程池隔离方式,服务降级,服务熔断
* 设置Hystrix服务超时时间
* @author Dylan Yang
*/
@HystrixCommand(fallbackMethod = "orderToConsumerHystrixFallback")
@GetMapping("/orderToConsumerHystrix")
public String orderToConsumerHystrix() {
System.out.println("orderToConsumerHystrix:" + "线程池名称:" + Thread.currentThread().getName());
return consumerService.getUserInfo();
}
//此代码将大量出现在每一个服务内
public String orderToConsumerHystrixFallback() {
return "返回一个友好的提示:服务降级,服务器忙,请稍后重试!";
}
/**
* 通过Feign实现,推荐使用
* 将fallback 封装
* @author Dylan Yang
*/
@GetMapping("/orderToFeign")
public String orderToFeign() {
System.out.println("orderToFeign:" + "线程池名称:" + Thread.currentThread().getName());
return consumerService.getUserInfo();
}
}
注:
上面代码已经说明了实现熔断有两种方式,推荐第二种
效果演示
- 禁止服务超时的效果
接口可以访问 - 开启服务超时不做处理时的效果
服务超时,且无法访问,体验差 - 开启服务超时切做熔断处理
服务超时,但是可以访问,体验效果提升!
以上是两种方式,当然您可以根据您的喜好书写,但是小编还是推荐第二种!
这里有些绕,希望大家可以仔细阅读!
本文到此就实现了Feign客户端的调用,希望对正在学习的您有所帮助!不足之处还请大家包涵!下篇我们将讲述服务的容错!小编寄语
小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发! 小编微信:372787553
备注为进群,通过后小编会邀请您进群! 大家也可以关注小编的微信公众号《Java有货》,里边有更多的资源!