日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【微服务架构】SpringCloud之断路器(hystrix)

發布時間:2023/11/28 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【微服务架构】SpringCloud之断路器(hystrix) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說在前面

在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。為了保證其高可用,單個服務通常會集群部署。由于網絡原因或者自身的原因,服務并不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重后果,這就是服務故障的“雪崩”效應。

解決或緩解服務雪崩的方案

一般情況對于服務依賴的保護主要有3中解決方案:
(1)熔斷模式:這種模式主要是參考電路熔斷,如果一條線路電壓過高,保險絲會熔斷,防止火災。放到我們的系統中,如果某個目標服務調用慢或者有大量超時,此時,熔斷該服務的調用,對于后續調用請求,不在繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則恢復調用。
(2)隔離模式:這種模式就像對系統請求按類型劃分成一個個小島的一樣,當某個小島被火少光了,不會影響到其他的小島。例如可以對不同類型的請求使用線程池來資源隔離,每種類型的請求互不影響,如果一種類型的請求線程資源耗盡,則對后續的該類型請求直接返回,不再調用后續資源。這種模式使用場景非常多,例如將一個服務拆開,對于重要的服務使用單獨服務器來部署,再或者公司最近推廣的多中心。
(3)限流模式:上述的熔斷模式和隔離模式都屬于出錯后的容錯處理機制,而限流模式則可以稱為預防模式。限流模式主要是提前對各個類型的請求設置最高的QPS閾值,若高于設置的閾值則對該請求直接返回,不再調用后續資源。這種模式不能解決服務依賴的問題,只能解決系統整體資源分配問題,因為沒有被限流的請求依然有可能造成雪崩效應。

Netflix提供了一個叫Hystrix的類庫,它實現了斷路器模式。在微服務架構中,通常一個微服務會調用多個其他的微服務。一個相對低層級的服務失敗可能造成上層應用的級聯失敗,服務訪問量越大失敗率越高。當斷路打開的時候,這個調用就被終止了。打開的斷路可以阻止級聯失敗。

啟動EureKaserver工程(注冊中心)和SpringCloud-Service工程(服務生產者)

可以參考:https://blog.csdn.net/u012081441/article/details/80708060

一、Feign中使用斷路器

創建項目SpringCloud-Feign

pom.xml文件

<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>com.fit</groupId><artifactId>SpringCloud-Feign</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RC1</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/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
</project>

application.yml文件

eureka:client:serviceUrl:defaultZone: http://localhost:8888/eureka/
server:port: 8765
spring:application:name: SpringCloud-Feign
feign:hystrix:enabled: true
hystrix:command: default: execution: isolation:thread: timeoutInMilliseconds: 1000

service層

@FeignClient(value = "SpringCloud-Service",fallback = UserServiceErrorImpl.class)
public interface UserService {  @RequestMapping(value ="getUser")public Map<String,Object> getUser();
}

UserServiceErrorImpl.java 實現UserService 接口,并注入到Ioc容器中,代碼如下:

@Component
public class UserServiceErrorImpl implements UserService {public Map<String, Object> getUser() {// TODO Auto-generated method stubMap<String, Object> errorMap = new HashMap<String, Object>();errorMap.put("code", "500");errorMap.put("message", "后臺異常");return errorMap;}
}

FeignApp.java文件

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignApp {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSpringApplication.run(FeignApp.class, args);}
}

驗證斷路器
啟動SpringCloud-Feign項目,停掉SpringCloud-Service,訪問http://localhost:8765/getUser,返回如下圖,說明斷路器起作用了:

二、在ribbon使用斷路器

創建項目SpringCloud-Consumer

pom.xml文件如下:

<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>com.fit</groupId><artifactId>SpringCloud-Consumer</artifactId><version>0.0.1-SNAPSHOT</version><!-- SpringBoot父類依賴引用 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath /></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RC1</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/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

application.yml

eureka:client:serviceUrl:defaultZone: http://localhost:8888/eureka/
server:port: 8764
spring:application:name: SpringCloud-Consumer
hystrix:command: default: execution: isolation:thread: timeoutInMilliseconds: 1000

service層

@Service
public class UserService {@Autowiredprivate RestTemplate restTemplate;@HystrixCommand(fallbackMethod = "getServiceUserError")public Map<String,Object> getServiceUser(){@SuppressWarnings("unchecked")Map<String,Object> user = restTemplate.getForObject("http://SpringCloud-Service/getUser", Map.class);return user;}public Map<String,Object> getServiceUserError(){// TODO Auto-generated method stubMap<String, Object> errorMap = new HashMap<String, Object>();errorMap.put("code", "500");errorMap.put("message", "后臺異常");return errorMap;}
}

controller層

@Controller
public class ConsumerUserController {@Resourceprivate UserService userService;@ResponseBody@RequestMapping(value ="getServiceUser")public Map<String,Object> getServiceUser(){Map<String,Object> user = userService.getServiceUser();return user;}
}

SpringCloudConsumerApp.java

@EnableEurekaClient
@EnableHystrix
@SpringBootApplication
public class SpringCloudConsumerApp {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSpringApplication.run(SpringCloudConsumerApp.class, args);}@Bean@LoadBalanced // 添加負載均衡支持RestTemplate restTemplate() {return new RestTemplate();}
}

驗證斷路器
啟動SpringCloud-Consumer項目,停掉SpringCloud-Service,訪問http://localhost:8764/getServiceUser,返回如下圖,說明斷路器起作用了:

案例下載

總結

以上是生活随笔為你收集整理的【微服务架构】SpringCloud之断路器(hystrix)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。