亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解Spring Cloud Hystrix斷路器實現容錯和降級

2024-07-14 08:40:37
字體:
來源:轉載
供稿:網友

簡介

Spring cloud提供了Hystrix容錯庫用以在服務不可用時,對配置了斷路器的方法實行降級策略,臨時調用備用方法。這篇文章將創建一個產品微服務,注冊到eureka服務注冊中心,然后我們使用web客戶端訪問/products API來獲取產品列表,當產品服務故障時,則調用本地備用方法,以降級但正常提供服務。

基礎環境

  1. JDK 1.8
  2. Maven 3.3.9
  3. IntelliJ 2018.1

Git:項目源碼

添加產品服務

在intelliJ中創建一個新的maven項目,使用如下配置

  1. groupId: cn.zxuqian
  2. artifactId: productService

然后在pom.xml中添加如下代碼:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>cn.zxuqian</groupId>  <artifactId>productService</artifactId>  <version>1.0-SNAPSHOT</version>  <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.0.1.RELEASE</version>    <relativePath/>  </parent>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <java.version>1.8</java.version>  </properties>  <dependencies>    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-config</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-test</artifactId>      <scope>test</scope>    </dependency>  </dependencies>  <dependencyManagement>    <dependencies>      <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-dependencies</artifactId>        <version>Finchley.M9</version>        <type>pom</type>        <scope>import</scope>      </dependency>    </dependencies>  </dependencyManagement>  <build>    <plugins>      <plugin>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-maven-plugin</artifactId>      </plugin>    </plugins>  </build>  <repositories>    <repository>      <id>spring-milestones</id>      <name>Spring Milestones</name>      <url>https://repo.spring.io/libs-milestone</url>      <snapshots>        <enabled>false</enabled>      </snapshots>    </repository>  </repositories></project>

我們繼續使用了spring-cloud-starter-netflix-eureka-client以使產品服務自動注冊到eureka服務中。然后還使用了spring-cloud-starter-config讀取配置服務中心的配置文件。這個項目只是一個簡單的spring web項目。

在src/main/resources下創建bootstrap.yml文件,添加如下內容:

spring: application:  name: product-service cloud:  config:   uri: http://localhost:8888

在配置中心的git倉庫中創建product-service.yml文件 添加如下配置并提交:

server: port: 8081

此配置指定了產品服務的端口為8081。接著創建Application類,添加如下代碼:

package cn.zxuqian;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class Application {  public static void main(String[] args) {    SpringApplication.run(Application.class, args);  }}

@EnableDiscoveryClient注解將指示spring cloud自動把本服務注冊到eureka。最后創建cn.zxuqian.controllers.ProductController控制器,提供/products API,返回示例數據:

package cn.zxuqian.controllers;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController {  @RequestMapping("/products")  public String productList() {    return "外套,夾克,毛衣,T恤";  }}

配置Web客戶端

打開我們之前創建的web項目,在pom.xml中新添Hystrix依賴:

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

然后更新Application類的代碼:

package cn.zxuqian;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@EnableCircuitBreaker@EnableDiscoveryClient@SpringBootApplicationpublic class Application {  public static void main(String[] args) {    SpringApplication.run(Application.class, args);  }  @Bean  public RestTemplate rest(RestTemplateBuilder builder) {    return builder.build();  }}

這里使用@EnableCircuitBreaker來開啟斷路器功能,然后還添加了一個rest方法并使用@Bean注解。這部分屬于Spring依賴注入功能,使用@Bean標記的方法將告訴如何初始化此類對象,比如本例中就是使用RestTemplateBuilder來創建一個RestTemplate的對象,這個稍后在使用斷路器的service中用到。

創建cn.zxuqian.service.ProductService類,并添加如下代碼:

package cn.zxuqian.services;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.List;@Servicepublic class ProductService {  private final RestTemplate restTemplate;  @Autowired  private DiscoveryClient discoveryClient;  public ProductService(RestTemplate restTemplate) {    this.restTemplate = restTemplate;  }  @HystrixCommand(fallbackMethod = "backupProductList")  public String productList() {    List<ServiceInstance> instances = this.discoveryClient.getInstances("product-service");    if(instances != null && instances.size() > 0) {      return this.restTemplate.getForObject(instances.get(0).getUri() + "/products", String.class);    }    return "";  }  public String backupProductList() {    return "夾克,毛衣";  }}

之所以要創建一個Service類,是因為Hystrix只能在標記為@Service或@Component的類中使用,這樣才能夠正常使用Spring Context所提供的API。這個以后深入Spring時再作說明。

使用@HystrixCommand注解后,Hystrix將監控被注解的方法即productList(底層使用proxy包裝此方法以此實現監控),一旦此方法的錯誤累積到一定門檻的時候,就會啟動斷路器,后續所有調用productList方法的請求都會失敗,而會臨時調用fallbackMethod指定的方法backupProductList(),然后當服務恢復正常時,斷路器就會關閉。

我們還在此類中用了DiscoveryClient用以尋找產品服務的uri地址,使用產品服務的spring.application.name配置項的值,即product-service作為serviceID傳給discoveryClient.getInstances()方法,然后會返回一個list,因為目前我們只有一個產品服務啟動著,所以只需要取第一個實例的uri地址即可。

然后我們使用RestTemplate來訪問產品服務的api,注意這里使用了Spring的構造方法注入,即之前我們用@Bean注解的方法會被用來初始化restTemplate變量,不需我們手動初始化。RestTemplate類提供了getForObject()方法來訪問其它Rest API并把結果包裝成對象的形式,第一個參數是要訪問的api的uri地址,第二參數為獲取的結果的類型,這里我們返回的是String,所以傳給他String.class。

backupProductList()方法返回了降級后的產品列表信息。

最后創建一個控制器cn.zxuqian.controllers.ProductController并添加如下代碼:

package cn.zxuqian.controllers;import cn.zxuqian.services.ProductService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController {  @Autowired  private ProductService productService;  @RequestMapping("/products")  public String productList() {    return productService.productList();  }}

 這里使用ProductService為/products路徑提供數據。

測試

首先,我們使用spring-boot:run插件啟動配置中心服務,config-server,然后啟動eureka-server,再啟動product-service,最后啟動web客戶端,稍等片刻待eureka服務注冊成功之后訪問http://localhost:8080/products,正常的情況下會得到外套,夾克,毛衣,T恤結果,然后我們關閉product-service,之后再訪問同樣的路徑,會得到降級后的結果:夾克,毛衣

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美xxxx视频在线观看| 欧美一级高清免费| 成人免费在线网址| 久久夜色精品国产亚洲aⅴ| 久久亚洲精品小早川怜子66| 7777免费精品视频| 国产福利视频一区二区| 色妞欧美日韩在线| 欧美在线观看网址综合| 欧美专区福利在线| 国产一区二区三区三区在线观看| 性日韩欧美在线视频| 欧美午夜精品久久久久久久| 国外成人在线播放| 日韩专区在线播放| 中文综合在线观看| 97成人精品区在线播放| 久久久久久高潮国产精品视| 俺也去精品视频在线观看| 成人精品福利视频| 欧美日韩亚洲天堂| 欧美精品在线观看| 亚洲xxx视频| 97精品一区二区视频在线观看| 精品视频中文字幕| 亚洲精品视频免费在线观看| 色哟哟亚洲精品一区二区| 国产一区二区在线免费视频| 亚洲人成在线观看网站高清| 亚洲肉体裸体xxxx137| 国产精品久久久久久av| 日韩福利伦理影院免费| 精品国产一区二区三区四区在线观看| 中文字幕国产亚洲2019| 亚洲国产99精品国自产| 久久久亚洲国产| 国产成人avxxxxx在线看| 久久香蕉频线观| 国产91ⅴ在线精品免费观看| 成人高h视频在线| 日韩欧美主播在线| 欧美大片va欧美在线播放| 国产精品一区二区久久久| 国产成人精品免高潮费视频| 国产精品嫩草视频| 最近2019中文免费高清视频观看www99| 伊人亚洲福利一区二区三区| 一本大道亚洲视频| 中文欧美在线视频| 最近2019年手机中文字幕| 亚洲一区二区久久| 欧美中文字幕视频在线观看| 欧美另类在线观看| 日韩国产欧美区| 97在线看免费观看视频在线观看| 亚洲尤物视频网| 久久天天躁狠狠躁夜夜躁2014| 久久中文精品视频| 欧美激情视频一区二区三区不卡| 日韩av免费网站| 亚洲成人999| 亚洲精品国产精品国自产观看浪潮| 91av在线免费观看视频| 亚洲国产精品字幕| 91精品在线播放| 国产日韩欧美自拍| 国产精品69精品一区二区三区| 国产精品久久综合av爱欲tv| 九九九久久国产免费| 91在线视频导航| 伊人伊成久久人综合网站| 日韩在线视频中文字幕| 国产一区二区免费| 亚洲国产成人精品女人久久久| 黄色一区二区在线| 久久影院免费观看| 欧美野外wwwxxx| 国产精品男人的天堂| 亚洲奶大毛多的老太婆| 欧美精品18videosex性欧美| 国产一区二区三区欧美| 91av免费观看91av精品在线| 亚洲精品美女久久久久| 国内精品视频久久| 久久这里有精品| 中文字幕欧美日韩精品| 亚洲欧美日韩综合| 日韩在线视频二区| 久久综合五月天| 亚洲一二三在线| 亚洲国产天堂久久国产91| 日韩精品在线视频观看| 亚洲男人的天堂在线播放| 38少妇精品导航| 欧美日韩亚洲一区二区| 欧美成人免费一级人片100| 亚洲人午夜精品免费| 日韩av在线网址| 97成人超碰免| 97精品一区二区三区| 日韩高清av一区二区三区| 亚洲老板91色精品久久| 大伊人狠狠躁夜夜躁av一区| 成人黄色av免费在线观看| 91精品国产综合久久久久久蜜臀| 成人国产精品一区| 俺去亚洲欧洲欧美日韩| 日韩成人网免费视频| 日韩av在线资源| 亚洲福利视频久久| 日韩av中文字幕在线播放| 久久99国产精品久久久久久久久| 久久频这里精品99香蕉| 国产精品高潮呻吟久久av野狼| 97视频在线免费观看| 大荫蒂欧美视频另类xxxx| 亚洲精品资源在线| 97精品免费视频| 亚洲天堂精品在线| 国产福利精品视频| 国产精品视频一区二区高潮| 国产日韩av在线| 777国产偷窥盗摄精品视频| 韩国视频理论视频久久| 午夜精品视频在线| 亚洲电影在线观看| y97精品国产97久久久久久| 国内精品伊人久久| 中文综合在线观看| 亚洲第一精品夜夜躁人人爽| 国模精品系列视频| 大伊人狠狠躁夜夜躁av一区| 午夜精品一区二区三区在线视| 国产精品白嫩美女在线观看| 欧美黑人xxx| 久久久亚洲精品视频| 国产精品高清在线| 国产精品美女久久| 国产精品视频男人的天堂| 欧美最猛性xxxxx(亚洲精品)| 国产99久久精品一区二区| 中文字幕日韩欧美精品在线观看| 亚洲天堂av网| 亚洲黄色av网站| 国产精品极品在线| 欧美人与物videos| 久热爱精品视频线路一| 国产精品久久久久久久久久三级| 精品无码久久久久久国产| 96精品久久久久中文字幕| 亚洲色图综合网| 日韩中文字幕免费视频| 91精品在线看| 这里只有视频精品| 奇米一区二区三区四区久久| 欧美福利小视频| 午夜剧场成人观在线视频免费观看| 国产日韩中文字幕| 免费97视频在线精品国自产拍| 欧美麻豆久久久久久中文| 日韩乱码在线视频| 欧美国产亚洲精品久久久8v| 91精品在线观看视频| 91麻豆国产语对白在线观看|