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

SpringCloud hystrix服務(wù)降級(jí)學(xué)習(xí)筆記

 更新時(shí)間:2022年10月31日 10:00:18   作者:游坦之  
什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁(yè)面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作

一、Hystrix簡(jiǎn)介

1、Hystrix是什么

 流量高峰時(shí),一個(gè)單節(jié)點(diǎn)的宕機(jī)或延遲,會(huì)迅速導(dǎo)致所有服務(wù)負(fù)載達(dá)到飽和。應(yīng)用中任何一個(gè)可能通過網(wǎng)絡(luò)訪問其他服務(wù)的節(jié)點(diǎn),都有可能成為造成潛在故障的來源。更嚴(yán)重的是,還可能導(dǎo)致服務(wù)之間的延遲增加,占用隊(duì)列、線程等系統(tǒng)資源,從而導(dǎo)致多系統(tǒng)之間的級(jí)聯(lián)故障。

簡(jiǎn)單的說,當(dāng)服務(wù)器依次請(qǐng)求A->P->H->I時(shí),如果其中一個(gè)發(fā)生了故障,都有可能導(dǎo)致整個(gè)流程失敗,或者降低整個(gè)流程的效率。

更嚴(yán)重的是,當(dāng)網(wǎng)絡(luò)請(qǐng)求是通過第三方的一個(gè)黑盒客戶端來發(fā)起時(shí),實(shí)現(xiàn)細(xì)節(jié)都被隱藏起來了,而且還可能頻繁變動(dòng),這樣發(fā)生問題時(shí)就很難監(jiān)控和改動(dòng)。如果這個(gè)第三方還是通過傳遞依賴的,主應(yīng)用程序中根本沒有顯示地寫出調(diào)用的代碼,那就更難了。

網(wǎng)絡(luò)連接失敗或者有延遲,服務(wù)將會(huì)產(chǎn)生故障或者響應(yīng)變慢,最終反應(yīng)成為一個(gè) bug。

所有上述表現(xiàn)出來的故障或延遲,都需要一套管理機(jī)制,將節(jié)點(diǎn)變得相對(duì)獨(dú)立,這樣任何一個(gè)單節(jié)點(diǎn)故障,都至少不會(huì)拖垮整個(gè)系統(tǒng)的可用性。

  所以Hystrix就是為了解決請(qǐng)求序列中請(qǐng)求出現(xiàn)問題的情況,核心原則就是丟車保帥,如果一個(gè)請(qǐng)求出現(xiàn)問題,常見的有兩種方案:

一種是按照原來的方案再來一次,這是有成功的可能的。

一種是只是反饋給用戶這個(gè)請(qǐng)求有問題,出故障的請(qǐng)求不會(huì)影響到序列中其他的請(qǐng)求。

2、Hystrix能干什么

1、服務(wù)熔斷

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

3、數(shù)據(jù)監(jiān)控

二、服務(wù)熔斷

1、服務(wù)熔斷簡(jiǎn)介

熔斷機(jī)制是賭贏雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。

當(dāng)扇出鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí),會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的響應(yīng)信息。檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路。在SpringCloud框架里熔斷機(jī)制通過Hystrix實(shí)現(xiàn)。Hystrix會(huì)監(jiān)控微服務(wù)間調(diào)用的狀況,當(dāng)失敗的調(diào)用到一定閥值缺省是5秒內(nèi)20次調(diào)用失敗,就會(huì)啟動(dòng)熔斷機(jī)制。熔斷機(jī)制的注解是:@HystrixCommand。

服務(wù)熔斷解決如下問題:

  • 當(dāng)所依賴的對(duì)象不穩(wěn)定時(shí),能夠起到快速失敗的目的;
  • 快速失敗后,能夠根據(jù)一定的算法動(dòng)態(tài)試探所依賴對(duì)象是否恢復(fù)。

2、配置pom.xml

首先新建一個(gè)module,和springcloud-provider-dept-8001一模一樣(名字除外),修改一下application.yaml,一個(gè)是端口(也可以不改,最好修改一下,避免端口沖突),另一個(gè)是instance-id,這樣在尤里卡中可以分辨出來。

需要引入hystrix的依賴,和feign一樣,只是把feign換成hystrix

 <!--引入hystrix依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

3、配置application.yaml

和springcloud-provider-dept-8001一樣,只需要修改一下端口號(hào)和instance-id

#端口號(hào)
server:
  port: 8001

#配置數(shù)據(jù)庫(kù)
spring:
  datasource:
    url: jdbc:mysql:///dp80?serverTimezone=UTC
    username: root
    password: 200201203332
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: springcloud-provider-dept
debug: true

#配置Eureka的配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: springcloud-provider-8001

info:  #autuator監(jiān)控信息
  app.name: rainhey-springcloud
  company.name: www.rainhey.com

4、修改Controller

@HystrixCommand注解

用來處理服務(wù)熔斷和服務(wù)降級(jí),屬性和方法可以點(diǎn)進(jìn)去查看。

@HystrixCommand注解通常放到方法之上,當(dāng)這個(gè)方法拋出異常的時(shí)候,系統(tǒng)不會(huì)立刻停止處理異常,而是先找Hystrix里面綁定的備用方法,然后去執(zhí)行備用方法。

那么@HystrixCommand如何綁定備用方法呢?見下圖

@HystrixCommand注釋通過內(nèi)部屬性fallbackMethod綁定方法,具體步驟是@HystrixCommand(fallbackMethod = “備用方法名”)

package com.you.Controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.you.mapper.DeptMapper;
import com.you.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@ResponseBody
@Component
public class DeptController {
    @Autowired
    DeptMapper deptMapper;
    @GetMapping("/dept/aDept/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGetDeptOfId")
    public Dept getDeptOfId(@PathVariable("id") Long id)
    {
        System.out.println("進(jìn)來了,id是:"+id);
        Dept dept = deptMapper.finaDeptOfId(id);
        if(dept==null)
        {
            throw new RuntimeException("id=>"+id+"不存在該用戶,或者信息沒有找到!");
        }
        return dept;
    }
    /* 備用方案 */
    public Dept hystrixGetDeptOfId(@PathVariable("id") Long id)
    {
            Dept dept = new Dept();
            dept.setDeptno(id);
            dept.setDeptname("id=>"+id+"不存在該用戶,或信息沒有找到!@Hystrix");
            dept.setDb_source("no info in datebase");
            System.out.println("dept的值是:"+dept);
            return dept;
    }
}

5、修改啟動(dòng)類

從前面的4篇文章里我們了解到,每次用到新的技術(shù),啟動(dòng)類里都會(huì)增加一個(gè)新的注解,那么?Hystrix的注解是什么呢?@EnableCircuitBreaker,只要把這個(gè)注解加在主啟動(dòng)類上,那么主啟動(dòng)類就可以處理服務(wù)熔斷了。

6、效果圖

不開熔斷機(jī)制

開了熔斷機(jī)制

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

1、什么是服務(wù)降級(jí)

服務(wù)降級(jí)是指 當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁(yè)面有策略的不處理,或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心業(yè)務(wù)正常運(yùn)作或高效運(yùn)作。說白了,就是盡可能的把系統(tǒng)資源讓給優(yōu)先級(jí)高的服務(wù)。

例如假設(shè)有三個(gè)服務(wù)器ABC,在某一段時(shí)間,訪問A的用戶特別多,導(dǎo)致A服務(wù)器快要崩潰了,這時(shí)候訪問B、C的用戶很少,那么我暫時(shí)先把B、C停掉,用來處理A。

服務(wù)降級(jí)主要用于什么場(chǎng)景呢?當(dāng)整個(gè)微服務(wù)架構(gòu)整體的負(fù)載超出了預(yù)設(shè)的上限閾值或即將到來的流量預(yù)計(jì)將會(huì)超過預(yù)設(shè)的閾值時(shí),為了保證重要或基本的服務(wù)能正常運(yùn)行,可以將一些 不重要 或 不緊急 的服務(wù)或任務(wù)進(jìn)行服務(wù)的 延遲使用 或 暫停使用。

降級(jí)的方式可以根據(jù)業(yè)務(wù)來,可以延遲服務(wù),比如延遲給用戶增加積分,只是放到一個(gè)緩存中,等服務(wù)平穩(wěn)之后再執(zhí)行 ;或者在粒度范圍內(nèi)關(guān)閉服務(wù),比如關(guān)閉相關(guān)文章的推薦。

2、DeptClientFailBackFactory類

在springcloud-api模塊下的service包中新建降級(jí)配置,DeptClientServiceFallBackFactory.java。同時(shí)實(shí)現(xiàn)其方法,他的返回類型就是我們寫服務(wù)的接口。

package com.you.service;
import com.you.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
/*?。?!降級(jí)?。。?/
@Component  //注冊(cè)到容器里面去
public class DeptClientFailBackFactory implements FallbackFactory {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public Dept getDeptOfId(Long id) {
                Dept dept = new Dept();
                dept.setDeptno(id);
                dept.setDeptname("id=>"+id+"沒有對(duì)應(yīng)的信息,客戶端提供了降級(jí)的信息,這個(gè)服務(wù)現(xiàn)在被關(guān)閉了!");
                dept.setDb_source("沒有數(shù)據(jù)");
                return dept;
            }
        };
    }
}

3、添加注解

在DeptClientService中指定降級(jí)配置:DeptClientServiceFallBackFactory

package com.you.service;
import com.you.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Component
/*@FeignClient:value的值即為 服務(wù)的名字,fallbackFactory的值即為 實(shí)現(xiàn)FallbackFactory類的名字 */
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientFailBackFactory.class)
public interface DeptClientService {
    @GetMapping("/dept/aDept/{id}")
    public Dept getDeptOfId(@PathVariable("id") Long id);
}

4、修改application.yaml

為的是開啟服務(wù),但切記此處修改的application是springcloud-consumer-dept-feign下的application.yaml,添加如下代碼

#開啟降級(jí) feign-hystrix
feign:
  hystrix:
    enabled: true

5、效果圖

依次啟動(dòng)springcloud-eureka-7001、springcloud-consumer-dept-feign、springcloud-provider-dept-8001,訪問服務(wù)

正確打開服務(wù)

現(xiàn)在,停掉這個(gè)springcloud-provider-dept-8001,模擬服務(wù)降級(jí)中暫時(shí)關(guān)閉的一些端口。

8001端口的服務(wù)被停掉了,這時(shí)候刷新頁(yè)面。

端口是可以訪問的,只是顯示了我們?cè)O(shè)計(jì)的文字

四、DashBorder

1、新建一個(gè)module

新建一個(gè)名為springcloud-consumer-hystrix-dashborder的module

2、pom.xml配置

將springcloud-provider-dept-8001的依賴如復(fù)制過來,并且增加上dashborder的依賴

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.you</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--引入Eureka的依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入DashBorder-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入hystrix依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
    </dependencies>

3、配置application.yml

只需要配置端口號(hào)

server:
  port: 9001

4、配置啟動(dòng)類

創(chuàng)建一個(gè)名為DeptConsumerDashBorder_9001的JAVA類

package com.you;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumerDashBorder_9001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerDashBorder_9001.class,args);
    }
}

5、添加被監(jiān)控的類

給springcloud-provider-dept-hystrix-8001模塊下的主啟動(dòng)類添加如下代碼,添加監(jiān)控

package com.you;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
/*對(duì)熔斷的支持*/
@EnableCircuitBreaker
public class DeptApplication_Hystrix_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptApplication_Hystrix_8001.class,args);
    }
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        //訪問該頁(yè)面就是監(jiān)控頁(yè)面
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }
}

6、效果圖

啟動(dòng)springcloud-eureka-7001、springcloud-consumer-hystrix-dashborder、springcloud-provider-dept-hystrix-8001

在7001尤里卡界面,看到springcloud-provider-dept-hystrix-8001被注冊(cè)進(jìn)來。

訪問8011,輸入http://localhost:8011/dept/aDept/1(我設(shè)置的端口號(hào)是8011),可以看到被成功訪問。

訪問http://localhost:8011/actuator/hystrix.stream,看到如下效果

訪問9001,地址輸入http://localhost:9001/hystrix,看到如下界面

將地址填入,http://localhost:8011/actuator/hystrix.stream

刷新這個(gè)界面,下面的圖像會(huì)隨之變化

到此這篇關(guān)于SpringCloud hystrix服務(wù)降級(jí)學(xué)習(xí)筆記的文章就介紹到這了,更多相關(guān)SpringCloud hystrix內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot整合camunda+mysql的集成流程分析

    Springboot整合camunda+mysql的集成流程分析

    本文介紹基于mysql數(shù)據(jù)庫(kù),如何實(shí)現(xiàn)camunda與springboot的集成,如何實(shí)現(xiàn)基于springboot運(yùn)行camunda開源流程引擎,本文分步驟圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • Java Spring詳解如何配置數(shù)據(jù)源注解開發(fā)以及整合Junit

    Java Spring詳解如何配置數(shù)據(jù)源注解開發(fā)以及整合Junit

    Spring 是目前主流的 Java Web 開發(fā)框架,是 Java 世界最為成功的框架。該框架是一個(gè)輕量級(jí)的開源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit
    2021-10-10
  • Spring如何消除代碼中的if-else/switch-case

    Spring如何消除代碼中的if-else/switch-case

    這篇文章主要給大家介紹了關(guān)于Spring如何消除代碼中if-else/switch-case的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring AI 入門學(xué)習(xí)指南

    Spring AI 入門學(xué)習(xí)指南

    本文介紹了如何使用SpringAI和Ollama進(jìn)行AI開發(fā),包括如何配置和使用聊天、圖像、語音轉(zhuǎn)文字和文字轉(zhuǎn)語音模型,以及如何在Java項(xiàng)目中集成Ollama模型,感興趣的朋友一起看看吧
    2024-11-11
  • Spring Data Envers支持有條件變動(dòng)紀(jì)錄的保存和查詢的方法

    Spring Data Envers支持有條件變動(dòng)紀(jì)錄的保存和查詢的方法

    通過spring-data-envers可以很容易的實(shí)現(xiàn)數(shù)據(jù)變動(dòng)紀(jì)錄的保存和查詢,本文介紹支持有條件變動(dòng)紀(jì)錄的保存和查詢的方法,通過spring-data-envers很容易的實(shí)現(xiàn)變動(dòng)紀(jì)錄的保存和查詢,只需要增加幾個(gè)注解就可以,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java方法遞歸調(diào)用實(shí)例解析

    Java方法遞歸調(diào)用實(shí)例解析

    這篇文章主要介紹了Java方法遞歸調(diào)用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java多線程編程之從線程返回?cái)?shù)據(jù)的兩種方法

    java多線程編程之從線程返回?cái)?shù)據(jù)的兩種方法

    從線程中返回?cái)?shù)據(jù)和向線程傳遞數(shù)據(jù)類似。也可以通過類成員以及回調(diào)函數(shù)來返回?cái)?shù)據(jù)。但類成員在返回?cái)?shù)據(jù)和傳遞數(shù)據(jù)時(shí)有一些區(qū)別,下面讓我們來看看它們區(qū)別在哪
    2014-01-01
  • Java實(shí)現(xiàn)加鹽算法的兩種方法

    Java實(shí)現(xiàn)加鹽算法的兩種方法

    數(shù)據(jù)安全是一個(gè)重要的問題,本文主要介紹了Java實(shí)現(xiàn)加鹽算法的兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法

    Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法

    很多時(shí)候在javaweb項(xiàng)目中我們需要用到Socket通信來實(shí)現(xiàn)功能,在web中使用Socket我們需要建立一個(gè)監(jiān)聽程序,在程序啟動(dòng)時(shí),啟動(dòng)socket監(jiān)聽。接下來通過本文給大家介紹Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法,感興趣的朋友一起學(xué)習(xí)
    2016-04-04
  • 詳解Android系統(tǒng)中的root權(quán)限獲得原理

    詳解Android系統(tǒng)中的root權(quán)限獲得原理

    這篇文章主要介紹了詳解Android系統(tǒng)中的Root權(quán)限獲得原理,安卓基于Linux,所以原理也相當(dāng)于Linux中的root用戶,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

宁化县| 汉寿县| 卢龙县| 沂水县| 增城市| 南皮县| 剑川县| 临江市| 万全县| 邵阳市| 平定县| 丹凤县| 花莲市| 上高县| 乃东县| 肥乡县| 来安县| 道真| 宜都市| 尼木县| 泾阳县| 林芝县| 富顺县| 宁夏| 云浮市| 宝丰县| 格尔木市| 华容县| 新化县| 称多县| 通城县| 晋宁县| 巴楚县| 广宁县| 旌德县| 广水市| 大足县| 华宁县| 商河县| 曲阜市| 凤庆县|