最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn)

 更新時(shí)間:2019年05月01日 14:50:48   作者:卿亦離  
這篇文章主要介紹了SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.雪崩效應(yīng)

雪崩效應(yīng)

如上圖所示,假設(shè)我們有3個(gè)微服務(wù)A,B,C,A調(diào)用B,B調(diào)用C,如果C掛掉了,由于B是同步調(diào)用,不斷等待,導(dǎo)致資源耗盡,B也掛掉,接下來(lái)A也掛掉了,造成了雪崩效應(yīng)!為了防止雪崩效應(yīng),所以我們要在本篇文章中介紹Hystrix。

2.Hystrix

Hystrix

hystrix對(duì)應(yīng)的中文名字是“豪豬”,豪豬周身長(zhǎng)滿了刺,能保護(hù)自己不受天敵的傷害,代表了一種防御機(jī)制,反正這種豬我是沒(méi)吃過(guò)的,不敢吃。那么Hystrix又具備什么樣的特點(diǎn)呢:

2.1服務(wù)降級(jí)

雙11的時(shí)候我們經(jīng)??吹桨驯粩D爆了,這其實(shí)就是一種服務(wù)降級(jí)。那么Hystrix是怎么做到服務(wù)降級(jí)的呢?

2.1.1優(yōu)先核心服務(wù),非核心服務(wù)不可用或者弱可用

比如在一個(gè)系統(tǒng)中我們可能有限保證訂單和支付服務(wù),但是對(duì)于廣告之類的服務(wù)就若花掉

2.1.2通過(guò)HystrixCommand注解

2.1.3fallbackMethod中具體實(shí)現(xiàn)降級(jí)邏輯

2.1.4具體使用

2.1.4.1pom.xml

  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

2.1.4.2啟動(dòng)類

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {

  public static void main(String[] args) {
    SpringApplication.run(OrderApplication.class, args);
  }
}

在這里我們引入了@EnableCircuitBreaker這個(gè)注解,但是可以看到我們的main函數(shù)所在的類上面有好多注解了,我們這里用一個(gè)SpringCloudApplication注解包含上面的3個(gè)注解

2.1.4.3HystrixCommand與fallback的使用

 @HystrixCommand(fallbackMethod="fallback")
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

  private String fallback() {
    return "太擁擠了, 請(qǐng)稍后再試~~";
  }

假設(shè)你的方法有幾萬(wàn)個(gè),上面的這種寫(xiě)法用@HystrixCommand這個(gè)注解肯定要用幾萬(wàn)次,太麻煩了,我們來(lái)優(yōu)化和更新一下:

@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

  @HystrixCommand(commandProperties = {
      @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
  })
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

  private String defaultFallback() {
    return "默認(rèn)提示:太擁擠了, 請(qǐng)稍后再試~~";
  }
}

直接在Controller上面寫(xiě)了一個(gè)DefaultProperties這樣的注解,然后定義了一個(gè)defaultFallback這樣的方法,我們?cè)趃etProductInfoList這個(gè)方法上的@HystrixCommand注解上可以不在注明fallback方法了,因?yàn)槲覀兌加胐efaultFallback了。但是在這里我們用了一個(gè)commandProperties = {

@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),這個(gè)表示當(dāng)調(diào)用方法超過(guò)3秒鐘時(shí),就服務(wù)降級(jí)

2.2依賴隔離

Hystrix使用依賴隔離完成的是線程池的隔離,它為每個(gè)HystrixCommand創(chuàng)建一個(gè)單獨(dú)的線程池。這樣某個(gè)在HystrixCommand包裝下的依賴服務(wù)出現(xiàn)延遲過(guò)高的情況,也只是對(duì)該依賴的服務(wù)調(diào)用產(chǎn)生影響,并不會(huì)拖慢其他服務(wù)。使用了HystrixCommand將某個(gè)函數(shù)包裝成Hystrix命令時(shí),Hystrix框架就會(huì)自動(dòng)的為這個(gè)函數(shù)實(shí)現(xiàn)了依賴隔離,所以依賴隔離和服務(wù)降級(jí)是一體化實(shí)現(xiàn)的。

2.3服務(wù)熔斷

當(dāng)服務(wù)調(diào)用發(fā)生錯(cuò)誤到一定比例的時(shí)候,斷路器就會(huì)打開(kāi),服務(wù)的調(diào)用會(huì)轉(zhuǎn)向另外一個(gè)指定的調(diào)用方法,這就是服務(wù)熔斷,這樣說(shuō)比較抽象,我們看看下面這個(gè)圖:

斷路器

斷路器一共有三個(gè)狀態(tài),初始的時(shí)候是closed狀態(tài),如果用戶不斷調(diào)用且失敗次數(shù)達(dá)到了一定的閾值,這個(gè)時(shí)候斷路器就會(huì)變成open狀態(tài),接下來(lái)用戶不斷調(diào)用這個(gè)接口都是進(jìn)入到另一個(gè)缺省方法中。但是斷路器不會(huì)一直處于open狀態(tài),當(dāng)open狀態(tài)達(dá)到一定時(shí)間后,斷路器會(huì)變成half open狀態(tài),進(jìn)入half open狀態(tài)后,將會(huì)允許請(qǐng)求再次訪問(wèn)真正的服務(wù),如果訪問(wèn)成功了,斷路器會(huì)變成closed狀態(tài),服務(wù)恢復(fù)正常,如果還失敗又再次進(jìn)入到open狀態(tài)。

2.3.1代碼演示

  @HystrixCommand(commandProperties = {
      @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),         //設(shè)置熔斷
      @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //請(qǐng)求數(shù)達(dá)到后才計(jì)算
      @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠時(shí)間窗
      @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),  //錯(cuò)誤率
  })
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    if (number % 2 == 0) {
      return "success";
    }

    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

通過(guò)代碼,我們可以看到,有四個(gè)參數(shù),但是最重要的還是這三個(gè)參數(shù):

1.circuitBreaker.requestVolumeThreshold 請(qǐng)求數(shù)達(dá)到后才計(jì)算

2.circuitBreaker.sleepWindowInMilliseconds open狀態(tài)達(dá)到這個(gè)時(shí)間后,就會(huì)進(jìn)入到半熔斷狀態(tài)

3.circuitBreaker.errorThresholdPercentage 失敗請(qǐng)求比例

2.3.2使用配置項(xiàng)

從上面的代碼中,我們可以看到,很多配置項(xiàng)都是寫(xiě)在了代碼里面,接下來(lái),我們把這些配置放到配置文件里面去:

@HystrixCommand
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    if (number % 2 == 0) {
      return "success";
    }

    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

在yaml文件中添加這樣的配置:

hystrix:
 command:
  default:
   execution:
    isolation:
     thread:
      timeoutInMilliseconds: 1000
  getProductInfoList:
   execution:
    isolation:
     thread:
      timeoutInMilliseconds: 3000

在yaml文件中有一個(gè)getProductInfoList配置項(xiàng),和方法名一模一樣,還有一個(gè)default選項(xiàng),default選項(xiàng)表示所有被HystrixCommand注解的方法都可以用這個(gè)配置,getProductInfoList表示只有這個(gè)方法可以用這個(gè)配置項(xiàng)。

2.3.3feign-hystrix的使用

上面的小章節(jié)我們使用的是RestTemplate模板,接下來(lái)我們使用feign配合hystrix來(lái)進(jìn)行使用,有意思的是大家可以看看spring-cloud-starter-feign的pom.xml其實(shí)已經(jīng)在內(nèi)部依賴了hystrix。

2.3.3.1yaml配置文件

feign:
 hystrix:
  enabled: true

2.3.3.2FeignClient

@FeignClient(name = "product", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {

  @PostMapping("/product/listForOrder")
  List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);

  @PostMapping("/product/decreaseStock")
  void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);

  @Component
  static class ProductClientFallback implements ProductClient {

    @Override
    public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
      return null;
    }

    @Override
    public void decreaseStock(List<DecreaseStockInput> decreaseStockInputList) {

    }
  }
}

兩個(gè)注意點(diǎn),一個(gè)是fallback的配置,還有一個(gè)是內(nèi)部類需要加上@Component注解

2.3.3.3調(diào)用方記得加上ComponentScan

 2.4監(jiān)控HystrixDashBoard

2.4.1pom.xml

spring-cloud-starter-hystrix-dashboard

2.4.2yaml文件

management:
 context-path: /

2.4.3訪問(wèn)

IP:PORT/hystrix

服務(wù)容錯(cuò)就講到這里,下一章節(jié)我們講解下服務(wù)跟蹤。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Eclipse中配置Maven的圖文教程

    Eclipse中配置Maven的圖文教程

    這篇文章主要介紹了Eclipse中配置Maven的圖文教程,需要的朋友可以參考下
    2020-12-12
  • java正則表達(dá)式判斷 ip 地址是否正確解析

    java正則表達(dá)式判斷 ip 地址是否正確解析

    這篇文章主要介紹了java正則表達(dá)式判斷 ip 地址是否正確解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • java實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)

    java實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • SpringBoot Knife4j在線API文檔框架基本使用

    SpringBoot Knife4j在線API文檔框架基本使用

    knife4j是為Java MVC框架集成Swagger生成Api文檔的增強(qiáng)解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J在線API文檔框架,需要的朋友可以參考下
    2022-12-12
  • 基于JDK8-lambda表達(dá)式四種forEach性能對(duì)比

    基于JDK8-lambda表達(dá)式四種forEach性能對(duì)比

    這篇文章主要介紹了基于JDK8-lambda表達(dá)式四種forEach性能對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實(shí)現(xiàn)的串口通信功能示例

    Java實(shí)現(xiàn)的串口通信功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的串口通信功能,結(jié)合實(shí)例形式分析了java串口通信的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-01-01
  • 如何基于JAVA讀取yml配置文件指定key內(nèi)容

    如何基于JAVA讀取yml配置文件指定key內(nèi)容

    這篇文章主要介紹了如何基于JAVA讀取yml配置文件指定key內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • springboot+mybatis-plus 兩種方式打印sql語(yǔ)句的方法

    springboot+mybatis-plus 兩種方式打印sql語(yǔ)句的方法

    這篇文章主要介紹了springboot+mybatis-plus 兩種方式打印sql語(yǔ)句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java基于JDK 1.8的LinkedList源碼詳析

    Java基于JDK 1.8的LinkedList源碼詳析

    這篇文章主要給大家介紹了關(guān)于Java基于JDK 1.8的LinkedList源碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 詳解Java發(fā)送HTTP請(qǐng)求

    詳解Java發(fā)送HTTP請(qǐng)求

    這篇文章主要介紹了Java發(fā)送HTTP請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

邯郸县| 原阳县| 会昌县| 南宁市| 绥德县| 若羌县| 绥德县| 长子县| 驻马店市| 绥芬河市| 商水县| 河津市| 无锡市| 南昌市| 罗田县| 上林县| 孟连| 南靖县| 龙陵县| 清河县| 肃北| 科技| 内丘县| 阿拉尔市| 丹阳市| 临朐县| 常宁市| 社旗县| 海安县| 墨玉县| 宜川县| 平利县| 浦江县| 无极县| 景谷| 巨鹿县| 浦城县| 三江| 昭通市| 广德县| 拉孜县|