微服务——Hystrix断路器(豪猪哥)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 概述
- 分布式系统面临的问题
- 是什么
- 能干嘛
- Hystrix重要概念
- 服务降级(fallback)
- 哪些情况会触发降级
- 服务熔断
- 服务限流(了解,还是那句话,sentinel比这个好用)
- hystrix案例 (先做一个服务端的服务降级案例,PS:hystrix在客户端,服务端都可以使用)
- 构建cloud-provider-hystrix-payment8001
- xml
- YML
- 主启动
- 业务类
- 正常测试
- 压测
- 新建80服务消费者
- 故障现象和导致原因
- 如何解决?解决的要求
- 服务降级
- 在服务提供者8001做服务降级
- 在服务消费者80端做服务降级
- 全局配置
- 方式1:服务提供者端
- 方式2:服务消费者端
- 服务熔断
- 实操
- 修改cloud-provider-hystrix-payment8001
- PaymentService
- PaymentController
- 结论
- 官网断路器流程图\
- 官网步骤
- 断路器在什么情况下开始起作用
- 断路器开启或者关闭的条件
- 断路器打开之后
- hystrix工作流程
- 服务监控hystrixDashboard
- 仪表盘9001
- 新建cloud-consumer-hystrix-dashboard9001
- POM
- YML
- HystrixDashboardMain9001+新注解@EnableHystrixDashboard
- 启动9001,在浏览器中输入http://localhost:9001/hystrix
- 断路器演示(服务监控hystrixDashboard)
概述
官网:https://github.com/Netflix/Hystrix/wiki/How-To-Use
分布式系统面临的问题
是什么
能干嘛
- 服务降级
- 服务熔断
- 接近实时的监控
- 等等
我们这里只介绍前两种,Hystrix现在一些老服务器还在用,Hystrix早已被阿里的sentinel取代,sentinel相比Hystrix更容易上手,但是Hystrix比较经典 ,另外Hystrix官宣停更进维
Hystrix重要概念
服务降级(fallback)
服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示
哪些情况会触发降级
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满也会导致服务降级
服务熔断
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
【服务的降级->进而熔断->恢复调用链路】,服务熔段一般配合服务降级使用
服务限流(了解,还是那句话,sentinel比这个好用)
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
hystrix案例 (先做一个服务端的服务降级案例,PS:hystrix在客户端,服务端都可以使用)
构建cloud-provider-hystrix-payment8001
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-provider-hystrix-payment8001</artifactId><dependencies><!--新增hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
YML
server:port: 8001eureka:client:register-with-eureka: true #表识不向注册中心注册自己fetch-registry: true #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:# defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka/
# server:
# enable-self-preservation: false
spring:application:name: cloud-provider-hystrix-payment
# eviction-interval-timer-in-ms: 2000
主启动
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
public class PaymentHystrixMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentHystrixMain8001.class,args);}
}
业务类
service
package com.atguigu.springcloud.service;import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class PaymentService {//成功public String paymentInfo_OK(Integer id){return "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,id: "+id+"\t"+"哈哈哈" ;}//失败public String paymentInfo_TimeOut(Integer id){int timeNumber = 3;try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)"+timeNumber;}}
controller
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@Slf4j
public class PaymentController {@Resourceprivate PaymentService paymentService;@Value("${server.port}")private String serverPort;@GetMapping("/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id){String result = paymentService.paymentInfo_OK(id);log.info("*******result:"+result);return result;}@GetMapping("/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id){String result = paymentService.paymentInfo_TimeOut(id);log.info("*******result:"+result);return result;}
}
正常测试
压测
测试http://localhost:8001/payment/hystrix/timeout/1
JMeter下载地址:http://jmeter.apache.org/download_jmeter.cgi
进入解压后的目录的bin目录,找到jmeter.properties文件,修改语言zh_CN。
进入bin目录,cmd 输入./jmeter运行jmeter
新建80服务消费者
新建cloud-consumer-feign-hystrix-order80
pom
<dependencies><!-- openfeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.angenin.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
- yml
server:port: 80eureka:client:register-with-eureka: falseservice-url:defaultZone: http://localhost:7001/eureka#需要加上,否则会报错
ribbon:ReadTimeout: 4000ConnectTimeout: 4000
- 主启动类
@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class OrderHystrixMain80 {public static void main(String[] args) {SpringApplication.run(OrderHystrixMain80.class, args);}}
- service
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}
- controller
@Slf4j
@RestController
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@GetMapping("/consumer/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id){String result = paymentHystrixService.paymentInfo_OK(id);return result;}@GetMapping("/consumer/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id){String result = paymentHystrixService.paymentInfo_TimeOut(id);return result;}}
- 启动80,进行测试
http://localhost/consumer/payment/hystrix/ok/1
同时压测再访问
故障现象和导致原因
8001同一层次的其他接口服务被困死,因为tomcat线程里面的工作线程已经被挤占完毕,80此时调用8001,客户端访问响应缓慢,转圈圈
正因为有上述故障或不佳表现,才有我们的降级/容错/限流等技术诞生
如何解决?解决的要求
前面的过程,我们通过8001服务提供者在一般情况下的正常访问两个接口时没有任何出错,但是一旦其中一个接口进行20000次线程数并发请求,(tomcat默认线程数是200个),8001的tomcat的线程数就会被使用完,此时再访问另外一个接口时,就会发生阻塞最终超时响应,后面我们又引入了80服务消费者,调用8001的服务提供者的接口,因为80OpenFegin的默认配置是1秒中不响应就超时报错,所以在压测情况下,最终会报超时错误、因此,我们需要进行服务降级、服务熔断等,做到超时不等待,出错有兜底
服务降级
在服务提供者8001做服务降级
设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback
- 修改8001中PaymentService的paymentInfo_TimeOut方法,并添加paymentInfo_TimeOutHandler方法:
package com.atguigu.springcloud.service;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class PaymentService {//成功public String paymentInfo_OK(Integer id){return "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,id: "+id+"\t"+"哈哈哈" ;}//失败@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒钟以内就是正常的业务逻辑})public String paymentInfo_TimeOut(Integer id){// int timeNumber = 5;int age = 10/0;// try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}//return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)"+timeNumber;return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)";}//兜底方法public String paymentInfo_TimeOutHandler(Integer id){return "线程池:"+Thread.currentThread().getName()+" 系统繁忙, 请稍候再试 ,id: "+id+"\t"+"哭了哇呜";}}
一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
- 然后在8001的主启动类上添加@EnableCircuitBreaker注解,启用断路器。
- 启动7001和8001,测试8001的fallback,http://localhost:8001/payment/hystrix/timeout/1成功进入fallback方法。(并且fallback方法是用Hystrix的线程池)
- 去掉sleep,改为 1 / 0,测试方法运行异常,http://localhost:8001/payment/hystrix/timeout/1,也可以进入fallback方法。
在服务消费者80端做服务降级
- 在80的yml中添加
feign:hystrix:enabled: true
在主启动类添加@EnableHystrix注解。
修改OrderHystrixController的paymentInfo_TimeOut方法,并添加paymentTimeOutFallbackMethod方法:
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")})@GetMapping("/consumer/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id){String result = paymentHystrixService.paymentInfo_TimeOut(id);return result;}public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){return "消费者80,支付系统繁忙";}
- 启动7001,8001,80,http://localhost/consumer/payment/hystrix/timeout/1(如果是提供者那边出问题,并且消费者设置了fallback,会优先进入消费者的fallback)
- 中添加int i = 1 / 0;,运行异常也会进入80的fallback方法
全局配置
方式1:服务提供者端
代码膨胀的解决办法
解决办法:设置全局fallback方法。
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.service.PaymentHystrixService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //全局的
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@GetMapping("/consumer/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id){String result = paymentHystrixService.paymentInfo_OK(id);return result;}// @GetMapping("/consumer/payment/hystrix/timeout/{id}")
// public String paymentInfo_TimeOut(@PathVariable("id") Integer id){// String result = paymentHystrixService.paymentInfo_TimeOut(id);
// return result;
// }@GetMapping("/consumer/payment/hystrix/timeout/{id}")
// @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {// @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500") //1.5秒钟以内就是正常的业务逻辑
// })@HystrixCommandpublic String paymentInfo_TimeOut(@PathVariable("id") Integer id){int age = 10/0;String result = paymentHystrixService.paymentInfo_TimeOut(id);return result;}//兜底方法public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){return "我是消费者80,对付支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,(┬_┬)";}//下面是全局fallback方法public String payment_Global_FallbackMethod(){return "Global异常处理信息,请稍后再试,(┬_┬)";}
}
不太建议在服务提供者端做服务降级,会和业务逻辑混一起,代码看起来比较混乱,最好在服务消费者端做服务降级
方式2:服务消费者端
服务降级,客户端去调用服务端,碰上服务端宕机或关闭。本次案例服务降级处理是在客户端80实现完成的,与服务端8001没有关系,只需要为Feign客户端定义的接口添加一个服务降级处理的实现类即可实现解耦 。
再看我们的业务类PaymentController
修改cloud-consumer-feign-hystrix-order80:
根据cloud-consumer-feign-hystrix-order80已经有的PaymentHystrixService接口,重新新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处理
- PaymentFallbackService类实现PaymentFeignClientService接口
package com.atguigu.springcloud.service;import org.springframework.stereotype.Component;@Component
public class PaymentFallbackService implements PaymentHystrixService {@Overridepublic String paymentInfo_OK(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";}@Overridepublic String paymentInfo_TimeOut(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";}
}
- YML
feign:hystrix:enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
- PaymentFeignClientService接口
package com.atguigu.springcloud.service;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;@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id);}
服务熔断
大神论文 https://martinfowler.com/bliki/CircuitBreaker.html
实操
修改cloud-provider-hystrix-payment8001
PaymentService
//服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间范围@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id){if (id < 0){throw new RuntimeException("*****id 不能负数");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){return "id 不能负数,请稍候再试,(┬_┬)/~~ id: " +id;
}
why配置这些参数
PaymentController
//===服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){String result = paymentService.paymentCircuitBreaker(id);log.info("*******result:"+result);return result;
}
- 启动7001和8001 http://localhost:8001/payment/circuit/-1(输入超过6次进入熔断)
熔断10秒内就算是正确的请求也返回错误信息
10秒后进入半开模式,对请求进行处理,此时如果是正确的请求,那么就关闭熔断,否则再次进入熔断,10秒后再次开启半开模式,对请求进行处理,直到半开模式处理到正确请求。
结论
我们上述案例配置的是10秒内的10次请求如果失败率达到60%就开启熔断,如果达到这一要求,8001就会开启熔断不再接受任何请求,如果窗口期过了,熔断器就会进入半开状态,8001就会放进来少数的请求,如果请求没有报错就关闭熔断器,如果请求报错就继续打开,否则继续打开熔段,直至下一个窗口期再进入半开状态,如此循环。
官网断路器流程图\
官网步骤
断路器在什么情况下开始起作用
断路器开启或者关闭的条件
断路器打开之后
hystrix工作流程
https://github.com/Netflix/Hystrix/wiki/How-it-Works
服务监控hystrixDashboard
仪表盘9001
新建cloud-consumer-hystrix-dashboard9001
POM
<?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>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-consumer-hystrix-dashboard9001</artifactId><dependencies><!--新增hystrix dashboard--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
YML
server:port: 9001
HystrixDashboardMain9001+新注解@EnableHystrixDashboard
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {public static void main(String[] args) {SpringApplication.run(HystrixDashboardMain9001.class,args);}
}
启动9001,在浏览器中输入http://localhost:9001/hystrix
断路器演示(服务监控hystrixDashboard)
注意:所有微服务提供者都需要在pom中引入监控依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在8001的主启动类中添加:
/*** 此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑* ServletRegistrationBean因为SpringBoot的默认路径不是 “/hystrix.stream"* 只要在自己的项目里配置上下的servlet就可以了*/@Beanpublic ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet() ;ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/hystrix.stream");registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;}
监控测试
启动9001,7001,8001
9001监控8001
浏览器输入http://localhost:8001/payment/circuit/1和http://localhost:8001/payment/circuit/-1
多次输入http://localhost:8001/payment/circuit/-1错误的访问。
稍微等一会,然后输入正确的访问http://localhost:8001/payment/circuit/1,就会熔断就会关闭。
微服务——Hystrix断路器(豪猪哥)相关推荐
- SpringCloud与微服务Ⅷ --- Hystrix断路器
复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务调用服务B和微服务C,微服务B和微服务C又调用其他服务,这就是 ...
- 微服务 - Hystrix 熔断器
1. Hystrix简介 Hystrix是Netflix开源的一个延迟和容错库,用于隔离远程服务.第三方库,防止出现级联失败. 2. 雪崩问题 服务A调用服务B,如果服务B出现问题,那么服务A就需要等 ...
- Spring cloud微服务 Hystrix熔断器
以下demo代码:https://github.com/wades2/HystrixtDemo 官网定义:Hystrix是一个延迟容错库.在分布式环境中,许多服务依赖项中的一些不可避免地会失败.Hys ...
- SpringCloud+CloudAlibaba微服务初阶入门
内容目录 微服务 为什么要用微服务? SpringCloud生态(旧版) 项目搭建 规范的创建父工程 父模块的pom的常用依赖 创建子模块 1.建module(maven) 2.改pom 3.写Yml ...
- 89-Spring Cloud 微服务详解
Spring Cloud 微服务详解 微服务架构: 在说明该架构之前,再次的说明互联网应用架构演进(虽然之前说明过了) 随着互联网的发展,用户群体逐渐扩大,网站的流量成倍增长,常规的单体架构已无法满足 ...
- SpringCloud微服务架构实战:微服务治理
微服务治理 Spring Cloud 工具套件为微服务治理提供了全面的技术支持.这些治理工具主要包括服务的注册与发现.负载均衡管理.动态路由.服务降级和故障转移.链路跟踪.服务监控等.微服务治理的主要 ...
- 微服务和VUE入门教程(26): 微服务之turbine
微服务和VUE入门教程(26): 微服务之turbine 微服务和VUE入门教程(0): 着手搭建项目 微服务和VUE入门教程(1): 搭建前端登录界面 微服务和VUE入门教程(2): 注册中心 微服 ...
- 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享
2019独角兽企业重金招聘Python工程师标准>>> 转载本文需注明出处:EAWorld,违者必究. 引言: 根据保险行业发展趋势,目前保险交易已经呈现高频化.碎片化.场景化等特点 ...
- ios11修改微信步数_基于天宫的星舟微服务方案介绍
微服务架构模式 面对单体架构带来的诸如应用更新周期长,无法针对单独的功能进行扩展和配置资源,无法弹性伸缩应用的负载能力,一个模块故障造成整个应用的不可用,难以采用新技术等等挑战,我们采用微服务架构模 ...
最新文章
- 什么是交换(Swap)与伪交换(Pseudo swap)
- Nginx配置文件nginx.conf的文件结构
- 音视频技术开发周刊 94期
- SQLAlchemy 操作数据库
- Vue通信、传值的多种方式,详解
- 敏捷开发的6个实战经验
- linux内核有ebpf吗,聊聊很重要的内核技术eBPF
- Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
- python之强化学习入门
- js面向对象思想封装拖拽功能,兼容pc和移动端
- 【python】热力图绘制: intensity_heatmap,density_heatmap
- C++编程语言中异常处理(try-catch-throw)介绍
- Telerik ui kendo for jquery 2022源码版
- Java后端开发实习记录
- 大风起兮云飞扬 —记2011年的中国云计算
- dcos - marathon - 有的时候健康检查不是绿条
- CAD 2014 打开后,一操作就崩溃
- servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条
- 苹果xr十大隐藏功能_苹果iPhone12Pro隐藏功能!简单3步骤“量身高”
- Win10笔记本电脑某些应用能使用麦克风,但某些无法使用麦克风解决方法(本文以QQ为例,其他应用也适用)
热门文章
- 前端自动化测试——百度搜索功能实战演示
- eclipse—WEB-INF目录下不显示classes文件夹
- 怎样把本地html传到网上,如何制作自己的网页链接?教你怎么把自己制作的网站发布到网上?...
- 玩转-------商业大亨
- android 播放固定频率的声音,Android使用SoundPool播放音效
- EfficientNet v2网络学习记录--更小更快
- 基于C#实现的坦克大战游戏的最短路
- win7系统c盘满了笔记
- JDBC连接数据库,实现简单的用户登录功能
- poi 升级到 5.2.2 修改内容: