一、Hystrix的局部降级逻辑的处理方式

1.局部降级(提供方)

1)、在服务提供方的service里面 给指定的方法编写降级的方法,降级方法(逻辑)编写的原则是方法的形参和返回值必须要和被降级的方法保持一致。

@Service
public class PaymentService {@HystrixCommand(fallbackMethod = "handOk",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})public String paymentInfo_Ok(Integer id){int i = 10/0;return "线程池:" + Thread.currentThread().getName() + "  ,paymentInfo_OK,id:" + id;}超时访问的方法@HystrixCommand(fallbackMethod = "handTimeOut",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})public String paymentInfo_Timeout(Integer id){int interTime = 3;//int i = 10/0;try{TimeUnit.SECONDS.sleep(interTime);}catch (Exception e){e.printStackTrace();}return "线程池:" + Thread.currentThread().getName() + "  ,paymentInfo_Timeout,id:" + id + "耗时" + interTime + "秒钟";return "hello";}public String handTimeOut(Integer id){return "调用服务超时,请稍后再试!";}public String handOk(Integer id){return "服务器内部资源错误,请稍后再试!";}

3)、在启动类上开启服务熔断的功能 @SpringCloudApplication

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
//这个注解包含上面三个注解
@SpringCloudApplication
public class HystrixPaymentApplication {public static void main(String[] args) {SpringApplication.run(HystrixPaymentApplication.class,args);}

4)、将降级的逻辑应用在某个服务上

 @HystrixCommand(fallbackMethod="降级逻辑的方法名",commandProperties={@HystrixProperties(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})public String timeout(){}

2.局部降级(提供方)

1)、在消费方的启动类上面开启熔断 @EnableCircuitBreaker

2)、在消费方的controller里面定义降级逻辑的方法。将降级逻辑应用在被降级的方法上面(实现的思路和上面一样)

二、全局降级处理方式

1.全局降级逻辑

1)、在消费方的启动类上面要加上一个@EnableCircuitBreaker

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker//开启熔断器
public class HystrixOrderApplication {public static void main(String[] args) {SpringApplication.run(HystrixOrderApplication.class,args);}
}

2)、在消费方的controller里面,定义一个全局降级的方法。

//全局降级处理方法public String globalHandler(){return "这是全局处理降级逻辑的方法.......";}

3)、在controller上面 添加一个@DefaultProperties(defaultFallback = “handleAll”)注解

4)、在指定的被降级的方法上添加一个@HystrixCommand

5)、降级逻辑的优先级 局部的降级逻辑>全局的降级逻辑

@RestController
@DefaultProperties(defaultFallback = "globalHandler")
public class OrderController {@AutowiredOrderHystrixClient orderHystrixClient;/*@HystrixCommand(fallbackMethod = "numberException", commandProperties = {//设置峰值,超过 1.5 秒,就会调用兜底方法@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "1500")})*/@GetMapping("/consumer/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id")Integer id){//int i = 100/0;return orderHystrixClient.ok(id);}/*@HystrixCommand(fallbackMethod = "handException", commandProperties = {//设置峰值,超过 1.5 秒,就会调用兜底方法@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "3000")})*/@HystrixCommand@GetMapping("/consumer/payment/hystrix/timeout/{id}")public String paymentInfo_Timeout(@PathVariable("id")Integer id){return orderHystrixClient.timeout(id);}

2.降级服务的抽取

1)、先将服务消费方关于降级处理的配置全部清除,在yml配置文件开启Feign基于对Hystrix的支持

# 用于服务降级 在注解@FeignClient 中添加 fallback 属性值
feign:
hystrix:enabled: true  # 在feign中开启 hystrix

2)、定义一个类实现Feign客户端接口

@Component
public class FallBackService implements OrderHystrixClient {@Overridepublic String ok(Integer id) {return "进行paymentInfo_OK方法降级处理......";}@Overridepublic String timeout(Integer id) {return "进行paymentInfo_Timeout方法降级处理";}
}

3)、修改Feign客户端接口

@Component
public class FallBackService implements OrderHystrixClient {@Overridepublic String ok(Integer id) {return "进行paymentInfo_OK方法降级处理......";}@Overridepublic String timeout(Integer id) {return "进行paymentInfo_Timeout方法降级处理";}
}

三、什么是熔断? 熔断有哪几种状态 断路器的工作原理

1.熔断

 1. 当用户访问某个服务,达到了最大的访问量之后,直接拒绝用户访问。

2.熔断三种状态

1.打开状态(open)、2.断开状态(close)、3.半开状态(half open)

3. 断路器的工作原理

 统计用户在指定的时间范围(默认10s)之内的请求总数达到指定的数量之后,如果不健康的请求(超时、异常)占总请求数量的百分比(50%)达到了指定的阈值之后,就会触发熔断。触发熔断,断路器就会打开(open),此时所有请求都不能通过。在5s之后,断路器会恢复到半开状态(half open),会允许少量请求通过,如果这些请求都是健康的,那么断路器会回到关闭状态(close).如果这些请求还是失败的请求,断路器还是恢复到打开的状态(open).

四、如何开启熔断

1.首先在启动类上开启服务熔断 @EnableCircuitBreaker 开启服务熔断

2.service层的方法设置服务熔断

//服务熔断@HystrixCommand(fallbackMethod = "timeoutHandler", 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"),  // 失败率达到多少后跳闸//整体意思:10秒内 10次请求,有6次失败,就跳闸})public String paymentCircuitBreaker(Integer id){//模拟发生异常if(id < 0){throw new RuntimeException("*****id,不能为负数");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;}public String timeoutHandler(Integer id){return "id不能为负数,请重试......";}

3.定义controller

//服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id")Integer id){return paymentService.paymentCircuitBreaker(id);
}

4.使用XML的方式进行熔断的配置

           hystrix:command:default:circuitBreaker:enabled: truerequestVolumeThreshold: 10sleepWindowInMilliseconds: 10000errorThresholdPercentage: 60

五、什么是网关? gateway 的核心概念

1.gateway网关

1)、 什么是 API 网关(API Gateway)

分布式服务架构、微服务架构与 API 网关
在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。
这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,
这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。

2)、API 网关的定义

网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。
API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、
访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。
因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。

3)、Gateway是什么

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,
并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

4)、 为什么用Gateway

Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,
从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,
并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、
或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,
也都可以直接用。当然自定义 Filter 也非常方便。

2. gateway 的核心概念

六、如何简单使用gateway

1.首先创建cloud-gateway-gateway9527服务

2.引入POM依赖

<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client gateWay作为网关,也要注册进服务中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- gateway和web不能同时存在,即web相关jar包不能导入 --><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><dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><groupId>com.jiyun.cloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency>
</dependencies>

3.编写application.yml配置文件

server:port: 9527
spring:application:name: cloud-gateway## GateWay配置cloud:gateway:routes:- id: payment_routh  # 路由ID , 没有固定的规则但要求唯一,建议配合服务名uri: http://localhost:8001  # 匹配后提供服务的路由地址predicates:- Path=/payment/**  # 断言,路径相匹配的进行路由- id: payment_routh2  # 路由ID , 没有固定的规则但要求唯一,建议配合服务名uri: http://localhost:8001  # 匹配后提供服务的路由地址predicates:- Path=/payment/lb/**  # 断言,路径相匹配的进行路由# 注册进 eureka Server
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/register-with-eureka: truefetch-registry: true

4.编写启动类

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

5.启动8001服务以及9527进行测试

最终的出结论:我们使用网关,无需在访问我们的8001端口号进行访问,直接使用9527端口号访问即可
也是出于对8001服务的安全。主要通过9527服务中application.yml进行配置:

hystrix的服务降级和关于熔断的概念、使用等以及网关gateway的了解与使用相关推荐

  1. 手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  2. SpringCloud进阶-Hystrix的服务降级

    提示:本文主要对Hystrix的服务降级进行总结 文章目录 前言 一.服务降级 1.1 8001 fallback 1.1.1 业务类启用 1.1.2 主启动类激活 1.2 80 fallback 1 ...

  3. Hystrix之服务降级

    springcloud的组件Hystrix一个重要的作用就是实现服务降级,下面介绍相关的使用 一 服务支付方的服务降级 首先介绍服务支付方的服务降级,这里的注册中心使用eureka 1 关于pom.p ...

  4. Hystrix之服务降级代码演示

    所有代码都在github上:https://github.com/demonruin/cloud2020/tree/master 服务降级就是指服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提 ...

  5. OpenFeign 整合 Hystrix 实现服务降级

    Hystrix 的默认超时时间 :1s OpenFeign底层是使用 ribbon实现的 默认连接超时时间 : 1s 修改连接超时时间配置(OpenFeign): #设置feign客户端超时时间 ri ...

  6. 07蚂蚁-高并发解决方案——1.Hystrix服务降级,服务隔离,服务熔断,服务限流,CDN

    高并发服务降级特技 背景 在今天,基于SOA的架构已经大行其道.伴随着架构的SOA化,相关联的服务熔断.降级.限流等思想,也在各种技术讲座中频繁出现.本文将结合Netflix开源的Hystrix框架, ...

  7. Hystrix断路器原理及实现(服务降级、熔断、限流)

    Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...

  8. 微服务(八)——Hystrix服务降级、熔断、限流(上)

    目录 Hystrix服务降级.熔断.限流 Hystrix是什么 Hystrix停更进维 Hystrix的服务降级熔断限流相关概念 Hystrix支付微服务构建 JMeter高并发压测后卡顿 订单微服务 ...

  9. Spring Cloud H (五)初战服务降级和熔断Hystrix(豪猪哥)

    目录 目录 前言 概述 服务雪崩 服务限流 服务降级 服务熔断 如何理解服务降级和熔断之间的关系 代码实战 Hystrix支付微服务构建 订单微服务调用支付服务出现卡顿 Hystrix之服务降级支付侧 ...

  10. Hystrix 服务降级和熔断

    Hystrix 服务降级和服务熔断 文章目录 Hystrix 服务降级和服务熔断 1.问题的提出 2.Hystrix 3.服务降级 3.1 服务降级实操 3.2 服务降级之客户端 3.3 总结 4.服 ...

最新文章

  1. path与classpath区别 path是Windows查找.exe文件的路径;classpath是jvm查找.class文件的路径
  2. 接口转发和重定向区别(一)
  3. zabbix——拓扑图入门
  4. 【Hexo】搭建自己的博客并到Github Pages
  5. Linux基础命令--date
  6. java怎么导入项目?java已有项目如何导入eclipse?
  7. linux应用程序接收文件,Linux应用程序学习之文件编程
  8. 【线上分享】基于人眼主观视觉的画质评价与提升
  9. linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客
  10. 2015c语言9月答案,2015年9月计算机二级C语言预测题答案
  11. 关于Hive中case when不准使用子查询的解决方法
  12. custompage.width 不能小数吗_为什么有军人戴眼镜?他们的裸眼视力合格吗?
  13. 计算机控制液压同步顶升系统,PLC四点多点同步顶升系统,同步液压顶升系统
  14. 哪些短信平台能发国际短信?
  15. excel高级筛选怎么用_Excel集|高级筛选使用方法(多条件筛选)
  16. 912. 排序数组(中等 各种排序 数组)
  17. 达芬奇17新功能及安装教程
  18. 雪碧新年神兽主题的观后
  19. 你业余时间在做什么?
  20. Docker常用命令使用详解(docker help、version、info、images)(一)

热门文章

  1. Pointer Generator Network 和 PEGASUS
  2. 咸蛋超人的CxImage学习之路(一)
  3. sam格式的结构和意义_sam概述
  4. OpenStack之Live-migration
  5. 以自动化为“遮羞布”,亚马逊掩盖了惊人的工伤记录
  6. 微软出品的Python小白神器,真香!
  7. pip指定网址下载安装(清华源)
  8. MEPR500+电子护照阅读器|识读模块嵌入式安装与应用说明
  9. 游戏数据库数据管理系统开发体会
  10. Application loader:ERROR ITMS-90168: The binary you uploaded was invalid.