服务容错
服务容错的背景:
服务容错是高并发所带来的问题,在微服务架构中,服务于服务之间可以互相调用,但是由于网络原因或者自身的原因,我们并不能保证服务一直可以使用。所以当一个服务出现了问题,我们在调用这个服务的时候就会出现线程阻塞的情况,此时如果有大量的请求涌入,就会出现多线程阻塞等待,从而导致服务器瘫痪,由于服务之间的依赖性,故障就会传播上去,最终导致服务器整个崩溃。这就是“雪崩效应”。
常见的服务容错模式:
1、超时:最简单的容错方式,在调用方为服务调用设置一个超时时间,避免无限制的等待下游系统造成的线程堆积。
2、限流:在提供方一端限制进入的流量,保证服务不会因为超负荷流量而崩溃。
3、仓壁模式:资源的隔离手段。在调用方进行资源隔离,比如线程池,保证消耗的资源有上限,避免无限量调用资源占用其它请求的资源。
4、熔断器:在调用方进行控制,根据策略定义失败情况,失败数字达到阀值时打开熔断器,不再调用底层服务,熔断器窗口(一段时间后)达到时,释放一个请求进入底层,如果请求执行成功则关闭熔断器,正常调用,如果请求失败则继续保持熔断器打开知道下一个熔断窗口达到。
5、降级:为服务提供一个托体方案,一旦服务无法正常调用,就使用这个托底方案。
sentinel的基本使用
概念:sentinel是以流量为切入点,从流量控制、熔断降级、系统负载保护等多个方面保护服务的稳定性。
sentinel的使用:
1、添加依赖
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<!--排除依赖,解决@RestController的类返回为xml格式的问题-->
<exclusions>
<exclusion>
<artifactId>jackson-dataformat-xml</artifactId>
<groupId>com.fasterxml.jackson.dataformat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、修改配置:暴露actutor的端点
# 应用名称
spring:
application:
name: sentineldemo
cloud:
nacos:
discovery:
server-addr: localhost:8848
server:
port: 8005
# actuator
management:
endpoints:
web:
exposure:
include: '*'
3、整合sentinel控制台,sentinel控制台是懒加载,所以我们需要先发请求,才能看到配置
4、下载jar包,启动
java -Dserver.port=8840 -Dcsp.sentinel.dashboard.server=localhost:8840 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
5、修改应用配置、链接sentinel-dashboard