自学内容网 自学内容网

Sentinel学习

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习OpenFeign学习Dubbo学习
Hystrix学习Sentinel学习


前言

本文我们要讲述:
Sentinel
通过网盘分享的文件:SpringSession——OpenFeign.zip
链接: https://pan.baidu.com/s/1uKEYyQ80RGMnDsoa5j9v5Q?pwd=tmm5 提取码: tmm5
在下攸攸太上。


一、Sentinel介绍

1. Sentinel介绍

Sentinel是一个面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点来帮助开发者保障微服务的稳定性。

2. Sentinel概念

1、QPS (Queries Per Second):每秒处理的请求数量,用于衡量系统的处理能力。

2、RT (Response Time):响应时间,指的是从发送请求到接收到响应所花费的时间。

3、慢调用 (Slow Calls):响应时间超过一定阈值的调用。

4、慢调用比例 (Slow Call Ratio):慢调用数量占总调用数量的比例。

5、比例阈值 (Threshold):一个介于0到1之间的浮点数,表示阈值的百分比,用于设置异常比例、慢调用比例等。

6、异常比例 (Exception Ratio):发生异常的调用数量占总调用数量的比例。

7、异常数 (Exception Count):发生异常的调用数量。

8、快速失败 (Fail Fast):当QPS超过阈值时,直接限流并抛出异常。适用于线程数限流。

9、排队等待 (Warm Up):每秒可以处理的请求数量有限制,超出限制的请求会进入排队等待一段时间,等待时间过后仍未处理的请求将被限流。适用于QPS限流。

10、Warm Up (Warm Up):在一段时间内逐渐增加服务器的QPS,使其慢慢达到阈值。适用于QPS限流。

11、直接拒绝 (Reject):针对单一资源,当触发阈值时直接拒绝请求。

12、关联 (Association):针对两个资源有关联时,当前资源会为关联资源让步,保证关联资源拥有更大的阈值。

13、链路 (Cascade):从资源入口开始,整个链路的阈值。

14、热点限流 (Hotspot Flow Control):对频繁访问的热点数据进行限流,以减少服务器压力。

15、系统规则 (System Rule):针对硬件层面设置的规则,比如限制CPU的使用率。

16、授权规则 (Authority Rule):根据请求的来源设置限流,实现黑白名单功能。

二、Sentinel代码实现

1. 使用OpenFeign项目

本项目基于OpenFeign的两个项目实现,可以在下面的网盘链接取到
SpringSession——OpenFeign.zip
可以看我之前的OpenFeign学习文章,里面会有介绍

以下更改均在demo-session-01内更改,demo-session-02无需任何改动,如需改动,会特别标出

2. 启动Nacos和Redis

在这里插入图片描述

3. 添加依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-web-servlet</artifactId>
</dependency>

4. Sentinel服务下载

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

5. 启动服务

java -jar sentinel-dashboard.jar
在这里插入图片描述

6. 登录sentinel

访问网页:http://localhost:8080/#/login
在这里插入图片描述
登录后,点击首页出现欢迎页
在这里插入图片描述

7. 添加配置信息

在application.yml配置文件中,Spring标签改为如下

spring:
  session:
    store-type: redis
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

8. 启动项目并访问项目

在这里插入图片描述
刷新Sentinel页面,点击进入限流界面
在这里插入图片描述
在这里插入图片描述
快速刷新http://127.0.0.1:100/user
在这里插入图片描述

三、自定义响应

1. 创建SentinelFilterConfig过滤器

package com.jjy.config;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
public class SentinelFilterConfig {

    @Bean
    public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
        FilterRegistrationBean<Filter> result = new FilterRegistrationBean<>(new CommonFilter());
        result.addUrlPatterns("/*");
        return result;
    }
}

2. 创建SentinelConfig配置类

package com.jjy.config;

import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import com.alibaba.fastjson.JSON;
import com.jjy.util.Result;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SentinelConfig {

    public SentinelConfig() {
        WebCallbackManager.setUrlBlockHandler((request, response, e) -> {
            Result error = Result.error();
            error.setMessage("被限流了!");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(JSON.toJSONString(error));
        });
    }
}

3. 运行项目,查看结果

重新新增流控规则
在这里插入图片描述
疯狂刷新项目界面
在这里插入图片描述

四、熔断

1. 添加feign配置信息

feign.sentinel.enabled=true

在这里插入图片描述

2. 创建ScoreFeignImpl接口实现类

package com.jjy.feign.impl;


import com.jjy.entry.Score;
import com.jjy.entry.UserDto;
import com.jjy.feign.ScoreFeign;
import com.jjy.util.Result;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ScoreFeignImpl implements ScoreFeign {
    @Override
    public Result info() {
        List<Score> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Score score = new Score();
            score.setName("name" + i);
            score.setScore(99.99);
            list.add(score);
        }
        return  Result.ok().put("data",list);
    }

    @Override
    public Result id(String id) {
        return null;
    }

    @Override
    public Result add(UserDto user) {
        return null;
    }
}

3. 修改ScoreFeign接口的注解

同时需要import一个ScoreFeignImpl

@FeignClient(value = "openfeignDemo2", fallback = ScoreFeignImpl.class) //fallback 一旦出现熔断,要走哪个类。

在这里插入图片描述

4. 修改UserServiceImpl实现类方法

修改UserServiceImpl实现类内info的第30行的result.get(“data”),改为data
在这里插入图片描述

5. !!在sentineldemo2项目中!!更改info方法

在ScoreController类中,更改返回值的key,将list改为data。
在这里插入图片描述

6. 启动两个项目、测试熔断处理

在这里插入图片描述
关掉sentineldemo2项目模拟宕机效果。
在这里插入图片描述

五、熔断资源

1. 添加setMessage方法

在Result工具类中,添加setMessage方法

    public Result setMessage(String message){
        this.message = message;
        return this;
    }

2. 新增trySources方法

在UserController类中,新增trySources方法

    @GetMapping("/try")
    public Result trySources(){
        String sourcesName = "testTry";
        try(Entry entry = SphU.entry(sourcesName)) { //SphU.entry方法通过传入资源名称和其他参数来获取访问令牌。如果获取到令牌,则可以访问目标资源;如果没有获取到令牌,则无法访问对应资源。
            return Result.ok();
        } catch (BlockException e) {
            return Result.error().setMessage("被限流了!");
        }
    }

包导这三个

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;

在这里插入图片描述

3. 添加annotationSources、annotationSourcesError方法

在UserController类中,新增trySources方法

    @GetMapping("/annotation")
    @SentinelResource(value = "testAnnotation", blockHandler = "annotationSourcesError")
    public Result annotationSources() {
        return Result.ok();
    }

    public Result annotationSourcesError(BlockException e) {
        return Result.error().setMessage("被限流了!");
    }

在这里插入图片描述

4. 重启两个项目

新增流量控制规则
在这里插入图片描述
注意给testTry加,不要给/user/try加,如果加错了,要删掉
在这里插入图片描述
访问项目,刷新几次,出现如下信息
在这里插入图片描述
在这里插入图片描述


总结

本文讲述了:
Sentinel:限制流量、熔断资源
在下攸攸太上,绿联风扇挺好用。


原文地址:https://blog.csdn.net/howwickhappy/article/details/142648301

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!