1.先讲hystrx(断路器) 在springcloub 中的使用
1.1 加入依赖
注意:网上新旧版本问题,所以要以官网为主,不然部分注解会丢失
最新版本 2.0
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
1.2 增加注解
启动类里面增加注解
@EnableCircuitBreaker
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class OrderServiceApplication { public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} }
1.3 API接口编码实战(下面就是熔断降级服务异常报警通知实战)
熔断-》降级
1)最外层api使用(比如:controller上面),好比异常处理(网络异常,参数或者内部调用问题,报警)
api方法上增加 @HystrixCommand(fallbackMethod = "saveOrderFail")
编写fallback方法实现,方法签名一定要和api方法签名一致(注意点!!!)
@RestController
@RequestMapping("api/v1/order")
public class OrderController { @Autowired
private ProductOrderService productOrderService;
@Autowired
private StringRedisTemplate stringRedisTemplate; @RequestMapping("save")
@HystrixCommand(fallbackMethod = "saveFallback")
public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
if (userId==1){
return "123";
}
Map<String, Object> msg = new HashMap<>();
msg.put("code", -1);
msg.put("msg", productOrderService.save(userId, productId));
return msg;
}
/***
* @Description: save 方法出现异常,Hystrix 熔断之后回调方法
* 该参数的参数要和目标方法参数一致
* @Param: [userId, productId]
* @return: java.lang.Object
* @author: wangbs
* @create: 2019/2/19 9:07
*/
public Object saveFallback(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
//模拟发短信信息进行提醒发生了错误信息
String saveOrderKye = stringRedisTemplate.opsForValue().get("saveOrderKye");
//进行报警告诉相关人,对应的api出错
new Thread(()->{
if(StringUtils.isBlank(saveOrderKye)){
stringRedisTemplate.opsForValue().set("saveOrderKye","save-order-fail",20, TimeUnit.SECONDS);
//模拟发短信功能
System.out.println("发送短信:productService 接口报错了"+request.getRemoteAddr());
}
}).start();
Map<String, Object> msg = new HashMap<>();
msg.put("code", -1);
msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
return msg;
}
}
2.Feign结合Hystrix断路器开发实战 在springcloub 中的使用
Feign结合Hystrix断路器开发实战,其实是为了把异常跟精确的定位到某个接口,而上面标题一我说的 ystrx(断路器) 在springcloub 中的使用 主要是在controller 中使用 目的是可以更好的控制异常处理,或者报警通知,
所以开发标题二时,标题一上面的所有配置全需要保留,不然没有意义。
2.1开启feign支持hystrix (注意,一定要开启,旧版本默认支持,新版本默认关闭)#开启feign支持hystrix
hystrix:
enabled: true 2.2 ProductClient(name="product-service", fallback=ProductClientFallback.class ), class需要继承当前ProductClient的类
至于下面的 ProductClient 讲的是Feign 的使用可以看看我的博客 feign 的讲解
https://www.cnblogs.com/xiaowangbangzhu/p/10397037.html
//服务的生成者(被调用者)在注册中心注册的名字
@FeignClient(name = "product-service",fallback = ProductClientFallback.class)
public interface ProductClient {
//被调用者对应方法的路由(类和方法上的@RequestMapping)
/**
* 这里需要注意的两个地方
* <p>
* 1、在这里使用的GetMapping注解要和被调用发一致,如果还有问题就用@RequestMapping
* 2、@PathVariable需要设置value,如果不设置也不能成功启动
*
* @param id
* @return
*/
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
@Component
public class ProductClientFallback implements ProductClient { @Override
public String findById(int id) {
//在这里可以得到具体的某一个接口api出现的错误,然后返回信息
System.out.println("feign 调用product-service findbyid 异常");
return null;
}
}
下面的配置不建议加上,如果有需要可以加上
s设置feign 的连接时间和读取时间(不建议开启)
#默认optons readtimeout是60,但是由于hystrix默认是1秒超时
#feign:
# client:
# config:
# default:
# connectTimeout: 40000
# readTimeout: 4000 # 默认是一秒(不建议开启)
#hystrix:
# command:
# default:
# execution:
# isolation:
# thread:
# timeoutInMilliseconds: 4000