hystrix服务降级
動手實踐
引入依賴
首先在service-consumer的pom.xml中引入Hystrix依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>開啟熔斷
可以看到,我們類上的注解越來越多,在微服務中,經常會引入上面的三個注解,于是Spring就提供了一個組合注解:@SpringCloudApplication
因此,我們可以使用這個組合注解來代替之前的3個注解。
@SpringCloudApplication public class ServiceConsumerApplication {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication .class, args);} }編寫降級邏輯
我們改造service-consumer,當目標服務的調用出現故障,我們希望快速失敗,給用戶一個友好提示。因此需要提前編寫好失敗時的降級處理邏輯,要使用HystixCommond來完成:
@Controller @RequestMapping("consumer/user") public class UserController {@Autowiredprivate RestTemplate restTemplate;@GetMapping@ResponseBody@HystrixCommand(fallbackMethod = "queryUserByIdFallBack")public String queryUserById(@RequestParam("id") Long id) {String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);return user;}public String queryUserByIdFallBack(Long id){return "請求繁忙,請稍后再試!";} }要注意,因為熔斷的降級邏輯方法必須跟正常邏輯方法保證:相同的參數列表和返回值聲明。失敗邏輯中返回User對象沒有太大意義,一般會返回友好提示。所以我們把queryById的方法改造為返回String,反正也是Json數據。這樣失敗邏輯中返回一個錯誤說明,會比較方便。
說明:
-
@HystrixCommand(fallbackMethod = "queryByIdFallBack"):用來聲明一個降級邏輯的方法
測試:
當service-provder正常提供服務時,訪問與以前一致。但是當我們將service-provider停機時,會發現頁面返回了降級處理信息:
默認FallBack
我們剛才把fallback寫在了某個業務方法上,如果這樣的方法很多,那豈不是要寫很多。所以我們可以把Fallback配置加在類上,實現默認fallback:
@Controller @RequestMapping("consumer/user") @DefaultProperties(defaultFallback = "fallBackMethod") // 指定一個類的全局熔斷方法 public class UserController {@Autowiredprivate RestTemplate restTemplate;@GetMapping@ResponseBody@HystrixCommand // 標記該方法需要熔斷public String queryUserById(@RequestParam("id") Long id) {String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);return user;}/*** 熔斷方法* 返回值要和被熔斷的方法的返回值一致* 熔斷方法不需要參數* @return*/public String fallBackMethod(){return "請求繁忙,請稍后再試!";} }-
@DefaultProperties(defaultFallback = "defaultFallBack"):在類上指明統一的失敗降級方法
-
@HystrixCommand:在方法上直接使用該注解,使用默認的剪輯方法。
-
defaultFallback:默認降級方法,不用任何參數,以匹配更多方法,但是返回值一定一致
設置超時
在之前的案例中,請求在超過1秒后都會返回錯誤信息,這是因為Hystix的默認超時時長為1,我們可以通過配置修改這個值:
我們可以通過hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds來設置Hystrix超時時間。該配置沒有提示。
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 6000 # 設置hystrix的超時時間為6000ms改造服務提供者
改造服務提供者的UserController接口,隨機休眠一段時間,以觸發熔斷:
@GetMapping("{id}") public User queryUserById(@PathVariable("id") Long id) {try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}return this.userService.queryUserById(id); }?
總結
以上是生活随笔為你收集整理的hystrix服务降级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA 项目结构旁边出现 0%clas
- 下一篇: hystrix之熔断