
本文共 3672 字,大约阅读时间需要 12 分钟。
一、整框架结构
二、springcloud整合hystrix
2.1、order服务中引入依赖(加载最外层的pom.xml)
org.springframework.cloud spring-cloud-starter-hystrix com.netflix.hystrix hystrix-javanica RELEASE
2.2、主配置类添加注解
@EnableHystrix或@EnableCircuitBreaker
2.3、配置文件yml中开启hystrix(必须开启) 否则hystrix会走熔断路线←←←这句话有问题、、、、、
注:
feign: hystrix: enabled: true
2.4、需要熔断的方法中添加注解
注:orderToMember方法为调用方法(用户请求的),hystrixResult方法为熔断、隔离、降级后的响应方法
不需要熔断的方法 @Override public Object getOrder(String orderName) { System.out.println("getOrder当前访问线程池"+Thread.currentThread().getName()); Order order = new Order(); order.setOrderName(orderName); order.setStatus("1"); order.setStock("1000"); order.setAttributeList("规格"); return order; } //需要熔断-在member会员项目中线程设置了sleep延时1.5秒 @Override @HystrixCommand(fallbackMethod = "hystrixResult") public Object orderToMember(String name) { System.out.println("orderToMember当前访问线程池"+Thread.currentThread().getName()); return orderToMemberServiceFeign.getUser(name); } //熔断返回的数据 public MaphystrixResult(String id) { System.out.println("熔断器启动"); HashMap hashMap = new HashMap(); hashMap.put("error", "熔断器启动后快速返回结果给客户端的内容" + id); return hashMap; }
结果
2.5、如果会员服务设置的thread.sleep(1500),默认情况下用户端最大等待时间区间在1秒,这种情况下用户会收到降级消息;只要在yml中配置hystrix.command.default.execution.timeout.enabled=false 即可正常(执行是否启用超时,默认启用true),但是我这里测试了报黄,求告知原因
正式项目不能禁用-默认开启为true,(应该会有个设置超时时间的参数)
三、定义统一fallback接口
3.1、在二的搭建基础上加入以下配置(只要配置order服务)
3.2、新增一个类
3.3、MemberServiceFallback类
3.3.1、创建MemberServiceFallback类,实现OrderToMemberServiceFeign类,
3.3.2、添加@Component注解
3.3.3、并添加返回提示代码,如下
@Componentpublic class MemberServiceFallback implements OrderToMemberServiceFeign { @Override public Object getUser(String name) { System.out.println("开启Fallback"); HashMaphashMap = new HashMap(); hashMap.put("error", "服务器忙!请稍后重试!!!" + name); return hashMap; }}
3.4、OrderToMemberServiceFeign类中也需要在@FeignClient注解中添加 , fallback = MemberServiceFallback.class
3.5、service层,orderToMemberFallback方法测试统一fallback接口是否生效
@Override public Object getOrder(String orderName) { System.out.println("getOrder当前访问线程池"+Thread.currentThread().getName()); Order order = new Order(); order.setOrderName(orderName); order.setStatus("1"); order.setStock("1000"); order.setAttributeList("规格"); return order; } //hystrix注解的优先级比orderToMemberFallback方法更高 @Override @HystrixCommand(fallbackMethod = "hystrixResult") public Object orderToMember(String name) { System.out.println("orderToMember当前访问线程池"+Thread.currentThread().getName()); return orderToMemberServiceFeign.getUser(name); } public MaphystrixResult(String name) { System.out.println("熔断器启动"); HashMap hashMap = new HashMap(); hashMap.put("error", "熔断器启动后快速返回结果给客户端的内容" + name); return hashMap; } //定义统一fallback接口 public Object orderToMemberFallback(String name) { System.out.println("orderToMemberFallback当前访问线程池"+Thread.currentThread().getName()); return orderToMemberServiceFeign.getUser(name); }
3.6、测试
3.6.1、分别访问controller层的getOrder(直接调用本服务)、orderToMember(调用member服务—hystrix注解)、orderToMemberFallback(调用member服务——fallback接口)、方法(对应service层)3.6.2、访问结果
3.6.3、然后看下线程
3.6.4、分析:
1、看第二种(开启hystrix注解版)不仅走的注解,也走了接口,会开启一个新的线程
2、第三种(开启hystrix接口版)正常返回提示,使用同一个线程
3、注解优先级高于接口
二、原理
2.1、介绍hystrix
2.2、雪崩效应
雪崩效应解决方法
a.服务降级(给客户另一个页面) b.服务隔离 c.服务熔断
参考链接:
抄抄抄你妹的
这个好
发表评论
最新留言
关于作者
