1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【121期】面試官:什么是熔斷?什么是服務(wù)降級(jí)?

        共 5443字,需瀏覽 11分鐘

         ·

        2021-01-19 07:08

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
        關(guān)注


        閱讀本文大概需要 5.5?分鐘。

        來自:blog.csdn.net/qq_41497111/article/details/92067565

        服務(wù)熔斷

        服務(wù)熔斷的作用類似于我們家用的保險(xiǎn)絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時(shí)的情況時(shí),為了防止整個(gè)系統(tǒng)出現(xiàn)雪崩,暫時(shí)停止對(duì)該服務(wù)的調(diào)用。

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

        服務(wù)降級(jí)是從整個(gè)系統(tǒng)的負(fù)荷情況出發(fā)和考慮的,對(duì)某些負(fù)荷會(huì)比較高的情況,為了預(yù)防某些功能(業(yè)務(wù)場(chǎng)景)出現(xiàn)負(fù)荷過載或者響應(yīng)慢的情況,在其內(nèi)部暫時(shí)舍棄對(duì)一些非核心的接口和數(shù)據(jù)的請(qǐng)求,而直接返回一個(gè)提前準(zhǔn)備好的fallback(退路)錯(cuò)誤處理信息。這樣,雖然提供的是一個(gè)有損的服務(wù),但卻保證了整個(gè)系統(tǒng)的穩(wěn)定性和可用性。

        熔斷VS降級(jí)

        相同點(diǎn):
        • 目標(biāo)一致 都是從可用性和可靠性出發(fā),為了防止系統(tǒng)崩潰;
        • 用戶體驗(yàn)類似 最終都讓用戶體驗(yàn)到的是某些功能暫時(shí)不可用;
        不同點(diǎn):
        • 觸發(fā)原因不同 服務(wù)熔斷一般是某個(gè)服務(wù)(下游服務(wù))故障引起,而服務(wù)降級(jí)一般是從整體負(fù)荷考慮;

        Hystrix簡介

        Hystrix:英 [h?st'r?ks] 美 [h?st'r?ks] ,翻譯過來是“豪豬”的意思。在分布式環(huán)境中,不可避免地會(huì)出現(xiàn)某些依賴的服務(wù)發(fā)生故障的情況。Hystrix是這樣的一個(gè)庫,它通過添加容許時(shí)延和容錯(cuò)邏輯來幫助你控制這些分布式服務(wù)之間的交互。Hystrix通過隔離服務(wù)之間的訪問點(diǎn),阻止跨服務(wù)的級(jí)聯(lián)故障,并提供了退路選項(xiàng),所有這些都可以提高系統(tǒng)的整體彈性。
        Hystrix的設(shè)計(jì)目的:
        • 通過第三方客戶端的庫來為訪問依賴服務(wù)時(shí)的潛在故障提供保護(hù)和控制;
        • 防止在復(fù)雜分布式系統(tǒng)中出現(xiàn)級(jí)聯(lián)故障;
        • 快速失敗和迅速恢復(fù);
        • 在允許的情況下,提供退路對(duì)服務(wù)進(jìn)行優(yōu)雅降級(jí);
        • 提供近實(shí)時(shí)的監(jiān)控、報(bào)警和操作控制;
        接下來我們演示如何使用Hystrix,eureka服務(wù)注冊(cè)中心以及message-service服務(wù)提供者無需更改。

        使用Hystrix

        引入Hystrix依賴

        在 pom.xml 文件中引入Hystrix依賴:

        ??org.springframework.boot
        ??spring-boot-starter-parent
        ??2.0.6.RELEASE
        ?

        ?
        ?
        ??Finchley.SR2
        ?

        ?
        ?
        ??
        ???org.springframework.boot
        ???spring-boot-starter-web
        ??

        ??
        ??
        ???org.springframework.cloud
        ???spring-cloud-starter-netflix-eureka-client
        ??

        ??
        ??
        ???org.springframework.cloud
        ???spring-cloud-starter-openfeign
        ??

        ??
        ??
        ???org.springframework.cloud
        ???spring-cloud-starter-netflix-hystrix
        ??

        ?

        ?
        ?
        ??
        ???
        ???
        ????org.springframework.cloud
        ????spring-cloud-dependencies
        ????${spring-cloud.version}
        ????<type>pomtype>
        ????import
        ???

        ??

        ?

        修改啟動(dòng)類

        在MessageCenterApplication啟動(dòng)類上增加@EnableCircuitBreaker注解:
        @EnableFeignClients
        @EnableCircuitBreaker
        public class MessageCenterApplication {

        public static void main(String[] args) {
        new SpringApplicationBuilder(MessageCenterApplication.class).web(WebApplicationType.SERVLET).run(args);
        }

        }
        這里我們?cè)趩?dòng)類中又增加了@EnableCircuitBreaker注解,用來開啟斷路器功能。如果你覺得啟動(dòng)類上的注解個(gè)數(shù)有點(diǎn)多的話,可以使用一個(gè)@SpringCloudApplication 注解來代替@SpringBootApplication(或者@EnableEurekaServer)、@EnableDiscoveryClient、@EnableCircuitBreaker這三個(gè)注解。
        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @SpringBootApplication
        @EnableDiscoveryClient
        @EnableCircuitBreaker
        public?@interface?SpringCloudApplication?{
        }

        修改Controller

        接下來,我們?yōu)镸essageCenterController中的getMsg()接口增加斷路器功能,修改部分代碼如下:
        ?@GetMapping("/msg/get")
        ?@HystrixCommand(fallbackMethod?=?"getMsgFallback")
        ?public?Object?getMsg()?{
        ??String?msg?=?messageService.getMsg();
        ??return?msg;
        ?}
        ?
        ?public?Object?getMsgFallback()?{
        ??return?"祝您 2019 豬年大吉,'豬'事如意!";
        ?}
        先啟動(dòng)Eureka,再啟動(dòng)一個(gè)8771端口的message-service服務(wù),最后啟動(dòng)message-center。待啟動(dòng)完成之后,Eureka注冊(cè)中心實(shí)例注冊(cè)信息如下:
        此時(shí),訪問 http://localhost:8781/api/v1/center/msg/get ,返回如下結(jié)果表明服務(wù)調(diào)用成功:
        然后,停掉message-service服務(wù),再次請(qǐng)求 http://localhost:8781/api/v1/center/msg/get ,返回結(jié)果如下:
        可以看出fallback中的信息被直接返回了,表明Hystrix斷路器調(diào)用成功。
        注意:fallback方法的簽名需要和原方法保持一致。
        ?/**
        ??*?獲取消息詳情
        ??*/
        ?@GetMapping("/api/v1/msg/detail/{id}")
        ?@HystrixCommand(fallbackMethod?=?"getDetailFallback")
        ?public?MessageEntity?getDetail(@PathVariable(name?=?"id")?Long?id)?{
        ??return?messageService.getById(id);
        ?}
        ?
        ?/**
        ??*?獲取消息詳情退路
        ??*/
        ?public?MessageEntity?getDetailFallback(Long?id){
        ??return?null;
        ?}

        Feign結(jié)合Hystrix

        以MessageService的Feign客戶端為例,為其添加Hystrix斷路器功能。

        修改Feign客戶端

        通過配置@FeignClient注解的fallback屬性來位MessageServiceClient指定一個(gè)自定義的fallback處理類(MessageServiceFallback)。
        @FeignClient(name?=?"message-service",?fallback?=?MessageServiceFallback.class)
        public?interface?MessageServiceClient?{
        ?
        ?@GetMapping("/api/v1/msg/get")
        ?public?String?getMsg();
        ?
        }

        創(chuàng)建Fallback處理類

        MessageServiceFallback需要實(shí)現(xiàn)MessageServiceClient接口,并且在Spring容器中必須存在一個(gè)該類型的有效Bean。在這里,我們使用@Component注解將其注入到Spring容器中。
        @Component
        public?class?MessageServiceFallback?implements?MessageServiceClient?{
        ?
        ?@Override
        ?public?String?getMsg()?{
        ??System.out.println("調(diào)用消息接口失敗,對(duì)其進(jìn)行降級(jí)處理!");
        ??return?"消息接口繁忙,請(qǐng)稍后重試!";
        ?}
        ?
        }

        修改配置

        在新版本的Springcloud中,F(xiàn)eign默認(rèn)關(guān)閉了對(duì)Hystrix的支持,需要在application.yml進(jìn)行配置:
        feign:
        ??hystrix:
        ????enabled:?true
        當(dāng)message-service服務(wù)不可用時(shí),請(qǐng)求 http://localhost:8781/api/v1/center/msg/get,返回結(jié)果如下:
        查看后臺(tái)日志,打印如下內(nèi)容,表明fallback方法被成功調(diào)用了:

        監(jiān)控Hystrix

        啟用健康監(jiān)控

        Actuator是Springboot提供的用來對(duì)應(yīng)用系統(tǒng)進(jìn)行自省和監(jiān)控的功能模塊,借助于Actuator開發(fā)者可以很方便地對(duì)應(yīng)用系統(tǒng)某些監(jiān)控指標(biāo)進(jìn)行查看、統(tǒng)計(jì)等。
        若要使用Actuator對(duì)Hystrix 流進(jìn)行監(jiān)控,除了需在工程POM文件中引入spring-boot-starter-actuator依賴:
        ??
        ??
        ???org.springframework.boot
        ???spring-boot-starter-actuator
        ??

        還需要在application.yml 中添加如下配置:
        management:
        ??endpoints:
        ????web:
        ??????exposure:
        ????????include:?hystrix.stream

        啟用Hystrix-Dashboard

        使用Hystrix一個(gè)最大的好處就是它會(huì)為我們自動(dòng)收集每一個(gè)HystrixCommand的信息,并利用Hystrix-Dashboard通過一種高效的方式對(duì)每一個(gè)斷路器的健康狀態(tài)進(jìn)行展示。
        值得注意的是,在使用HystrixCommand對(duì)RibbonClient進(jìn)行包裝的時(shí)候,你需要確保你配置的Hystrix超時(shí)時(shí)間要比Ribbon的超時(shí)時(shí)間長,包括由它們引起的重試時(shí)間,舉個(gè)例子:如果你的Ribbon連接超時(shí)時(shí)間是1秒,并且Ribbon會(huì)連續(xù)重試請(qǐng)求3次,那么你的Hystrix連接超時(shí)時(shí)間需要配置成稍大于3秒。

        引入Hystrix-Dashboard依賴

        在 pom.xml 文件中引入Hystrix-Dashboard依賴:
        ??
        ??
        ???org.springframework.cloud
        ???spring-cloud-starter-netflix-hystrix-dashboard
        ??

        修改啟動(dòng)類

        在MessageCenterApplication啟動(dòng)類上增加@EnableHystrixDashboard注解:
        @EnableFeignClients
        @SpringCloudApplication
        @EnableHystrixDashboard
        public?class?MessageCenterApplication?{
        ?
        ?public?static?void?main(String[]?args)?{
        ??new?SpringApplicationBuilder(MessageCenterApplication.class).web(WebApplicationType.SERVLET).run(args);
        ?}
        ?
        }

        儀表盤界面

        啟動(dòng)應(yīng)用,訪問 http://localhost:8781/hystrix ,打開Hystrix-Dashboard監(jiān)控首頁。
        在這里配置好需要監(jiān)控的Hystrix流地址 http://localhost:8781/actuator/hystrix.stream ,開始監(jiān)控。

        參考文章

        https://github.com/netflix/hystrix/wiki?
        https://github.com/netflix/hystrix?
        https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html

        推薦閱讀:

        【120期】面試官:談?wù)勈裁词俏⒎?wù)?

        【119期】談?wù)勗陧?xiàng)目中,如何應(yīng)對(duì)高并發(fā)流量

        【118期】面試官:你真的清楚 i = i++和 i = ++i 的區(qū)別嗎?

        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

        微信掃描二維碼,關(guān)注我的公眾號(hào)

        朕已閱?

        瀏覽 46
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            午夜福利成人一区二区三区免费 | 麻麻丰满白嫩双乳呻吟 | 一本一道无码中文字幕精品热 | 婷婷久久综合久色综 | 亚洲乱伦视频 | 久久久久女人精品毛片九一韩国 | 欧美free交性厨房 | 小妾成泄欲工具h | 欧美久久久久久久久久久 | 丰满少妇叫我吸她大乳 |