Sentinel 学习笔记
作者:王珂
邮箱:49186456@qq.com
文章目录
- Sentinel 学习笔记
- @[TOC]
- 前言
- 一、基础概念
- 二、Sentinel控制台
- 2.1 安装控制台
- 2.2 簇点链路
- 2.3 请求限流
- 2.4 线程隔离
- 2.5 服务降级
- 2.6 服务熔断
- 三、Sentinel客户端
- 3.1 原始Jar包客户端
- 3.2 SpringCloudAlibaba客户端
文章目录
- Sentinel 学习笔记
- @[TOC]
- 前言
- 一、基础概念
- 二、Sentinel控制台
- 2.1 安装控制台
- 2.2 簇点链路
- 2.3 请求限流
- 2.4 线程隔离
- 2.5 服务降级
- 2.6 服务熔断
- 三、Sentinel客户端
- 3.1 原始Jar包客户端
- 3.2 SpringCloudAlibaba客户端
前言
本文介绍微服务组件Sentinel的主要功能,环境搭建和组件使用。其中涉及到相关的一些基础概念,也对其进行的解释以便对组件的理解和使用。
同时,介绍了在实际工作中使用Sentinel常用的步骤和操作。希望通过本文对你快速理解和上手使用Sentinel提供帮助。
官网:
https://sentinelguard.io/zh-cn/index.html
一、基础概念
服务雪崩
微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,称为雪崩。
原因:
-
服务提供者出现故障或阻塞
-
服务调用者没有做好异常处理,导致自身故障
解决:
-
服务保护方案
1)请求限流:限制访问微服务请求的并发量,避免服务因流量激增而出现故障。
2)线程隔离:限定每个业务能够使用的线程数而将故障业务隔离,避免故障扩散。3)服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值就会熔断该业务,则拦截该接口的请求。熔断期间,所有请求快速失败,全部都走fallback逻辑。
熔断避免了无效的资料浪费
服务保护技术
Sentinel Hystrix 线程隔离 信号量隔离 线程池隔离/信号量隔离 熔断策略 基于慢调用比例或异常比例 基于异常比例 限流 基于QPS,支持流量整形 优先支持 Fallback 支持 支持 控制台 开箱即用,可配置规则,查看秒级监控,机器发现等 不完善 配置方式 基于控制台,重启失效 基于注解或配置文件,永久生效 Sentinel的使用分为两个部分:
-
核心库(jar包):不依赖任何框架/库,能够运行Java 8及以上的版本运行环境,同时对 Dubbo / Spring Cloud等框架也有较好的支持,在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
- 控制台:Dashboard主要负责管理推送规则、监控、管理机器信息等。
二、Sentinel控制台
Sentinel 控制台可以查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
规则管理和推送:统一管理推送规则。
鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
2.1 安装控制台
1)下载dashborad
https://github.com/alibaba/Sentinel/releases/download/1.8.7/sentinel-dashboard-1.8.7.jar
或者下载源码编译打包
下载源码
https://github.com/alibaba/Sentinel/archive/refs/tags/1.8.7.tar.gz
打包
mvn -Dmaven.test.skip=true clean package
sentinel-dashboard.jar位于/sentinel-dashboard/target目录下。
2)启动
java -Dserver.port=8719 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
启动命令可以带的参数
// 控制台端口
-Dserver.port=8719
// 此配置可以监控sentinel控制台自己
-Dcsp.sentinel.dashboard.server=localhost:8858
// 名称
-Dproject.name=sentinel-dashboard
3)访问控制台
http://localhost:8719
账号:sentinel / sentinel
2.2 簇点链路
簇点链路就是单机调用链路(单个微服务内部)。是一次请求进入服务后经过的每一个被Sentinel监控的资源。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口,即Controller接口)。限流、熔断等都是针对簇点链路中资源设置的。而资源名默认就是接口的请求路径。
Restful风格的API请求路径一般相同(请求方式不同,有GET, POST, PUT, DELETE …),这会导致簇点资源名称重复。因此我们要修改配置,把请求路径+请求方式做为簇点的资源名称,
需要如下配置,完整配置详解3.2控制台配置
http-method-specify: true # 开启请求方式前缀
2.3 请求限流
限流表示限制接口每秒处理请求的数量
在簇点链路后面点击【流控】按钮,即可对其做限流配置
2.4 线程隔离
线程隔离,是指限制某个服务可用的线程数。
在购物车服务中需要查询商品信息,但此时商品服务出现了阻塞或故障。如果此时购物车服务没有资源限制,一直接收请求,分配线程进行处理,很快就会将容器的资源耗尽。此时购物车服务中的其它业务(业务接口2)也会因为容器资源的耗尽而处理缓慢,进而引起服务的雪崩问题。
此时如果给购物车服务中的查询商品信息接口限制其使用的线程数,当线程数到达阈值后不再分配资源,这种方式称为线程隔离。
server:
tomcat:
# tomcat允许最大的请求数,默认8192
max-connections: 8192
# tomcat允许排队的连接队列长度,默认100。
# 当tomcat处理连接的线程池慢时,请求的连接会排队,设置最大的排队数量
accept-count: 100
threads:
# tomcat最大的线程数,默认200
max: 200
2.5 服务降级
在购物车服务中需要查询商品信息,如果此时商品服务出现了阻塞或故障,此时服务就不会报错,会走fallback逻辑,快速响应(防止该服务无响应)。
实现服务降级,需要以下步骤
1)将FeignClient做为Sentinel的簇点资源
feign:
sentinel:
enabled: true # true: sentinel的簇点资源开启,默认为false
2)FeignClient添加fallback逻辑
-
FallbackClass
TODO
-
FallbackFactory(推荐)
给UserClient添加FallbackFactory
@FeignClient(value = "userService") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
① 自定义FallbackFacotry
public class UserClientFallbackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable throwable) { // 创建UserClient接口的实现类,实现其中的方法 return new UserClient() { @Override public User findById(Long id) { log.error("查询用户失败", throwable); return null; } } } }
② 将UserClientFallbackFactory注册为bean
@Bean public UserClientFallbackFacotry userClientFallbackFacotry() { return new UserClientFallbackFacotry(); }
③ 在UserClient中使用UserClientFallbackFacotry
@FeignClient(value = "userService", fallbackFactory = UserClientFallbackFacotry .class) public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
2.6 服务熔断
熔断是解决雪崩问题的重要手段,由断路器统计服务的异常比例、慢服务比例,如果超出了阈值则会熔断服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
熔断主要是有一个断路器,达到比例后拒绝发起请求,直接走fallback。
断路器有3个状态Closed, Open, Half-Open
在Sentinel中配置熔断,熔断策略有:慢调用比例,异常比例,异常数
三、Sentinel客户端
3.1 原始Jar包客户端
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信
1)引入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>x.y.z</version>
</dependency>
2)配置启动参数
启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port
指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx
指定客户端监控 API 的端口(默认是 8719)。
除了修改 JVM 参数,也可以通过配置文件取得同样的效果。
更多详细信息:
https://sentinelguard.io/zh-cn/docs/startup-configuration.html
3.2 SpringCloudAlibaba客户端
1)引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2)配置控制台
spring:
cloud:
sentinel:
transport:
dashboard: ${IP: localhost}:${PORT: 8719}
http-method-specify: true # 开启请求方式(GET, POST, ...)做为资源名称