栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

下载软件后,cmd启动

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

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

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

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


 com.alibaba.cloud
 spring-cloud-starter-alibaba-sentinel

在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();
    }
    
    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 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);
    }
    
    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模块添加依赖


 com.alibaba.csp
 sentinel-datasource-nacos
 1.7.0

添加配置

# 这里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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号