SpringCloud

技术栈

服务注册与发现

EUREKA(停更),Zookeeper,Consul,Nocos

服务调用

RIBBON(NETFLIX网飞), LoadBalancer, FELGN(停更) , OpenFeign

服务熔断降级

HYSTRIX (不推荐) ,resilience4j (国外推荐) ,sentienl (国内推荐)

服务网关

ZUUL (不推荐) , gateWay

服务分布配置

SpringCloud Config (不推荐) , Nocos

服务总线

Bus (不推荐) , Nocos


Hystrix

是什么?

用于处理分布式系统的延迟和容差的开源库
在分布式系统里,许多依赖不可避免的回调用失败,超时,异常,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

能干什么?

服务降级
服务熔断
服务限流

服务降级?

服务忙,不让客户端等待并立即返回一个友好的提示 fallback
什么情况下会发生服务降级?

  • 程序运行错误
  • 超时
  • 服务熔断触发服务降级
  • 线程池/信号量也会导致服务降级

服务熔断?

保险丝 服务的降级->进而熔断->恢复调用链路

服务限流?

高并发操作

服务降级

服务端Hystrix案例

@HystrixCommand
@EnableCircuitBreaker

pom.xml

     <!--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>

application.yml

server:port: 8001
spring:application:name: cloud-provider-hystrix-payment
eureka:client:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://localhost:7001/eureka/

PaymentService

@HystrixCommand(fallbackMethod = “错误时调用的方法”,commandProperties = {
@HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”, value = “3000”)//只等待3秒
})

@Service
public class PaymentService {public String paymentInfo_ok(Integer id){return "线程池:"+Thread.currentThread().getName()+"paymentInfo_ok:"+ UUID.randomUUID().toString()+"--id:"+id+"O(∩_∩)O哈哈~";}@HystrixCommand(fallbackMethod = "paymentInfo_TimerOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")//只等待3秒})public String paymentInfo_fail(Integer id){//        int i = 4/0;try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}return "线程池:"+Thread.currentThread().getName()+"paymentInfo_fail:"+ UUID.randomUUID().toString()+"--id:"+id+"┭┮﹏┭┮";}public String paymentInfo_TimerOutHandler(Integer id){return "超时或异常";}
}

PaymentController

@RestController
@Slf4j
public class PaymentController {@Autowiredprivate PaymentService paymentService;@GetMapping("/payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id){String s = paymentService.paymentInfo_ok(id);log.info("***********ok");return s;}@GetMapping("/payment/hystrix/time_out/{id}")public String fail(@PathVariable("id") Integer id){String s = paymentService.paymentInfo_fail(id);log.info("***********fail");return s;}}

主启动

@EnableCircuitBreaker

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

客户端

application.yml

server:port: 80
spring:application:name: cloud-consumer-hystrix-order
eureka:client:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka#      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 集群版
feign:hystrix:enabled: true

MainHystrixOrder80

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

PaymentHystrixService

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {/*** 正常访问** @param id* @return*/@GetMapping("/payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id);/*** 超时访问** @param id* @return*/@GetMapping("/payment/hystrix/time_out/{id}")public String fail(@PathVariable("id") Integer id);
}

OrderHystrixController

@RestController
@Slf4j
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@GetMapping("/consumer/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id){return paymentHystrixService.ok(id);}/*** 超时访问* @param id* @return*/@GetMapping("/consumer/payment/hystrix/timeout/{id}")@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")})public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {//        int age = 10/0; //方法前挂了,跟后面挂了两种return paymentHystrixService.fail(id);}public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";}
}

解决代码膨胀

@DefaultProperties(defaultFallback = “payment_Global_FallbackMethod”)
@HystrixCommand //没有特别指明就用统一的

package com.wu.scho.controller;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 com.wu.scho.service.PaymentHystrixService;
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;/*** @program: IClould2020Wu* @author: Mr-Jies* @create: 2020-05-16 20:43**/
@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){return paymentHystrixService.ok(id);}/*** 超时访问* @param id* @return*/@GetMapping("/consumer/payment/hystrix/timeout/{id}")/* @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")})*/@HystrixCommand  //没有特别指明就用统一的public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {//        int age = 10/0; //方法前挂了,跟后面挂了两种return paymentHystrixService.fail(id);}public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";}//下面是全局fallback方法public String payment_Global_FallbackMethod(){return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";}}

统一为接口里面的方法进行异常处理

fallback

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/time_out/{id}")public String fail(@PathVariable("id") Integer id);
}



正常访问

8001服务器挂了,客户端降级处理

服务熔断

是什么?

但某一微服务出错或者不可用时,会进行降级,进而就熔断了微服务的调用,但当检测到节点调用响应正常后,会恢复链路

服务端

PaymentService

@HystrixProperty(name = “circuitBreaker.enabled”, value = “true”),// 是否开启断路器
@HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”, value = “10”),// 请求峰值
@HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”, value = “10000”),// 时间窗口期/时间范围
@HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”, value = “60”)// 失败率达到多少后跳闸

    @HystrixCommand(fallbackMethod = "paymentInfo_scoreHandler",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 paymentInfo_score(Integer id){if (id<0){throw new RuntimeException("id,不能为负数");}String s = UUID.randomUUID().toString();return "线程池:"+Thread.currentThread().getName()+"paymentInfo_fail:"+ UUID.randomUUID().toString()+"--id:"+id+"O(∩_∩)O哈哈~";}public String paymentInfo_scoreHandler(Integer id){return "超时或异常";}

配置属性的来源 HystrixCommandProperties

PaymentController

    @GetMapping("/payment/hystrix/score/{id}")public String paymentInfo_score(@PathVariable("id") Integer id){String s = paymentService.paymentInfo_score(id);log.info("----------::"+s);return s;}

监控窗口

pom.xml

<!--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>

在主启动类上加@EnableHystrixDashboard

注意:新版本Hystrix需要在主启动Mainpystrix8001中指定监控路径

/*** @program: IClould2020Wu* @author: Mr-Jies* @create: 2020-05-16 20:17**/@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class MainProviderHystrixPayment8001 {public static void main(String[] args) {SpringApplication.run(MainProviderHystrixPayment8001.class,args);}/*** 此配置是为了服务监控而配置,与服务容错本身无观,springCloud 升级之后的坑* ServletRegistrationBean因为springboot的默认路径不是/hystrix.stream* 只要在自己的项目中配置上下面的servlet即可* @return*/@Beanpublic ServletRegistrationBean getServlet(){HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();ServletRegistrationBean<HystrixMetricsStreamServlet> registrationBean = new ServletRegistrationBean<>(streamServlet);registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/hystrix.stream");registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;}
}

Hystrix的三种状态

1、closed:请求正常时,不使用熔断器;

2、open:统计请求的失败比例,达到阀值时,打开熔断器,请求被降级处理;延时一段时候后(默认休眠时间是5S)会进入halfopen状态;默认失败比例阀值是50%,请求次数最少不低于20次;

3、halfopen:在进入该状态后会放入部分请求;判断请求是否成功,不成功,进入open状态,重新计时,进入halfopen状态;成功,进入closed状态,


SpringCloud(3)--服务熔断降级相关推荐

  1. SpringCloud Hystrix服务熔断和降级的理解

    (个人理解,不喜勿喷)假如我要开发一个项目,但是开发的过程中遇到一个问题,我不会操作数据库(包括数据库连接,数据查询等),我只能向我的朋友请教,朋友A会使用Hibernate,朋友B会JDBC访问数据 ...

  2. 不能再让服务这么任性的被访问啦---分布式服务熔断降级限流利器至Hystrix

    全文概览 文章目录 为什么需要hystrix 特色功能 项目准备 接口测试 业务隔离 线程隔离 信号量隔离 服务降级 触发条件 不足 服务熔断 服务限流 请求合并 HystrixCollapser 工 ...

  3. 微服务架构下的 服务熔断, 降级, 限流

    微服务架构下存在的 '雪崩' 问题 在微服务架构中, 一个请求需要调用多个服务是非常常见的. 如客户端访问订单服务, 而订单服务需要调用库存服务, 库存服务需要调用配送服务, 由于网络原因或者自身的原 ...

  4. 【微服务】服务熔断降级 Sentinel

    目录 高并发带来的问题 结论: 服务器雪崩效应 常见容错方案 隔离机制: 超时机制 限流机制 熔断机制: 降级机制 常见的容错组件 Sentinel入门 什么是Sentinel 订单微服务集成Sent ...

  5. feign直接走熔断_121 SpringCloud之服务熔断、隔离、Hystrix、 Dashboard和turbine

    1. 解决灾难性雪崩效应-服务熔断-服务熔断处理 (1) 熔断参数circuitBreaker.enabled的作用是什么? 是否开启熔断 (2) 熔断参数circuitBreaker.request ...

  6. 服务熔断降级什么意思?

    服务降级:超过业务设置处理时间,提示服务器忙,请稍后再试 服务熔断:因为服务挂了,告诉你服务不可用,请稍后再试.当检测到服务正常后,慢慢恢复接口使用

  7. SpringCloud Alibaba Sentinel 熔断降级 - 程序配制方式实现

    一.Sentinel 上篇文章我们讲解了Sentinel 流控规则的配制,本篇文章我们继续讲下Sentinel 的熔断降级,依然采用程序配制方式实现. 上篇文章地址:https://blog.csdn ...

  8. feign直接走熔断_SpringCloud基于OpenFeign实现服务熔断降级

    在Spring Cloud微服务架构中,往往不同的业务模块或者不同的业务功能被抽象成独立的微服务,这样存在以下几点优势: 业务拆分后,每个微服务相对独立,对整个系统的架构容易理解: 每个微服务功能简单 ...

  9. spring cloud alibaba 学习(二十一)Sentinel服务熔断降级DegradeSlot

    目录 一.DegradeRule 一.DegradeSlot 三.ResponseTimeCircuitBreaker 四.ExceptionCircuitBreaker 一.DegradeRule ...

最新文章

  1. LoadRunner模拟Json请求
  2. CF183D T-shirt
  3. 关闭子窗口刷新父窗口
  4. CFNet 论文解读
  5. 微型计算机系统性能优化及测试,微型计算机系统测试、优化和升级基础知识习题...
  6. objective-c 通过类名实例化类
  7. 嵌入式linux系统移植的四大步骤_如何移植开源软件到嵌入式Linux系统
  8. 【牛客 - 283C】模拟只会猜题意(简单模拟)
  9. 机器学习基础笔记总结
  10. CSS Center(居中专题)
  11. 360搜索、UC浏览器等被3·15点名应用已下架;马斯克宣布通过NFT卖歌;美团App再发力社交,内测 “群聊”功能 |极客头条...
  12. PAT_1056_组合数的和(15)
  13. c++ opencv [ INFO:0] global c:\build\master_winpack-build-win64-vc15\***
  14. MPEG4写为avi文件
  15. Ubuntu18.04+思岚激光雷达A2M7+ROS测试
  16. process has died
  17. 2023年,莫荒废了时光。
  18. unity3D 新建android apk
  19. Linux RPMsg框架--以及应用于iMX6 SoloX连接A9和M4 Core
  20. Python实现多层感知器网络

热门文章

  1. AndroidStudio初体验
  2. 产品基础训练 - Persona[用户画像]
  3. 【实习日志】The last Day总结篇
  4. 云计算实战应用案例精讲-【深度学习】多模态融合(论文篇三)
  5. 臭可乐,怎么才能让你不吃便便呢,唉
  6. python中的类怎样理解_深入理解Python中的元类(metaclass)
  7. Anroid中Service详解
  8. 项目管理需要建立团队文化
  9. 简单记录双系统安装Ububtu22.04
  10. 《深入理解计算机系统》——低谷中的重新振作