<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 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ù)熔斷的作用類似于我們家用的保險絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時的情況時,為了防止整個系統(tǒng)出現(xiàn)雪崩,暫時停止對該服務(wù)的調(diào)用。

          服務(wù)降級

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

          熔斷VS降級

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

          Hystrix簡介

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

          ??

          ?

          修改啟動類

          在MessageCenterApplication啟動類上增加@EnableCircuitBreaker注解:
          @EnableFeignClients
          @EnableCircuitBreaker
          public class MessageCenterApplication {

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

          }
          這里我們在啟動類中又增加了@EnableCircuitBreaker注解,用來開啟斷路器功能。如果你覺得啟動類上的注解個數(shù)有點(diǎn)多的話,可以使用一個@SpringCloudApplication 注解來代替@SpringBootApplication(或者@EnableEurekaServer)、@EnableDiscoveryClient、@EnableCircuitBreaker這三個注解。
          @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 豬年大吉,'豬'事如意!";
          ?}
          先啟動Eureka,再啟動一個8771端口的message-service服務(wù),最后啟動message-center。待啟動完成之后,Eureka注冊中心實(shí)例注冊信息如下:
          此時,訪問 http://localhost:8781/api/v1/center/msg/get ,返回如下結(jié)果表明服務(wù)調(diào)用成功:
          然后,停掉message-service服務(wù),再次請求 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指定一個自定義的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容器中必須存在一個該類型的有效Bean。在這里,我們使用@Component注解將其注入到Spring容器中。
          @Component
          public?class?MessageServiceFallback?implements?MessageServiceClient?{
          ?
          ?@Override
          ?public?String?getMsg()?{
          ??System.out.println("調(diào)用消息接口失敗,對其進(jìn)行降級處理!");
          ??return?"消息接口繁忙,請稍后重試!";
          ?}
          ?
          }

          修改配置

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

          監(jiān)控Hystrix

          啟用健康監(jiān)控

          Actuator是Springboot提供的用來對應(yīng)用系統(tǒng)進(jìn)行自省和監(jiān)控的功能模塊,借助于Actuator開發(fā)者可以很方便地對應(yīng)用系統(tǒng)某些監(jiān)控指標(biāo)進(jìn)行查看、統(tǒng)計(jì)等。
          若要使用Actuator對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一個最大的好處就是它會為我們自動收集每一個HystrixCommand的信息,并利用Hystrix-Dashboard通過一種高效的方式對每一個斷路器的健康狀態(tài)進(jìn)行展示。
          值得注意的是,在使用HystrixCommand對RibbonClient進(jìn)行包裝的時候,你需要確保你配置的Hystrix超時時間要比Ribbon的超時時間長,包括由它們引起的重試時間,舉個例子:如果你的Ribbon連接超時時間是1秒,并且Ribbon會連續(xù)重試請求3次,那么你的Hystrix連接超時時間需要配置成稍大于3秒。

          引入Hystrix-Dashboard依賴

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

          修改啟動類

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

          儀表盤界面

          啟動應(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)對高并發(fā)流量

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

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

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

          朕已閱?

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

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成年人性爱网站 | 91 无码 国产 | 欧洲精品一区二区三区 | 九九99免费视频小说热线 | 中日韩A片 |