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