Hystrixs是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败(雪崩)。

主要功能:

  • 降级
  • 熔断
  • 隔离
  • 限流

雪崩效应:

微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,比如:服务的自动扩充,熔断和限流等,随着业务的扩展,服务的数量也会随之增多,逻辑会更加复杂,一个服务的某个逻辑需要依赖多个其他服务才能完成。一但一个依赖不能提供服务很可能会产生雪崩效应,最后导致整个服务不可访问。
微服务之间进行rpc或者http调用时,我们一般都会设置调用超时失败重试等机制来确保服务的成功执行,看上去很美,如果不考虑服务的熔断和限流,就是雪崩的源头。
假设我们有两个访问量比较大的服务A和B,这两个服务分别依赖C和D,C和D服务都依赖E服务

A和B不断的调用C,D处理客户请求和返回需要的数据。当E服务不能供服务的时候,C和D的超时重试机制会被执行

由于新的调用不断的产生,会导致C和D对E服务的调用大量的积压,产生大量的调用等待和重试调用,慢慢会耗尽C和D的资源比如内存或CPU,然后也down掉。

A和B服务会重复C和D的操作,资源耗尽,然后down掉,最终整个服务都不可访问。

1.降级

类似于try catch,在出现异常或者超时或者服务不可用时返回一些默认处理方案

降级方案可在服务提供方也可在服务调用方

环境搭建:

注册中心这里选用eureka

euerka-server 

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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhangyong</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-server</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</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>${spring-cloud.version}</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></project>

application.properties

spring.application.name=eureka-server #应用名称
eureka.client.fetch-registry=false #是否从注册中心拉取其他服务注册信息
eureka.client.register-with-eureka=false #是否将自己注册到注册中心

启动类

package com.zhangyong.eurekaserver;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}

eureka客户端

consumer(服务调用方)

pom.xml(consumer依赖)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhangyong</groupId><artifactId>comsumer</artifactId><version>0.0.1-SNAPSHOT</version><name>comsumer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version></properties><dependencies><!--spring boot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- eureka-client --><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><version>2.1.1.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</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></project>

application.properties(三个服务端口分别为81、82、83)

eureka.client.service-url.defaultZone=http://localhost:8080/eureka
server.port=81
spring.application.name=consumer
feign.hystrix.enabled=true #给feign远程调用开启hytrix支持

启动类

package com.zhangyong.comsumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class ComsumerApplication {public static void main(String[] args) {SpringApplication.run(ComsumerApplication.class, args);}}

订单远程调用

package com.zhangyong.comsumer.api;import com.zhangyong.comsumer.fallback.OrderFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "xxxooo",fallback = OrderFallback.class)
public interface OrderClient {@RequestMapping("getOrderList")String getOrderList();
}

订单服务调用方降级

package com.zhangyong.comsumer.fallback;import com.zhangyong.comsumer.api.OrderClient;
import org.springframework.stereotype.Component;@Component
public class OrderFallback implements OrderClient {@Overridepublic String getOrderList() {return "订单列表降级方案";}
}

商品远程调用

package com.zhangyong.comsumer.api;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient("provider")
public interface ProductClient {@RequestMapping("getProductList/{id}")String getProductList(@PathVariable("id") String id);
}

controller

package com.zhangyong.comsumer.controller;import com.zhangyong.comsumer.api.OrderClient;
import com.zhangyong.comsumer.api.ProductClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConsumerController {@Autowiredprivate OrderClient orderClient;@Autowiredprivate ProductClient productClient;@RequestMapping("getOrderList")public String getOrderList() {return orderClient.getOrderList();}@RequestMapping("getProductList/{id}")public String getProductList(@PathVariable("id") String id) {return productClient.getProductList(id);}
}

 provider(服务提供方)

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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhangyong</groupId><artifactId>provicer</artifactId><version>0.0.1-SNAPSHOT</version><name>provicer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version></properties><dependencies><!--spring boot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- eureka-client --><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-netflix-hystrix</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</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></project>

application.properties

eureka.client.service-url.defaultZone=http://localhost:8080/eureka
server.port=82
spring.application.name=provider

启动类

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class ProvicerApplication {public static void main(String[] args) {SpringApplication.run(ProvicerApplication.class, args);}}

controller

package com.zhangyong.provicer.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@RequestMapping("getOrderList")public String getOrderList() {return "订单列表";}
}
package com.zhangyong.provicer.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {@RequestMapping("getProductList/{id}")@HystrixCommand(fallbackMethod = "getProductList_fallback")public String getProductList(@PathVariable("id") String id){if ("0".equals(id)) {int i = 1 / 0;}return "商品列表";}public String getProductList_fallback(@PathVariable("id") String id){return "商品列表降级方案";}}

这里提醒一下,为了方便,我把order降级写在了服务调用方,product降级写在了服务提供方(配置了id传0会触发异常)

看效果:

OrderClient.java中远程调用的服务名“xxxooo”是不存在的,这时候他会降级的(服务调用方降级)

ProductClient.java中 远程调用输入id为0是会降级的(服务提供方降级)

2.熔断

Hystrix熔断机制,用于微服务之间的调用,当失败情况到达预定阈值(默认5秒失败20次),会打开断路器,断路器打开时,所有请求不管成功或者失败都会执行fallback降级方案,直到服务恢复正常为止

 如图所示:当断路器打开时,每过5秒钟会呈现一个半开状态,如果失败断路器继续打开,等待下一个5秒钟的半开状态,如果是调用成功,断路器就会关闭(不需要任何操作,hystrix默认实现)

接着上面的product的测试,当我们5秒超过20次id为0的操作(降级20次),他会拒绝所有请求。

可以看到一开始id为1是可以正常获取商品列表的

当5秒连续超过20次id为0的调用,再以一次id为1调用,可以看到不管是不是正常请求同样是返回降级,这就是触发了断路器

熔断的触发条件也可以根据自己的需求进行配置

package com.zhangyong.provicer.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {@RequestMapping("getProductList/{id}")@HystrixCommand(fallbackMethod = "getProductList_fallback",commandProperties = {@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),//监控时间@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),//失败次数@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")//失败率})public String getProductList(@PathVariable("id") String id){if ("0".equals(id)) {int i = 1 / 0;}return "商品列表";}public String getProductList_fallback(@PathVariable("id") String id){return "商品列表降级方案";}}

3.隔离、限流(隔离的同时达到了限流的效果)

说隔离之前要先知道,当我们要先知道,在不使用隔离之前,我们的所有请求都是从一个线程池(springboot默认集成tomcat)中获取的(如图所示)

这样就会有个问题,当服务C不可用时,并且消耗了所有线程不归还,这样就会直接影响服务A,同时也导致B、C服务也没有可用的线程,也就时上面说的服务雪崩效应

3-1.线程池隔离

顾名思义,线程池隔离就是将多个服务单独用线程池隔离开来,每个服务分配一部分的线程数量

这样的好处就是就是即使C服务出现问题,也不至于影响其他服务 ,还有一点就是,线程池隔离是异步操作的,服务A可以主动超时,并且归还线程

3-2.信号量隔离

信号量隔离与线程池隔离区别,信号量隔离和tomcat用的是同一组线程池里的线程,就好比计数器,给指定服务分配一定的信号量,拿到对应服务信号量才能调用,没拿到信号量配置了队列的,就在队列等待,没配置的直接fallback降级,当请求返回时才会归还信号量,并且是同步的,不能主动超时,也就是说当请求返回时才能判断该请求是否超时

下面看代码实现

增加一个provider2服务

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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhangyong</groupId><artifactId>provider2</artifactId><version>0.0.1-SNAPSHOT</version><name>provider2</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version></properties><dependencies><!--spring boot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- eureka-client --><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-netflix-hystrix</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</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></project>
eureka.client.service-url.defaultZone=http://localhost:8080/eureka
server.port=81
spring.application.name=consumer
#是否开启feign对hystrix支持
feign.hystrix.enabled=false
#最大并发数
server.tomcat.max-threads=10
#接受和处理的最大连接数
server.tomcat.max-connections=10
#初始化时创建的线程数
server.tomcat.min-SpareThreads=10
#可以放到处理队列中的请求数
server.tomcat.acceptCount=10
#远程连接超时时间
ribbon.ConnectTimeout=1000
#远程访问超时时间
ribbon.ReadTimeout=5000
//线程池隔离@HystrixCommand(groupKey = "user-pool",//服务名称commandKey = "getUserList",//接口名称,默认使用方法名threadPoolKey = "user-pool",//线程池名称commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")},threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "6"),//线程池大小@HystrixProperty(name = "maxQueueSize", value = "10"),//队列等待阈值(默认-1)@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),//线程存活时间(默认 1min)@HystrixProperty(name = "queueSizeRejectionThreshold", value = "10")//超出队列等待阈值执行拒绝策略},fallbackMethod = "aaa")
//信号量隔离
@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000"),@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "4")},fallbackMethod = "bbb")

application.properties

eureka.client.service-url.defaultZone=http://localhost:8080/eureka
server.port=83
spring.application.name=provider2

启动类

package com.zhangyong.provider2;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class Provider2Application {public static void main(String[] args) {SpringApplication.run(Provider2Application.class, args);}}

controller

package com.zhangyong.provider2.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@RequestMapping(value = "getUserList",method = RequestMethod.GET)public String getUserList() {return "用户列表";}@RequestMapping(value = "getUserInfo",method = RequestMethod.GET)public String getUserInfo() {return "用户详情";}
}

 consumer服务需要改造一下

给consumer加入hystrix依赖

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

给consumer配置文件更新一下

这里为了测试方便,1.给初始线程限定为10,2.关闭feign对hystrix的支持(开启会导致hystrix超时失效) 3.feign底层的ribbon也有超时机制,需要修改ribbon的超时时间

eureka.client.service-url.defaultZone=http://localhost:8080/eureka
server.port=81
spring.application.name=consumer
#是否开启feign对hystrix支持
feign.hystrix.enabled=false
#最大并发数
server.tomcat.max-threads=10
#接受和处理的最大连接数
server.tomcat.max-connections=10
#初始化时创建的线程数
server.tomcat.min-SpareThreads=10
#可以放到处理队列中的请求数
server.tomcat.acceptCount=10
#远程连接超时时间
ribbon.ConnectTimeout=1000
#远程访问超时时间
ribbon.ReadTimeout=5000

consumer 使用hystrix启动类不要忘了加注解

package com.zhangyong.comsumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
@EnableCircuitBreaker
public class ComsumerApplication {public static void main(String[] args) {SpringApplication.run(ComsumerApplication.class, args);}}

给consumer 的 controller 加两个接口 和一个降级方法

package com.zhangyong.comsumer.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import com.zhangyong.comsumer.api.OrderClient;
import com.zhangyong.comsumer.api.ProductClient;
import com.zhangyong.comsumer.api.UserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConsumerController {@Autowiredprivate OrderClient orderClient;@Autowiredprivate ProductClient productClient;@Autowiredprivate UserClient userClient;@RequestMapping("getOrderList")public String getOrderList() {return orderClient.getOrderList();}@RequestMapping("getProductList/{id}")public String getProductList(@PathVariable("id") String id) {System.out.println(Thread.currentThread().getName());return productClient.getProductList(id);}@HystrixCommand(groupKey = "user-pool",//服务名称commandKey = "getUserList",//接口名称,默认使用方法名threadPoolKey = "user-pool",//线程池名称commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")},threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "6"),//线程池大小@HystrixProperty(name = "maxQueueSize", value = "10"),//队列等待阈值(默认-1)@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),//线程存活时间(默认 1min)@HystrixProperty(name = "queueSizeRejectionThreshold", value = "10")//超出队列等待阈值执行拒绝策略},fallbackMethod = "aaa")@RequestMapping("getUserList")public String getUserList() {System.out.println(Thread.currentThread().getName());return userClient.getUserList();}//信号量隔离@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000"),//超时时间 5秒@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),//信号量隔离@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "4")//分配的信号量数},fallbackMethod = "aaa")@RequestMapping("getUserInfo")public String getUserInfo() {System.out.println(Thread.currentThread().getName());return userClient.getUserInfo();}public String aaa() {System.out.println("降级了");return "aaa";}
}

给consumer 加个 Userclient.java 用于远程调用 provider2服务

package com.zhangyong.comsumer.api;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@FeignClient("provider2")
public interface UserClient {@RequestMapping(value = "getUserList", method = RequestMethod.GET)String getUserList();@RequestMapping(value = "getUserInfo", method = RequestMethod.GET)String getUserInfo();
}

下面看线程池隔离效果:

getUserList是配置了线程池隔离的

可以看到他们来自不同的线程池,这说明他们隔离开了,其实当加了@HystrixCommand注解后默认也会线程池隔离

信号量隔离效果:

需要借助一下jMeter测试工具

线程组配置的是每秒5次请求循环1次

http请求调用的是getUserInfo接口

 我配置的信号量是4个而我一次给了5个请求,所以有一个是降级的是正确的

线程池隔离与信号量隔离区别

 线程池隔离

信号量隔离

 使用场景

SpringCloud-Hystrix熔断器相关推荐

  1. SpringCloud Hystrix熔断器

    SpringCloud Hystrix熔断器 15.Hystrix熔断器:简介及作用 目标:理解Hystrix的作用 介绍:Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制. ...

  2. springcloud hystrix熔断器参数详解

    转 https://www.cnblogs.com/520playboy/p/8074347.html 一.hystrix参数使用方法 通过注解@HystrixCommand的commandPrope ...

  3. (四)SpringCloud代码实战之hystrix熔断器

    分布式微服务,在服务调用的时候可能回因为网络故障以及其他原因,造成服务无法调用.会导致该线程无法关闭,一直卡在这里,等到卡住的线程越来越多,服务器资源被耗尽,就会出现服务宕机,一连串相关的服务宕机(雪 ...

  4. springCloud 之 Hystrix 熔断器

    Hystrix 熔断器属于⼀种容错机制 微服务中的雪崩效应 什么是微服务中的雪崩效应呢? 微服务中,⼀个请求可能需要多个微服务接⼝才能实现,会形成复杂的调⽤链路. 扇⼊:代表着该微服务被调⽤的次数,扇 ...

  5. springcloud hystrix实战(二)

    我们前面介绍完了springcloud hystrix的相关作用,大家也有了一个认识,这个熔断器的作用这个就不在重复. 下面我们就接着进行代码实战,我们是接着之前的微服务的工程继续的,如果有什么不明白 ...

  6. Hystrix熔断器的理解

    Hystrix熔断器的理解 什么是熔断器 为什么要使用熔断器 熔断器工作原理![在这里插入图片描述](https://img-blog.csdnimg.cn/20200823210834884.png ...

  7. hystrix 熔断器

    源码: https://gitee.com/GXQ205153964/Hystrix-parent.git Hystrix概述: hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程 ...

  8. hystrix threadpool coresize_SpringCloud 基础教程(八)-Hystrix熔断器(上)

    我的博客:兰陵笑笑生,欢迎浏览博客! 关注公众号:"程序员笑笑生", 回复 "Spring Cloud"."Spring Boot" 获取 ...

  9. 一文带你了解Ribbon负载均衡和Hystrix熔断器

    文章目录 1. Ribbon负载均衡 1.1 关于负载均衡 1.2 Ribbon高级应用 1.3 Ribbon负载均衡策略 1.4 Ribbon核心源码剖析 2. Hystrix熔断器 2.1 微服务 ...

  10. Ribbon 负载均衡 和 Hystrix熔断器

    1 Ribbon负载均衡 1.1 关于负载均衡 负载均衡一般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡,比如Nginx.F5这些,请求到达服务器之后由这些负载均衡器根据一定的算法将请求 ...

最新文章

  1. 单卡手机怎么变双卡双待全过程
  2. php多分支结构 案例,第4天 PHP分支、循环结构
  3. Setting Meta Tags
  4. WebDeploymentSetup使用乱码问题解决
  5. 使用php框架文件上传,Laravel框架文件上传功能实现方法示例
  6. 如何从硬件到防火墙设置homelab
  7. javaweb(07) Servlet详解
  8. opencv Scharr、Canny、LOG边缘提取效果对比
  9. DeNA/上海纵游通过使用AWS大量缩短新款游戏和服务的上线时间
  10. 关于wordpress主题只显示一个的解决办法
  11. selnium 判断页面加载完成_Selenium 的页面加载以及几种等待的问题
  12. java普通工程打war包_Java项目打war包的方法
  13. Linux 快速搭建免费邮件服务器
  14. 树莓派系列(十五):使用英特尔神经计算棒2(NCS2)
  15. 初等函数的麦克劳林级数展开+逆函数的展开求法
  16. Eclipse中调试Python代码--调试FWTools2.4.7中的gdal_retile.py
  17. 谷歌浏览器,退出时;调用退出的方法,vue
  18. 使用C#进行图像处理
  19. 清华大学刘知远:知识指导的自然语言处理
  20. 实现一台电脑可上公司内网也可以访问外网

热门文章

  1. 888元新鲜全新二开版易支付新版彩虹易支付源码全开源10套模板带风控实名系
  2. 亚马逊Amazon 753和754详解
  3. 【Verilog】FPGA驱动WS2812B点阵
  4. Error contacting service. It is probably not running.
  5. 作为一个面试官,我会这样问问题——面试攻略之见招拆招
  6. 浅析STM32H7 FDCAN(一)
  7. Fidder基础知识
  8. HTML+JavaScript实现网页秒杀倒计时效果
  9. 美国Linux服务器系统内核的详细介绍
  10. 软件工程大作业(完整详细)火车订票管理系统