Sentinel 以流量为切入点,从流量控制、熔 断降级、系统负载保护等多个维度保护服务的稳定性。
下载软件后,cmd启动
java -Dserver.port=8088 -jar sentinel-dashboard-1.8.1.jar
访问localhost:8088,默认账户密码 sentinel
此时页面为空,因为还没有监控任何服务。另外,sentinel是懒加载的,如果服务没有被访问,看不到该服务 信息。
项目中使用,在service模块添加依赖
在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
编写控制层下单接口
@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模块添加依赖
添加配置
# 这里datasource后的consumer是数据源名称,可以随便写,推荐使用服务名
spring.cloud.sentinel.datasource.consumer.nacos.server-addr=127.0.0.1:8848
#nacos中配置的名字
spring.cloud.sentinel.datasource.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