SpringCloud(五)之Spring Cloud 中 Feign結合Hystrix斷路器開發實戰


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
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM