日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hystrix服务降级

發(fā)布時間:2024/4/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hystrix服务降级 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

動手實踐

引入依賴

首先在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。