目录
- 源码及官网
- Sentinel是什么?
- Sentinel解决的问题是什么?
- Sentinel和Hystrix对比
- Sentinel控制台搭建
- SpringcloudAlibaba整合Sentinel
- 微服务和Sentinel Dashboard通信原理
源码及官网
源码地址:https://github.com/alibaba/Sentinel
官方文档:https://github.com/alibaba/Sentinel/wiki
Sentinel是什么?
Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性
Sentinel解决的问题是什么?
问题出现
在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务。当其中一个服务不可用时,就会出现线程池里所有线程都因等待而被阻塞,从而造成服务雪崩。
服务雪崩:因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程,就叫服务雪崩效应。导致服务不可用的原因: 程序Bug,大流量请求,硬件故障,缓存击穿。
在服务提供者不可用的时候,会出现大量重试的情况:用户重试、代码逻辑重试,这些重试最终导致:进一步加大请求流量。所以归根结底导致雪崩效应的最根本原因是:大量请求线程同步等待造成的资源耗尽。当服务调用者使用同步调用时, 会产生大量的等待线程占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。
解决方案
- 超时机制:请求超时,就释放资源。由于释放资源速度较快,一定程度上可以抑制资源耗尽的问题。
- 服务限流(资源隔离):限制请求核心服务提供者的流量,使大流量拦截在核心服务之外,这样可以更好的保证核心服务提供者不出问题。
- 服务熔断:远程服务不稳定或网络抖动时暂时关闭,就叫服务熔断。当依赖的服务有大量超时时,在让新的请求去访问根本没有意义,只会无谓的消耗现有资源。比如:我们设置了超时时间为1s,如果短时间内有大量请求在1s内都得不到响应,就意味着这个服务出现了异常,此时就没有必要再让其他的请求去访问这个依赖了,这个时候就应该使用断路器避免资源浪费。
- 服务降级:有服务熔断,必然要有服务降级。 所谓降级,就是当某个服务熔断之后,服务将不再被调用,此时客户端可以自己准备一个本地的fallback(回退)回调, 返回一个缺省值。
Sentinel和Hystrix对比
Sentinel控制台搭建
-
根据(一)Nacos注册中心集群环境搭建中的版本说明,选择适配版本下载jar包,下载地址:https://github.com/alibaba/Sentinel/releases
-
解压后,在可以在解压后的文件下添加application.properties配置文件:
#spring settings server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true #cookie name setting server.servlet.session.cookie.name=sentinel_dashboard_cookie #logging settings logging.level.org.springframework.web=INFO logging.file.name=${user.home}/logs/csp/sentinel-dashboard.log logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n #logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n #auth settings auth.filter.exclude-urls=/,/auth/login,/auth/logout,/registry/machine,/version auth.filter.exclude-url-suffixes=htm,html,js,css,map,ico,ttf,woff,png #登录用户名/密码 # If auth.enabled=false, Sentinel console disable login auth.username=sentinel auth.password=sentinel # Inject the dashboard version. It's required to enable # filtering in pom.xml for this resource file. sentinel.dashboard.version=1.8.5 # port 端口 server.port=8001
-
启动控制台:
#启动命令 nohup java -jar sentinel‐dashboard‐1.8.1.jar & #查看启动日志 tail -f nohup.out
-
访问控制台:http://192.168.145.129:8001/#/login 用户名/密码:sentinel/sentinel
-
启动成功,注: Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
SpringcloudAlibaba整合Sentinel
- 引入依赖
<!--actuator--> <!--添加Sentinel后,需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的--> <!--所以需要引入依赖并设置,测试 http://localhost:8800/actuator/sentinel--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--流控规则基于nacos推送--> <!--由于控制台配置的规则是在内存中没有进行持久化的,这里选择使用nacos进行持久化--> <!-- Sentinel Datasource Nacos 依赖 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
- 添加相关配置:
spring: application: name: mall‐user‐sentinel‐demo cloud: nacos: discovery: server‐addr: 127.0.0.1:8848 sentinel: transport: # 添加sentinel的控制台地址 dashboard: 127.0.0.1:8080 # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer # port: 8719 #暴露actuator端点 management: endpoints: web: exposure: include: '*'
3.使用注解
@SentinelResource(value = "**",blockHandlerClass = **.class,
blockHandler = "**",fallbackClass = **.class,fallback = "**")
4.nacos中规则配置,这里只是一个例子,具体参数含义和json可以参照官网文档
[
{
"resource": "**", //资源名
"limitApp":"default", //针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
"grade":1, //阈值类型 QPS(1)和线程数(2)
"count":2, //单机阈值
"strategy":0, //流控模式
"controlBehavior":0 //流控效果
}
]
微服务和Sentinel Dashboard通信原理
Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制 台,架构图如下所示: