成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

微服務(wù)實(shí)戰(zhàn):服務(wù)熔斷降級(jí)組件 Hystrix 工作原理及用法,實(shí)戰(zhàn)講解!

開發(fā) 架構(gòu)
在微服務(wù)架構(gòu)中,服務(wù)之間的依賴關(guān)系錯(cuò)綜復(fù)雜,一個(gè)服務(wù)的失敗可能會(huì)影響到調(diào)用它的其他服務(wù),進(jìn)而引發(fā)整個(gè)系統(tǒng)的崩潰。

一、背景介紹

在上一篇文章中,我們介紹了 Spring Cloud 技術(shù)體系中最核心的組件之一 Feign,它主要作用是簡(jiǎn)化 HTTP 客戶端的開發(fā)工作,通過(guò)簡(jiǎn)單的幾個(gè)注解配置即可完成 HTTP 調(diào)用的綁定操作。

今天通過(guò)這篇文章,結(jié)合之前的知識(shí),我們一起來(lái)了解一下 Spring Cloud 技術(shù)體系中另一個(gè)最核心的組件之一 Hystrix。

二、Hystrix 簡(jiǎn)介

Spring Cloud Hystrix 是一套基于 Netflix Hystrix 實(shí)現(xiàn)的斷路器工具,主要作用是處理那些可能會(huì)失敗并且需要被隔離的遠(yuǎn)程服務(wù)調(diào)用,以避免導(dǎo)致整個(gè)系統(tǒng)崩潰。

在微服務(wù)架構(gòu)中,業(yè)務(wù)服務(wù)之間的調(diào)用通常錯(cuò)綜復(fù)雜,比如某個(gè)服務(wù)接口 A,當(dāng)收到用戶請(qǐng)求的時(shí)候,會(huì)調(diào)用服務(wù) B 的接口;服務(wù)接口 C 可能也會(huì)調(diào)用服務(wù) B,依次類推。

圖片圖片

這種請(qǐng)求鏈路非常常見,假設(shè)服務(wù) B 因?yàn)檎?qǐng)求量過(guò)大而出現(xiàn)無(wú)法響應(yīng),導(dǎo)致服務(wù)不可用。此時(shí)所有調(diào)用服務(wù) B 的客戶端都會(huì)出現(xiàn)異常,甚至?xí)駶L雪球一樣放大到所有相關(guān)的服務(wù)。

圖片圖片

對(duì)于要求高可用的項(xiàng)目來(lái)說(shuō),顯然這是不可接受的。為了解決這個(gè)問(wèn)題,因此產(chǎn)生了斷路器這類服務(wù)保護(hù)的工具。

Hystrix 類似于電路中的斷路器,當(dāng)線路中有點(diǎn)電器發(fā)生短路時(shí),此時(shí)斷路器就會(huì)發(fā)揮作用,它會(huì)及時(shí)的切斷故障電路,防止發(fā)生過(guò)載、發(fā)熱、甚至起火等嚴(yán)重后果,以保護(hù)線路的安全。

引入 Hystrix 之后,服務(wù)的遠(yuǎn)程調(diào)用邏輯可以用如下圖來(lái)簡(jiǎn)要概括。

圖片圖片

當(dāng)調(diào)用遠(yuǎn)程服務(wù)失敗率達(dá)到一定閾值時(shí),Hystrix 會(huì)自動(dòng)打開斷路器,阻止對(duì)下游服務(wù)的進(jìn)一步調(diào)用,從而避免系統(tǒng)資源的浪費(fèi)和可能的級(jí)聯(lián)失敗;當(dāng)下游服務(wù)恢復(fù)正常之后,斷路器會(huì)在一段時(shí)間后自動(dòng)或半自動(dòng)地關(guān)閉,嘗試恢復(fù)下游服務(wù)調(diào)用。

下面我們通過(guò)具體的例子,看看如何使用 Hystrix 來(lái)實(shí)現(xiàn)服務(wù)自動(dòng)熔斷。

三、方案實(shí)踐

3.1、Hystrix 使用示例

在此,我們以之前介紹的 Ribbon 為例,依次創(chuàng)建eureka-server、eureka-provider工程,就不重復(fù)粘貼了。

3.1.1、創(chuàng)建服務(wù)消費(fèi)者

根據(jù)eureka-consumer-ribbon復(fù)制一個(gè)服務(wù)消費(fèi)者工程,命名為eureka-consumer-ribbon-hystrix,并在pom.xml中引入 Hystrix 依賴包,示例如下:

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

3.1.2、開啟掃描 Hystrix 功能

然后,創(chuàng)建一個(gè)服務(wù)啟動(dòng)類并添加@EnableCircuitBreaker或者@EnableHystrix注解,表示開啟掃描 Hystrix 功能。

@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
publicclass Application {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        returnnew RestTemplate();
    }

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

3.1.3、編寫服務(wù)降級(jí)方法

接著,創(chuàng)建一個(gè)遠(yuǎn)程調(diào)用服務(wù)RpcService并使用@HystrixCommand注解指定服務(wù)遠(yuǎn)程調(diào)用失敗后的降級(jí)方法,示例如下:

@Service
publicclass RpcService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "fallback")
    public String hello() {
        String url = "http://eureka-provider/hello";
        String result = restTemplate.getForObject(url, String.class);
        return result;
    }

    /**
     * 服務(wù)降級(jí)方法
     * @return
     */
    public String fallback() {
        return"發(fā)起遠(yuǎn)程調(diào)用失敗,服務(wù)自動(dòng)熔斷";
    }
}

3.1.4、編寫遠(yuǎn)程調(diào)用類

最后,創(chuàng)建一個(gè)controller,通過(guò)定義的遠(yuǎn)程調(diào)用服務(wù)發(fā)起請(qǐng)求。

@RestController
publicclass HelloController {

    @Autowired
    private RpcService rpcService;


    /**
     * 發(fā)起遠(yuǎn)程調(diào)用測(cè)試
     * @return
     */
    @GetMapping("/rpc")
    public String rpc() {
        String result = rpcService.hello();
        return"發(fā)起遠(yuǎn)程調(diào)用,收到返回的信息:" +  result;
    }
}

3.1.5、服務(wù)測(cè)試

完成以上工程之后,依次將eureka-server、eureka-provider、eureka-consumer-ribbon-hystrix服務(wù)啟動(dòng)起來(lái)。

然后在瀏覽器上訪問(wèn)eureka-consumer-ribbon-hystrix服務(wù)中的/rpc接口,中途將eureka-provider服務(wù)停掉,可以得到類似于如下內(nèi)容。

圖片圖片

可以清晰的看到,當(dāng)客戶端遠(yuǎn)程調(diào)用失敗后,斷路器自動(dòng)開啟并調(diào)用指定的服務(wù)降級(jí)方法。

3.1.6、斷路器閾值設(shè)置

默認(rèn)情況下,被 Hystrix 保護(hù)的方法,在 10 秒內(nèi),調(diào)用次數(shù)超過(guò)了 20 次并且出現(xiàn) 50% 以上的請(qǐng)求發(fā)生失敗, 那么斷路器就會(huì)進(jìn)入打開狀態(tài),所有后續(xù)的調(diào)用都將會(huì)由回調(diào)方法處理;如果服務(wù)提供者掛了,也會(huì)直接進(jìn)入打開狀態(tài)。在 5 秒之后,斷路器進(jìn)入半開狀態(tài),將會(huì)再次嘗試調(diào)用原始的方法,如果請(qǐng)求成功,斷路器進(jìn)入關(guān)閉狀態(tài)。

如果想要調(diào)整斷路器閾值,例如在 20 秒內(nèi),調(diào)用次數(shù)超過(guò) 30 次并且失敗率超過(guò) 30% 時(shí),斷路器自動(dòng)進(jìn)入打開狀態(tài),可以通過(guò)如下方式進(jìn)行配置。

@HystrixCommand(fallbackMethod = "fallback",commandProperties = {
        @HystrixProperty(
                name = "circuitBreaker.requestVolumeThreshold",
                value = "30"),
        @HystrixProperty(
                name = "circuitBreaker.errorThresholdPercentage",
                value = "30"),
        @HystrixProperty(
                name = "metrics.rollingStats.timeInMilliseconds",
                value = "20000"),
        @HystrixProperty(
                name = "circuitBreaker.sleepWindowInMilliseconds",
                value = "60000")
})
public String hello() {
    String url = "http://eureka-provider/hello";
    String result = restTemplate.getForObject(url, String.class);
    return result;
}

3.2、Feign 使用 Hystrix

在介紹 Feign 使用方式中,我們有提到過(guò) Feign 不僅整合了 Ribbon,還整合了 Hystrix。因此,我們可以在 Feign 客戶端中直接使用 Hystrix 相關(guān)功能。

根據(jù)之前的eureka-consumer-feign復(fù)制一個(gè)服務(wù)消費(fèi)者工程,命名為eureka-consumer-feign-hystrix,相關(guān)的依賴包也一起 copy 過(guò)來(lái)。

3.2.1、添加相關(guān)配置

然后,在application.properties配置文件中,開啟 hystrix 熔斷。

# 在Feign中開啟 hystrix熔斷
feign.hystrix.enabled=true

3.2.2、編寫服務(wù)回調(diào)類

接著,創(chuàng)建回調(diào)類RpcServiceHystrix并實(shí)現(xiàn)RpcService接口。

@Component
public class RpcServiceHystrix implements RpcService {


    @Override
    public String findByName(@RequestParam(value = "name") String name) {
        return "請(qǐng)求失敗,服務(wù)自動(dòng)降級(jí),請(qǐng)求參數(shù):" +name;
    }
}

3.2.3、指定服務(wù)回調(diào)類

再然后,在@FeignClient注解中通過(guò)fallback屬性指定請(qǐng)求失敗時(shí)的回調(diào)類;同時(shí),在服務(wù)提供者中也增加一個(gè)/findByName接口,用于接受請(qǐng)求。

/**
 * 配置要調(diào)用的服務(wù)實(shí)例名稱,并指定請(qǐng)求失敗時(shí)的回調(diào)類
 */
@FeignClient(name = "eureka-provider", fallback = RpcServiceHystrix.class)
public interface RpcService {

    /**
     * 要調(diào)用的目標(biāo)服務(wù)接口地址
     * @return
     */
    @RequestMapping(value = "/findByName")
    String findByName(@RequestParam(value = "name") String name);
}

3.2.4、編寫遠(yuǎn)程調(diào)用類

最后,創(chuàng)建一個(gè)controller,通過(guò)定義的 feign 客戶端和 hystrix 熔斷器來(lái)調(diào)用服務(wù)提供方的接口。

@RestController
publicclass HelloController {

    @Autowired
    private RpcService rpcService;


    /**
     * 發(fā)起遠(yuǎn)程調(diào)用測(cè)試
     * @return
     */
    @GetMapping("/rpc")
    public String rpc(@RequestParam(value = "name") String name) {
        String result = rpcService.findByName(name);
        return"通過(guò) feign 發(fā)起遠(yuǎn)程調(diào)用(帶 hystrix 熔斷器),收到返回的信息:" +  result;
    }
}

3.2.5、服務(wù)測(cè)試

完成以上工程之后,依次將eureka-server、eureka-provider、eureka-consumer-feign-hystrix服務(wù)啟動(dòng)起來(lái)。

與之類似,然后在瀏覽器上訪問(wèn)eureka-consumer-feign-hystrix服務(wù)中的/rpc接口,中途將eureka-provider服務(wù)停掉,可以得到類似于如下內(nèi)容。

圖片

可以清晰的看到,效果與上文介紹的一樣。當(dāng)客戶端遠(yuǎn)程調(diào)用失敗后,斷路器自動(dòng)開啟并調(diào)用指定的服務(wù)回調(diào)方法。

四、小結(jié)

最后總結(jié)一下,在微服務(wù)架構(gòu)中,服務(wù)之間的依賴關(guān)系錯(cuò)綜復(fù)雜,一個(gè)服務(wù)的失敗可能會(huì)影響到調(diào)用它的其他服務(wù),進(jìn)而引發(fā)整個(gè)系統(tǒng)的崩潰。

Hystrix 就是為了解決這類問(wèn)題而設(shè)計(jì)的。Hystrix 具備斷路器模式、服務(wù)降級(jí)、請(qǐng)求緩存、請(qǐng)求合并、線程隔離、自動(dòng)回退等強(qiáng)大功能,由 Netflix 開發(fā)并開源。

盡管之后 Netflix 宣布對(duì)其停止維護(hù),但是 Hystrix 仍然是一個(gè)值得學(xué)習(xí)和了解的重要工具,特別是在理解分布式系統(tǒng)容錯(cuò)和斷路器模式方面。

五、參考

  1. http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html
  2. https://www.didispace.com/spring-cloud/springcloud3.html#netflix-hystrix
責(zé)任編輯:武曉燕 來(lái)源: 潘志的技術(shù)筆記
相關(guān)推薦

2025-03-07 08:57:46

HTTP客戶端框架

2021-05-14 09:15:32

SpringCloud微服務(wù)日志

2021-03-16 08:31:59

微服務(wù)Sentinel雪崩效應(yīng)

2020-09-26 10:56:33

服務(wù)器熔斷服務(wù)隔離

2021-03-09 09:33:42

網(wǎng)關(guān)授權(quán)微服務(wù)

2016-08-25 21:12:31

微服務(wù)架構(gòu)發(fā)布

2016-08-25 20:55:19

微服務(wù)架構(gòu)發(fā)布

2017-07-03 09:50:07

Spring Clou微服務(wù)架構(gòu)

2024-11-29 16:02:17

2021-01-28 10:10:51

微服務(wù)后端SpringCloud

2021-09-06 11:34:47

架構(gòu)微服務(wù)Hystrix

2022-04-09 14:45:02

微服務(wù)常見概念Spring

2021-06-09 09:42:50

SpringCloud微服務(wù)灰度發(fā)布

2021-08-02 09:27:02

微服務(wù)接口場(chǎng)景

2021-04-22 09:31:58

服務(wù)器微服務(wù)配置

2021-07-07 10:21:26

技術(shù)

2022-06-24 07:08:24

OHOS自定義服務(wù)

2017-11-16 15:45:25

服務(wù)降級(jí)熔斷

2018-08-01 14:20:11

微服務(wù)架構(gòu)人工智能

2009-06-27 20:10:00

LinuxNFS原理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品国产欧美一区二区 | 欧美视频成人 | 在线观看日本高清二区 | 午夜影视| 亚洲午夜电影 | 欧美一级黄色片在线观看 | www.日韩av.com | 久久久久久国产精品免费免费 | 精精国产xxxx视频在线播放7 | 综合婷婷 | www日日日 | 国产精品69毛片高清亚洲 | 国产人成精品一区二区三 | 亚洲精品视频一区二区三区 | 深夜福利亚洲 | 欧美精品在线观看 | 欧美成人一区二区三区 | 国产精品久久久久久一级毛片 | 国产精品久久一区 | 91人人看 | 成人欧美一区二区三区黑人孕妇 | 能看的av | 91精品国产综合久久婷婷香蕉 | 伊人二区 | 97免费在线观看视频 | 三级在线观看 | 黄色高清视频 | 成人乱人乱一区二区三区软件 | 天天躁人人躁人人躁狂躁 | 欧美一区二区三区在线视频 | 91国内在线观看 | 国产一区不卡 | 国产成人jvid在线播放 | 在线免费亚洲视频 | 天天操网 | 精品国产18久久久久久二百 | 91精品成人久久 | 久久久久一区二区三区四区 | 亚洲国产一区二区三区在线观看 | 精品91久久久 | 亚洲综合在线视频 |