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配置文件,从而也就做到了流控规则的持久化

posted @   yyybl  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示