官方文檔html
斷路器
斷路器是什麼?
以前作的,有數據服務和視圖服務,視圖服務要訪問數據服務,若是數據服務掛掉的話,那麼確定得報500,會出現一個錯誤頁面,這個讓用戶看到不合適啊,得找個東西給他糊弄一下,賣個萌、耍個賤什麼的,不行直接給他個愛的魔力轉圈圈畫面。
固然,這個不是主要的。
在微服務架構中,根據業務來拆分紅一個個的服務,服務與服務之間能夠相互調用(RPC),在Spring Cloud能夠用RestTemplate+Ribbon和Feign來調用。爲了保證其高可用,單個服務一般會集羣部署。因爲網絡緣由或者自身的緣由,服務並不能保證100%可用,若是單個服務出現問題,調用這個服務就會出現線程阻塞,此時如有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,致使服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統形成災難性的嚴重後果,這就是服務故障的「雪崩」效應。
爲了解決這個問題,業界提出了斷路器模型。
較底層的服務若是出現故障,會致使連鎖故障。當對特定的服務的調用的不可用達到一個閥值(Hystric 是5秒20次) 斷路器將會被打開。
斷路打開後,可用避免連鎖故障,fallback方法能夠直接返回一個固定值。java
改造項目
仍是改造 product-view-service-feign.web
pom.xml
添加spring-cloud-starter-netflix-hystrix 以支持斷路器。spring
<?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"> <parent> <artifactId>springcloud</artifactId> <groupId>edu.hpu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>product-view-service-feign</artifactId> <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-openfeign</artifactId> <!--對feign方式的支持--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</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-actuator</artifactId> <!--用於訪問路徑:/actuator/bus-refresh--> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> <!--用於支持RabbitMQ--> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> </dependencies> </project>
客戶端
ProductClientFeign,客戶端的註解中註解中加上fallback的指定類,表示若是訪問的 PRODUCT-DATA-SERVICE 不可用的話,就調用 ProductClientFeignHystrix 來進行反饋信息。apache
package edu.hpu.springcloud.client; import edu.hpu.springcloud.pojo.Product; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; @FeignClient(value = "PRODUCT-DATA-SERVICE",fallback = ProductClientFeignHystrix.class) public interface ProductClientFeign { @GetMapping("/products") public List<Product> listProducts(); }
ProductClientFeignHystrix類
ProductClientFeignHystrix類實現ProductClientFeign接口。服務器
package edu.hpu.springcloud.client; import edu.hpu.springcloud.pojo.Product; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component public class ProductClientFeignHystrix implements ProductClientFeign{ @Override public List<Product> listProducts() { List<Product> result=new ArrayList<>(); result.add(new Product(0,"呵呵,你還想白服務",0)); return result; } }
配置
application.yml,在配置中啓動斷路器。網絡
spring: application: name: product-view-service-feign thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html encoding: UTF-8 content-type: text/html mode: HTML5 zipkin: base-url: http://localhost:9411 feign.hystrix.enabled: true management: endpoints: web: exposure: include: "*" cors: allowed-origins: "*" allowed-methods: "*"
啓動訪問
依次啓動註冊中心、配置服務器、視圖微服務,不用啓動數據微服務。
訪問地址:http://localhost:8012/products
參考:
【1】、http://how2j.cn/k/springcloud/springcloud-hystrix/2042.html#nowhere
【2】、https://www.fangzhipeng.com/springcloud/2018/08/04/sc-f4-hystrix.html架構
本文分享 CSDN - 三分惡。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。app