提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 概述
    • 分布式系统面临的问题
    • 是什么
    • 能干嘛
  • 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断路器(豪猪哥)相关推荐

  1. SpringCloud与微服务Ⅷ --- Hystrix断路器

    复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务调用服务B和微服务C,微服务B和微服务C又调用其他服务,这就是 ...

  2. 微服务 - Hystrix 熔断器

    1. Hystrix简介 Hystrix是Netflix开源的一个延迟和容错库,用于隔离远程服务.第三方库,防止出现级联失败. 2. 雪崩问题 服务A调用服务B,如果服务B出现问题,那么服务A就需要等 ...

  3. Spring cloud微服务 Hystrix熔断器

    以下demo代码:https://github.com/wades2/HystrixtDemo 官网定义:Hystrix是一个延迟容错库.在分布式环境中,许多服务依赖项中的一些不可避免地会失败.Hys ...

  4. SpringCloud+CloudAlibaba微服务初阶入门

    内容目录 微服务 为什么要用微服务? SpringCloud生态(旧版) 项目搭建 规范的创建父工程 父模块的pom的常用依赖 创建子模块 1.建module(maven) 2.改pom 3.写Yml ...

  5. 89-Spring Cloud 微服务详解

    Spring Cloud 微服务详解 微服务架构: 在说明该架构之前,再次的说明互联网应用架构演进(虽然之前说明过了) 随着互联网的发展,用户群体逐渐扩大,网站的流量成倍增长,常规的单体架构已无法满足 ...

  6. SpringCloud微服务架构实战:微服务治理

    微服务治理 Spring Cloud 工具套件为微服务治理提供了全面的技术支持.这些治理工具主要包括服务的注册与发现.负载均衡管理.动态路由.服务降级和故障转移.链路跟踪.服务监控等.微服务治理的主要 ...

  7. 微服务和VUE入门教程(26): 微服务之turbine

    微服务和VUE入门教程(26): 微服务之turbine 微服务和VUE入门教程(0): 着手搭建项目 微服务和VUE入门教程(1): 搭建前端登录界面 微服务和VUE入门教程(2): 注册中心 微服 ...

  8. 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享

    2019独角兽企业重金招聘Python工程师标准>>> 转载本文需注明出处:EAWorld,违者必究. 引言: 根据保险行业发展趋势,目前保险交易已经呈现高频化.碎片化.场景化等特点 ...

  9. ios11修改微信步数_基于天宫的星舟微服务方案介绍

     微服务架构模式 面对单体架构带来的诸如应用更新周期长,无法针对单独的功能进行扩展和配置资源,无法弹性伸缩应用的负载能力,一个模块故障造成整个应用的不可用,难以采用新技术等等挑战,我们采用微服务架构模 ...

最新文章

  1. 什么是交换(Swap)与伪交换(Pseudo swap)
  2. Nginx配置文件nginx.conf的文件结构
  3. 音视频技术开发周刊 94期
  4. SQLAlchemy 操作数据库
  5. Vue通信、传值的多种方式,详解
  6. 敏捷开发的6个实战经验
  7. linux内核有ebpf吗,聊聊很重要的内核技术eBPF
  8. Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
  9. python之强化学习入门
  10. js面向对象思想封装拖拽功能,兼容pc和移动端
  11. 【python】热力图绘制: intensity_heatmap,density_heatmap
  12. C++编程语言中异常处理(try-catch-throw)介绍
  13. Telerik ui kendo for jquery 2022源码版
  14. Java后端开发实习记录
  15. 大风起兮云飞扬 —记2011年的中国云计算
  16. dcos - marathon - 有的时候健康检查不是绿条
  17. CAD 2014 打开后,一操作就崩溃
  18. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条
  19. 苹果xr十大隐藏功能_苹果iPhone12Pro隐藏功能!简单3步骤“量身高”
  20. Win10笔记本电脑某些应用能使用麦克风,但某些无法使用麦克风解决方法(本文以QQ为例,其他应用也适用)

热门文章

  1. 前端自动化测试——百度搜索功能实战演示
  2. eclipse—WEB-INF目录下不显示classes文件夹
  3. 怎样把本地html传到网上,如何制作自己的网页链接?教你怎么把自己制作的网站发布到网上?...
  4. 玩转-------商业大亨
  5. android 播放固定频率的声音,Android使用SoundPool播放音效
  6. EfficientNet v2网络学习记录--更小更快
  7. 基于C#实现的坦克大战游戏的最短路
  8. win7系统c盘满了笔记
  9. JDBC连接数据库,实现简单的用户登录功能
  10. poi 升级到 5.2.2 修改内容: