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