SpringCloudAlibaba集成Sentinel——限流
摘要:
Sentinel对应SpringCloud一代组件的就是Hystrix熔断器,不过它比熔断器更加的强大,其主要目的是流量控制和服务熔断,流量控制就是限流,限制服务器请求的并发数量,阻止高并发的流量冲垮服务器,熔断就是类似于Hystrix了,主要是为了保护整个微服务不被某一节点故障而拖垮
一:下载Sentinel客户端
在jar包下新建一个bat命令,输入指令:java -jar -Dserver.port=1111 sentinel-dashboard-1.8.2.jar启动jar包
二:访问控制面板:localhost:1111/#/login,账号密码都是sentinel
三:先集成Nacos客户端,再集成Sentinel客户端,引入客户端依赖【要对哪个微服务限流就集成在哪个服务中】
<!--sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
四:修改配置文件application.yml,将本服务注册进Sentinel【有远程的修改远程,没有修改本地】
server:
port:1010 #user服务端口号
spring:
application:
name: user-server #应用名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #指定nacos注册中心地址
sentinel:
transport:
dashboard: localhost:1111 #指定sentinel服务端地址
五:启动服务,访问服务的接口后我们就可以在Sentinel的控制面板中的簇点链路查看到当前的接口了,我们可以在此处为此接口设置限流熔断等策略
六:服务降级——本类降级【当服务限流后返回托底数据】
为什么要返回托底数据?因为如果我们设置了限流策略,当限流被激活的时候,Sentinel默认为我们返回一个Blocked Sentinel(flow limiting)的提示,这样对于用户不是很友好,我们应当在触发限流后像类似于Hystrix一样为用户返回托底数据,所以服务降级就是为了返回托底数据
步骤:
在需要降级的方法接口上加上注解:
@SentinelResource(value="user-server-getById",blockHandler="degradationMethod")
在本类中编写服务降级方法:degradationMethod
/*
* @Description: 服务降级方法
* @param e: 服务降级方法必须接收的异常参数
**/
public User degradationMethod(@PathVariable("id") Long id, BlockException e){
e.printStackTrace();
return new User(-1L, "服务降级触发!", "当前服务流量过大,请稍后重试!");
}
这样我们配置了限流后,当疯狂刷新触发了限流后,就会返回我们设定的托底数据
七:其他类降级方法
步骤:
创建降级类
package cn.ybl.downgrade;
import cn.ybl.domain.User;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @Description: 服务降级类
*/
public class DowngradeUtil {
/*
* @Description: 服务降级方法
* @param e: 服务降级方法必须接收的异常参数
**/
public static User degradationMethod(@PathVariable("id") Long id, BlockException e){
e.printStackTrace();
return new User(-1L, "服务降级触发!", "当前服务流量过大,请稍后重试!你太快了");
}
}
在需要降级的接口上打上注解:
@SentinelResource(value="user-server-getById", blockHandler = "degradationMethod", blockHandlerClass = DowngradeUtil.class)
这样我们配置了限流后,当疯狂刷新触发了限流后,就会返回我们设定的托底数据
八:流控规则持久化
我们的Sentinel控制中心的流控配置是存储在内存中的,所以当我们配置了限流策略后,如果重启服务,策略就会丢失,所以需要设置持久化,Sentinel支持5种持久化方案:file、redis、nacos、zk和apollo,这里是采用Nacos的方式
1.引入依赖【需要对哪个服务的接口限流就在哪个服务引入】
<!--Sentinel使用Nacos持久化限流规则依赖包-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.5.2</version>
</dependency>
2.在Nacos中的配置中心public下新增流控规则的JSON文件
[
{
"resource": "user-server-getById",
"limitApp": "default",
"grade": 1,
"count": 10,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
resource:对user-server服务的getById接口进行限流 limitApp:流控的调用者,default代表不区分调用者 grade:限流方式,0为并发数量限流,1为QPS限流 count:限流阈值,达到阈值则限流 strategy:基于调用链的流控策略,0为直接,1为关联,2为链路 controlBehavior:流控效果,0为直接拒绝,1为Warm Up渐进式,2为匀速排队 clusterMode:是否集群
3.修改服务的配置文件,优先修改云端的,因为服务会优先读取云端的配置文件application.yml,主要就是增加了datasource
server:
port: 1010 # user服务端口号
spring:
application:
name: user-server # 应用名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 指定nacos注册中心地址
sentinel:
transport:
dashboard: localhost:1111 # 指定sentinel服务端地址
datasource:
flow:
nacos: #限流持久配置
server-addr: localhost:8848 #使用nacos的持久
dataId: application-user-limit #获取限流配置文件的数据源的dataId
groupId: DEFAULT_GROUP
rule-type: flow #类型:限流
如此配置后,每次服务启动的时候都会去读取云端我们配置的JSON配置文件,从而也就做到了流控规则的持久化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~