IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringCloud Alibaba环境集成之sentinel -> 正文阅读

[Java知识库]SpringCloud Alibaba环境集成之sentinel

作者:token annotation punctuation

前言

本文依托于

在SpringCloud Alibaba的使用过程中,我总结为如下步骤:

  • 下载并启动服务端
  • 客户端引入spring-cloud-starter-alibaba的jar包
  • 客户端properties或yml加入相关配置
  • 客户端加上相应的注解开启功能
  • 服务端增加相应配置
  • 数据持久化,服务端集群部署

sentinel服务端

1.下载sentinel

https://github.com/alibaba/Sentinel/releases/

在这里插入图片描述

2.启动sentinel服务
java -jar sentinel-dashboard-1.8.4.jar

在这里插入图片描述

3.访问sentinel服务

sentinel默认端口为8080,用户名:sentinel,密码:sentinel,上下文为空,路径不需要加sentinel

http://127.0.0.1:8080/

在这里插入图片描述

sentinel客户端

1.引入jar
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.properties加入配置
# 应用名称
spring.application.name=springcloud-alibaba-sentinel
server.port=9007
# Sentinel 控制台地址
spring.cloud.sentinel.transport.dashboard=192.168.43.11:8080
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
# feign中激活sentinel,有些类似hystrix
feign.sentinel.enabled=true
3.加入注解@SentinelResource
package com.ykq.springcloudalibabasentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: kqyin
 * @date: 2022/3/25 11:14
 * @Description:
 */
@RestController
public class SentinelController {

    /**
     * @Author kqyin
     * @Date 2022/3/25 16:30
     * @Description 测试限流
     */
    @SentinelResource(value = "sentinelTestA", blockHandler = "handleTestA")
    @RequestMapping(value = "/sentinelTestA")
    public String sentinelTestA() {
        return "sentinelTestA";
    }

    public String handleTestA(BlockException blockException) {
        return "sentinelTestA is limited";
    }

    /**
     * @Author kqyin
     * @Date 2022/3/25 16:30
     * @Description 测试熔断降级
     */
    @SentinelResource(value = "sentinelTestB", fallback = "testBFallBack", blockHandler = "handleTestB")
    @RequestMapping(value = "/sentinelTestB")
    public String sentinelTestB() {
        //return "sentinelTestB";
        throw new RuntimeException("sentinelTestB throw RuntimeException");
    }

    public String handleTestB(BlockException blockException) {
        return "sentinelTestB is limited";
    }

    public String testBFallBack() {
        return "sentinelTestB is stop";
    }
}

4.在sentinel配置相关信息
(1)配置限流规则

qps每秒多少次请求。下图表示在单机情况下,超过每秒3次请求就快速失败。
对应资源为代码中@SentinelResource值为sentinelTestA的代码。
在这里插入图片描述

(2)配置熔断规则

在1000ms内,请求2次及以上,失败概率为100%的,熔断5秒
对应资源为代码中@SentinelResource值为sentinelTestB的代码。
在这里插入图片描述

5.blockHandler不生效

@SentinelResource中的value和@RequestParam中的value不要一致。我测试时,两者一致,导致出现规则生效,但blockHandler大概率失效的情况。这是因为sentinel将方法已经定义为资源,value为@RequestParam的值
在这里插入图片描述

sentinel数据持久化

我们可以注意到,在sentinel中配置的规则,在客户端重启后,就失效了。这是因为规则默认保存在客户端的内存中,生产上是不允许这样使用的。需要将规则持久化到nacos配置中心。

1.引入jar
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.4</version>
</dependency>
2.properties加入配置
# 资源sentinelTestA持久化到nacos配置
spring.cloud.sentinel.datasource.sentinelTestA.nacos.username=nacos
spring.cloud.sentinel.datasource.sentinelTestA.nacos.password=nacos
spring.cloud.sentinel.datasource.sentinelTestA.nacos.server-addr=192.168.43.11:8000
spring.cloud.sentinel.datasource.sentinelTestA.nacos.dataId=${spring.application.name}-sentinelTestA
spring.cloud.sentinel.datasource.sentinelTestA.nacos.groupId=SENTINEL_GROUP
# 规则:flow流控规则,degrade降级规则,authority授权规则,system系统规则, param-flow热点key规则
spring.cloud.sentinel.datasource.sentinelTestA.nacos.rule-type=flow
spring.cloud.sentinel.datasource.sentinelTestA.nacos.data-type=json

# 资源sentinelTestB持久化到nacos配置
spring.cloud.sentinel.datasource.sentinelTestB.nacos.username=nacos
spring.cloud.sentinel.datasource.sentinelTestB.nacos.password=nacos
spring.cloud.sentinel.datasource.sentinelTestB.nacos.server-addr=192.168.43.11:8000
spring.cloud.sentinel.datasource.sentinelTestB.nacos.dataId=${spring.application.name}-sentinelTestB
spring.cloud.sentinel.datasource.sentinelTestB.nacos.groupId=SENTINEL_GROUP
# 规则:flow流控规则,degrade降级规则,authority授权规则,system系统规则, param-flow热点key规则
spring.cloud.sentinel.datasource.sentinelTestB.nacos.rule-type=degrade
spring.cloud.sentinel.datasource.sentinelTestB.nacos.data-type=json
3.nacos配置规则

可以注意到,当nacos中配置的规则修改后,可以同步到sentinel的服务,但是sentinel修改后,不能修改nacos中的配置,只能保存到内存中。

(1)配置参数来源

规则配置的参数名,可以在AbstractRule的几个实现类中去查看,分别是

  • FlowRule(流控规则)
  • DegradeRule(熔断规则)
  • ParamFlowRule(热点规则)
  • SystemRule(系统规则)
  • AuthorityRule(授权规则)
    在这里插入图片描述
(2)流控规则

FlowRule(流控规则)参数

    /**
     * The threshold type of flow control (0: thread count, 1: QPS).
     * 限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制 
     */
    private int grade = RuleConstant.FLOW_GRADE_QPS;

    /**
     * Flow control threshold count.
     * 限流阈值
     */
    private double count;

    /**
     * Flow control strategy based on invocation chain.
     * 调用关系限流策略
     *
     * {@link RuleConstant#STRATEGY_DIRECT} for direct flow control (by origin);
     * {@link RuleConstant#STRATEGY_RELATE} for relevant flow control (with relevant resource);
     * {@link RuleConstant#STRATEGY_CHAIN} for chain flow control (by entrance resource).
     */
    private int strategy = RuleConstant.STRATEGY_DIRECT;

    /**
     * Reference resource in flow control with relevant resource or context.
     */
    private String refResource;

    /**
     * Rate limiter control behavior.
     * 0. default(reject directly), 1. warm up, 2. rate limiter, 3. warm up + rate limiter
     */
    private int controlBehavior = RuleConstant.CONTROL_BEHAVIOR_DEFAULT;

    private int warmUpPeriodSec = 10;

    /**
     * Max queueing time in rate limiter behavior.
     */
    private int maxQueueingTimeMs = 500;

	/**
	 * 是否为集群模式
	 */
    private boolean clusterMode;
    
    /**
     * Flow rule config for cluster mode.
     */
    private ClusterFlowConfig clusterConfig;

    /**
     * The traffic shaping (throttling) controller.
     */
    private TrafficShapingController controller;

在这里插入图片描述

(3)熔断规则

DegradeRule(熔断规则)参数

    /**
     * Circuit breaking strategy (0: average RT, 1: exception ratio, 2: exception count).
     * 0:慢
     */
    private int grade = RuleConstant.DEGRADE_GRADE_RT;

    /**
     * Threshold count.
     */
    private double count;

    /**
     * Recovery timeout (in seconds) when circuit breaker opens. After the timeout, the circuit breaker will
     * transform to half-open state for trying a few requests.
     */
    private int timeWindow;

    /**
     * Minimum number of requests (in an active statistic time span) that can trigger circuit breaking.
     *
     * @since 1.7.0
     */
    private int minRequestAmount = RuleConstant.DEGRADE_DEFAULT_MIN_REQUEST_AMOUNT;

    /**
     * The threshold of slow request ratio in RT mode.
     */
    private double slowRatioThreshold = 1.0d;

    private int statIntervalMs = 1000;

在这里插入图片描述

4.sentinel规则同步到nacos

https://blog.didispace.com/spring-cloud-alibaba-sentinel-2-4/

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:43:27  更:2022-05-10 11:43:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:53:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码