Hystrix服务雪崩
分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图

如果各个服务正常运行,那大家齐乐融融,高高兴兴的,但是如果其中一个服务崩坏掉会出现什么样的情况呢?如下图

引起雪崩的原因和服务雪崩的三个阶段
第一个是:硬件故障
第二个是:程序Bug;
第三个是:缓存击穿(用户大量访问缓存中没有的键值,导致大量请求查询数据库,使数据库压力过大);
第四个是:硬件故障
首先需要在消费端的pom文件引入

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

开启熔断
在启动类 ConsumerApplication 上添加注解:@EnableCircuitBreaker

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class ConsumerApplication {
// ...
}

可以看到,我们类上的注解越来越多,在微服务中,经常会引入上面的三个注解,于是Spring就提供了一个组合注解:@SpringCloudApplication

编写降级逻辑
当目标服务的调用出现故障,我们希望快速失败,给用户一个友好提示。因此需要提前编写好失败时的降级处理逻辑,要使用HystrixCommand来完成。

@RestController
@RequestMapping("/consumer")
@Slf4j
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallback")
public String queryById(@PathVariable Long id) {
String url = "http://user-service/user/" + id;return restTemplate.getForObject(url, String.class);
}
public String queryByIdFallback(Long id) {log.error("查询用户信息失败。id:{}", id);return "对不起,网络太拥挤了!";}
}

当 生产者正常提供服务时,访问与以前一致。但是当将 生产者 停机时,会发现页面返回了降级处理信息

超时设置
Hystrix的默认超时时长为1,我们可以通过配置application.yml来改变超时时间

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000

熔断原理
在服务熔断中,使用的熔断器,也叫断路器,其英文单词为:Circuit Breaker 熔断机制与家里使用的电路熔断原理类似;当如果电路发生短路的时候能立刻熔断电路,避免发生灾难。在分布式系统中应用服务熔断后;服务调用方可以自己进行判断哪些服务反应慢或存在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续请求直接拒绝,一段时间(默认5秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打开,拒绝请求的服务。
Hystrix的熔断状态机模型

状态机有3个状态
1.Closed:关闭状态(断路器关闭),所有请求都正常访问。
2.Open:打开状态(断路器打开),所有请求都会被降级。Hystrix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
3.Half Open:半开状态,不是永久的,断路器打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会关闭断路器,否则继续保持打开,再次进行休眠计时

我们可以通过yml来改变

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000 #服务降级超时时间circuitBreaker:errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20

Feign
在消费者中

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

开启Feign功能
在 ConsumerApplication 启动类上,添加注解,开启Feign功能

@SpringCloudApplication
@EnableFeignClients //开启feign功能
public class ConsumerApplication {
public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();}
}

负载均衡
Feign中本身已经集成了Ribbon依赖和自动配置:

Fegin内置的ribbon默认设置了请求超时时长,默认是1000,我们可以通过手动配置来修改这个超时时长

ribbon:ReadTimeout: 2000 # 读取超时时长ConnectTimeout: 1000 # 建立链接的超时时长

或者为某一个具体service指定

user-serviceribbon:ReadTimeout: 2000 # 读取超时时长ConnectTimeout: 1000 # 建立链接的超时时长

因为ribbon内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试,可以添加配置:

ribbon:ConnectTimeout: 1000 # 连接超时时长ReadTimeout: 2000 # 数据通信超时时长MaxAutoRetries: 0 # 当前服务器的重试次数MaxAutoRetriesNextServer: 0 # 重试多少次服务OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试

Gateway网关

简介
Spring Cloud Gateway是Spring官网基于Spring 5.0、 Spring Boot 2.0、Project Reactor等技术开发的网关服务。
Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。
Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。
Spring Cloud Gateway是替代Netflix Zuul的一套解决方案。
Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,
从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册到Eureka服务注册中心

核心概念
路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的
ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于HTTP Request中的任何信息比如请求头和参数。
过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理
穿件一个新的工程

导入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>lxs-springcloud</artifactId><groupId>com.kkb</groupId><version>1.0-SNAPSHOT</version>
</parent><modelVersion>4.0.0</modelVersion><artifactId>gateway</artifactId>
<dependencies>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
</dependencies>
</project>

编写GatewayApplication启动类

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

编写yml

server:port: 10010
spring:application:name: api-gatewaycloud:gateway:routes:
# 路由id,可以随意写- id: user-service-route# 代理的服务地址# uri: HTTP://127.0.0.1:9091uri: lb://user-service
# 路由断言,可以配置映射路径
predicates:
- Path=/user/**
eureka:client:service-url:defaultZone: HTTP://127.0.0.1:10086/eureka
instance:prefer-ip-address: true

启动测试
在日志中就能看见负载均衡器:

Spring Cloud(Hystrix,Gateway)相关推荐

  1. Spring Cloud(微服务简介)

    一.什么是微服务 通常而言,微服务架构是一种架构模式,或者说是一种架构风格,它提倡将单一的应用程序划分成一组小的服务每个服务运行在独立的进程内,服务之间互相协调,互相配置,为用户提供最终价值.服务之间 ...

  2. Spring Cloud(五)断路器监控(Hystrix Dashboard)

    在上两篇文章中讲了,服务提供者 Eureka + 服务消费者 Feign,服务提供者 Eureka + 服务消费者(rest + Ribbon),本篇文章结合,上两篇文章中代码进行修改加入 断路器监控 ...

  3. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失(续)

    前言 上篇文章<Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失>我们对ThreadLocal数据丢失进行了详细的分析,并通过代码的方式复现了这个问题. ...

  4. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

    前言 在上一篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑.实 ...

  6. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  7. Spring Cloud(十一):Hystrix服务熔断-工作流程

    1. Hystrix服务熔断 1.1 断路器 类似保险丝 1.2 熔断是什么 熔断机制是应对雪崩效应的一种微服务链路保护机制.当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而 ...

  8. Spring Cloud Netfix Hystrix(断路器)

    一.灾难性雪崩 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者(Application Service)不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等. 重试加大流量.如 ...

  9. Spring Cloud(一):Spring Cloud的优势是什么?

    Spring Cloud 作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面. 本次分享主要解答这两个问题:Spring Cloud 在微服务的架构中都做了哪些事情?Spring Cloud ...

最新文章

  1. shell-while循环
  2. 数据结构与算法基础知识集锦
  3. hdu 1574(01背包)
  4. dataset中的数据批量导入oracle数据库,c#如何将dataset中的数据批量导入oracle数据库...
  5. 6-1 数组函数练习
  6. CSS 如何让Table的里面TD全有边框 而Table的右左边框没有
  7. python和ui设计,PySide2相当于PyQt5的loadUiType(),用于在UI设计中动态混合
  8. [渝粤教育] 西南科技大学 国际贸易理论与实务 在线考试复习资料2021版(1)
  9. 自然语言5——初学者书籍
  10. mavan自动化接管浏览器_人工智能与自动化:接管还是共生?
  11. hrm系统源码php,开源HRM源码系统下载
  12. 12 初探肿瘤异质性
  13. 霍纳法则c语言算法代码,霍纳法则(Horner's rule)
  14. 使用python绘制3维正态分布图
  15. JavaScript基本第一天总结
  16. tomcat加白名单_[WebServer] Tomcat 配置访问限制:访问白名单和访问黑名单
  17. 厦门大学计算机学院考研报录人数,院校情报局 | 厦门大学近5年报考人数及录取人数大汇总!...
  18. 关于奇异值分解(SVD)的理解
  19. 如何通过IP找到地址?
  20. imac 网络安装系统 服务器时间,Mac 重装系统教程(二):网络在线重装

热门文章

  1. android智能手机排行,800万像素智能手机排行_...Android智能手机排行 明系列领衔...
  2. 关于共轭向量的两个证明
  3. 【Debug经验】低电压电流模Bandgap电路DC温度曲线异常
  4. 逻辑回归(LR)的原理及其推导
  5. JSON在线格式化工具
  6. Java编程常用英语汇总,让你写程序不再困难
  7. input输入框长度
  8. 苹果自动关机_OPPO手机开机10秒奇葩自动关机,修过没修好,原来是这个小件坏了...
  9. 中荣股份深交所上市破发:公司市值47亿 家族色彩浓厚
  10. PS5选区及选区工具