项目中使用Sentinel流量控制,nacos配置持久化

Sentinel 以流量为切入点,从流量控制、熔 断降级、系统负载保护等多个维度保护服务的稳定性。

下载软件后,cmd启动

java -Dserver.port=8088 -jar sentinel-dashboard-1.8.1.jar

 访问localhost:8088,默认账户密码 sentinel

此时页面为空,因为还没有监控任何服务。另外,sentinel是懒加载的,如果服务没有被访问,看不到该服务 信息。

项目中使用,在service模块添加依赖

<!-- 流量控制 -->
<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

在order模块配置文件

# 指定dashboard地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8088
# 启动该服务,会在应用程序的相应服务器上启动HTTP Server,并且该服务器将与Sentinel dashboard进行交互
spring.cloud.sentinel.transport.port=8719

此时创建控制层访问就可加载到sentinel上

QPS流量控制,每秒查询率

当 QPS 超过某个阈值时,采取措施流量控制。流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速 排队。

在sentinel中新增流量控制规则,就可以对访问进行限流处理,

热点规则:可以根据热点值,动态控制流量

使用java代码配置热点值限流,

OrderApiController添加方法

//构造方法
    public OrderInfoController(){
        initRule();
    }
    /**
     * 导入热点值限流规则
     * 也可在Sentinel dashboard界面配置(仅测试)
     */
    public void initRule() {
        ParamFlowRule pRule = new ParamFlowRule("submitOrder")//资源名称,与SentinelResource值保持一致
                //限流第一个参数
                .setParamIdx(0)
                //单机阈值
                .setCount(5);
        // 针对 热点参数值单独设置限流 QPS 阈值,而不是全局的阈值.
        //如:1000(北京协和医院),可以通过数据库表一次性导入,目前为测试
        ParamFlowItem item1 = new ParamFlowItem().setObject("1000")//热点值
                .setClassType(String.class.getName())//热点值类型
                .setCount(1);//热点值 QPS 阈值
        List<ParamFlowItem> list = new ArrayList<>();
        list.add(item1);
        pRule.setParamFlowItemList(list);
        ParamFlowRuleManager.loadRules(Collections.singletonList(pRule));
    }

编写控制层下单接口

@ApiOperation(value = "创建订单")
    @PostMapping("auth/submitOrder/{hoscode}/{scheduleId}/{patientId}")
    @SentinelResource(value = "submitOrder",blockHandler = "submitOrderBlockHandler")
    public R submitOrder(
            @ApiParam(name = "hoscode", value = "医院编号,限流使用", required = true)
            @PathVariable String hoscode,
            @ApiParam(name = "scheduleId", value = "排班id", required = true)
            @PathVariable String scheduleId,
            @ApiParam(name = "patientId", value = "就诊人id", required = true)
            @PathVariable Long patientId) {
        //调用service方法
        //返回订单号
        Long orderId = 1L; //orderService.saveOrders(scheduleId,patientId);
        return R.ok().data("orderId",orderId);
    }
    /**
     * 热点值超过 QPS 阈值,返回结果
     * @param hoscode
     * @param scheduleId
     * @param patientId
     * @param e
     * @return
     */
    public R submitOrderBlockHandler(String hoscode, String scheduleId, Long patientId, BlockException e){
        return R.error().message("系统业务繁忙,请稍后下单");
    }

使用nacos持久化配置

浏览器访问nacos,对持久化内容进行配置

[
 {
 "resource": "/hi",
 "limitApp": "default",
 "grade": 1,
 "count": 2,
 "strategy": 0,
 "controlBehavior": 0,
 "clusterMode": false
 }
]

resource:资源名称 limitApp:限流应用,就是用默认就可以 grade:阈值类型,0表示线程数,1表示qps count:单机阈值 strategy:流控模式,0-直接,1-关联, 2-链路 controlBehavior:流控效果。0-快速失败,1-warm up 2-排队等待 clusterMode:是否集群

在order模块添加依赖

<dependency>
 <groupId>com.alibaba.csp</groupId>
 <artifactId>sentinel-datasource-nacos</artifactId>
 <version>1.7.0</version>
</dependency>

添加配置

# 这里datasource后的consumer是数据源名称,可以随便写,推荐使用服务名
spring.cloud.sentinel.datasource.consumer.nacos.server-addr=127.0.0.1:8848
#nacos中配置的名字
spring.cloud.sentinel.datasour

ce.consumer.nacos.dataId=sentinel-rules
spring.cloud.sentinel.datasource.consumer.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.consumer.nacos.data-type=json
# 规则类型
#authority(授权规则)、degrade(降级规则)、flow(流控规则)、
#param(热点规则)、system(系统规则)五种规则持久化到Nacos中
spring.cloud.sentinel.datasource.consumer.nacos.rule_type=flow

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远走与梦游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值