惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
P
Proofpoint News Feed
The Hacker News
The Hacker News
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
AWS News Blog
AWS News Blog
S
Securelist
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
IT之家
IT之家
腾讯CDC
WordPress大学
WordPress大学
Spread Privacy
Spread Privacy
C
Check Point Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Engineering at Meta
Engineering at Meta
Latest news
Latest news
A
About on SuperTechFans
The Register - Security
The Register - Security
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
T
Tailwind CSS Blog
Simon Willison's Weblog
Simon Willison's Weblog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
T
Tor Project blog
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
B
Blog RSS Feed
Scott Helme
Scott Helme
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
NISL@THU
NISL@THU
P
Privacy International News Feed
Security Latest
Security Latest
Recorded Future
Recorded Future
L
LangChain Blog
Cyberwarzone
Cyberwarzone
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
O
OpenAI News
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale

博客园 - Doyourself!

rocketmq 启动后 在mq console界面的consumer的Quantity数量显示为0 问题记录 python 切换版本后 提示 无法在python 3.11(.venv)(D:/my_rag_bot/.venv/Scripts/python.exe)设置 python sdk,该sdk似乎无效 记录一次日志告警随着nacos文件动态刷新而失效的问题 多个WebMvcConfigurer配置Jackson2ObjectMapperBuilder不生效问题记录 自定义拦截器不生效问题记录 记录一次nginx能通但是请求一直不了的问题 idea远程连接并本地打包到远程服务器 记一次生产环境内存溢出记录 凤凰架构总结 JVM虚拟机总结 记录一次首页优化的经历 使用sharding-jdbc做分库分表记录 使用druid自定义拦截器 记录一次 maven 子模块相互依赖导致的父模块无法动态升级的问题 'parent.relativePath' points at wrong local POM 雪花算法snowflakeIdWorker使用记录 全局调用链路traceId网关到业务层、feign调用统一问题记录 Spring Cloud 的ribbon的饥饿加载机制 打印mq异常消息记录 根据druid将慢sql通过钉钉的方式进行告警功能记录
sentinel接入记录
Doyourself! · 2024-10-11 · via 博客园 - Doyourself!

      1.引入pom依赖

<!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

<!-- SpringCloud ailibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-web-servlet</artifactId>
        </dependency>

        <!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

        <!-- 引入 Sentinel 数据源 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
        </dependency>
<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
    </dependency>

 版本好统一按照

<version>1.8.3</version> 
为例。

2.本机启动
首先需要再idea的启动脚本添加命令

-Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=项目别名

 其中,-Dserver.port是自己的项目名称,-Dcsp.sentinel.dashboard.server  是sentinel开启控制台的端口号,-Dproject是自己的项目名称

3.再项目里面使用sentinel做限流

    sentinel 有两种方式都可以做限流和降级,一种方式是直接再spring bean里面使用fallback以及blockHandler注解,另外一种方式则是和openFeign整合。目前项目里面使用的是第一种方式。

     注意一点,使用sentinel需要相应的bean被spring容器加载进去。

@Service
public class QueryRecommentServiceImpl{

@SentinelResource(value = "queryRecommend", fallback = "getStaticData",blockHandler = "blockExceptionHandler")
    public List<String> queryRecommend(HomeRecommendStreamQuery query, HomeRecommendStreamDto streamDto, String sourceApp) {
  return null;
}



public List<String> getStaticData(HomeRecommendStreamQuery query, HomeRecommendStreamDto streamDto, String sourceApp) {
        logger.info("==========start sentinel 降级策略==========");
        try {
            Random random = new Random();
            int r = random.nextInt(100) + 1;
            logger.debug("========随机从缓存获取一组帖子id:" + r);
            Set<String> stringSet = gwmRedisTemplate.opsForValue().get(RedisConstants.THREAD_HOT_SCORE_KEY + r);

            logger.debug("=========随机从缓存获取帖子result=======" + JSONObject.toJSON(stringSet));
            if (CollectionUtils.isNotEmpty(stringSet)) {
                List<String> stringList = new ArrayList<>(stringSet);

                return stringList;
            } else {
                logger.debug("============读取默认配置数据========" + config.getPostIds());
                return Optional.ofNullable(config.getPostIds()).orElse(Collections.emptyList());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * blockHandler需要设置为static
     *
     * @param ex
     * @return
     */
    public  List<String> blockExceptionHandler(HomeRecommendStreamQuery query, HomeRecommendStreamDto streamDto, String sourceApp,BlockException ex) {
        try {
            Random random = new Random();
            int r = random.nextInt(100) + 1;
            logger.debug("========随机从缓存获取一组帖子id:" + r);
            Set<String> stringSet = gwmRedisTemplate.opsForValue().get(RedisConstants.THREAD_HOT_SCORE_KEY + r);

            logger.debug("=========随机从缓存获取帖子result=======" + JSONObject.toJSON(stringSet));
            if (CollectionUtils.isNotEmpty(stringSet)) {
                List<String> stringList = new ArrayList<>(stringSet);

                return stringList;
            } else {
                logger.debug("============读取默认配置数据========" + config.getPostIds());
                return Optional.ofNullable(config.getPostIds()).orElse(Collections.emptyList());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


}

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>x.y.z</version>
</dependency>

 之后再控制台界面就可以进行设置了。

 另外就是如果想要每次启动让sentinel生效,需要再配置一个sentienl的yaml配置,每次项目启动可以自动生效,大概格式如下:

[
    {
        "resource":"queryRecommend",
        "controlBehavior":0,
        "count":20,
        "grade":1,
        "limitApp":"default",
        "strategy":0
    }
]