欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-08-01

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

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。