Sentinel简单实现

一:下载、安装、运行Sentinel

1.window

下载:

           GitHub上面的官方下载地址:Releases · alibaba/Sentinel · GitHub

          或 sentinel-dashboard-1.7.0.jar:百度网盘 请输入提取码 提取码:0rlf

安装:在Sentinel的jar包目录地址栏中输入cmd,点击回车打开DOS窗口,如下图:

Sentinel简单实现_第1张图片

 输入java -jar Sentinel的jar包名称,回车之后就启动了Sentinel,如下图:

Sentinel简单实现_第2张图片

如果出现端口已经被占用的提示,那就需要指定端口启动,即输入java -jar Sentinel的jar包名称 --server.port=端口号,点击回车就可以启动sentinel了

访问:

在地址栏输入http://localhost:端口号(默认是8080)就可以访问了,初始用户名和密码都是sentinel,如下图:

Sentinel简单实现_第3张图片

 进入操作台:

 Sentinel简单实现_第4张图片 

 2.linux

下载:

Sentinel简单实现_第5张图片

启动

执行 nohup java -jar sentinel-dashboard-1.7.1.jar & 命令,后台启动 Sentinel 控制台。通过查看 nohup.out 日志输入,如果有如下内容,说明启动成功:

 二:添加项目

1.在 pom.xml 文件中,引入相关依赖



    
        org.springframework.boot
        spring-boot-starter-parent
        2.2.2.RELEASE
         
    
    4.0.0

    lab-46-sentinel-demo

    
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            com.alibaba.csp
            sentinel-core
            1.7.1
        
        
        
            com.alibaba.csp
            sentinel-transport-simple-http
            1.7.1
        
        
        
            com.alibaba.csp
            sentinel-spring-webmvc-adapter
            1.7.1
        
        
        
            com.alibaba.csp
            sentinel-parameter-flow-control
            1.7.1
        
        
        
            com.alibaba.csp
            sentinel-annotation-aspectj
            1.7.1
        
    

2.Sentinel 配置文件

在 resources 目录下,创建 Sentinel 自定义的sentinel.properties 配置文件。内容如下:

Sentinel简单实现_第6张图片

3.配置项目启动端口。内容如下:

Sentinel简单实现_第7张图片

4.Application

创建 Application.java 类,配置 @SpringBootApplication 注解即可。代码如下:

package cn.iocoder.springboot.lab46.sentineldemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        // 设置系统属性 project.name,提供给 Sentinel 读取
        System.setProperty("project.name", "demo-application");

        // 启动 Spring Boot 应用
        SpringApplication.run(Application.class, args);
    }

}

 5.SpringMvcConfiguration

在 cn.iocoder.springboot.lab46.sentineldemo.config 包下,创建 SpringMvcConfiguration 配置类,自定义 sentinel-spring-webmvc-adapter 提供的拦截器。代码如下:

package cn.iocoder.springboot.lab46.sentineldemo.config;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebTotalInterceptor;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcTotalConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // Add Sentinel interceptor
//        addSentinelWebTotalInterceptor(registry);
        addSentinelWebInterceptor(registry);
    }

    private void addSentinelWebInterceptor(InterceptorRegistry registry) {
        // 创建 SentinelWebMvcConfig 对象
        SentinelWebMvcConfig config = new SentinelWebMvcConfig();
        config.setHttpMethodSpecify(true); // 是否包含请求方法。即基于 URL 创建的资源,是否包含 Method。
        // config.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); // 设置 BlockException 处理器。
//        config.setOriginParser(new RequestOriginParser() { // 设置请求来源解析器。用于黑白名单控制功能。
//
//            @Override
//            public String parseOrigin(HttpServletRequest request) {
//                // 从 Header 中,获得请求来源
//                String origin = request.getHeader("s-user");
//                // 如果为空,给一个默认的
//                if (StringUtils.isEmpty(origin)) {
//                    origin = "default";
//                }
//                return origin;
//            }
//
//        });

        // 添加 SentinelWebInterceptor 拦截器
        registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**");
    }

    private void addSentinelWebTotalInterceptor(InterceptorRegistry registry) {
        // 创建 SentinelWebMvcTotalConfig 对象
        SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig();

        // 添加 SentinelWebTotalInterceptor 拦截器
        registry.addInterceptor(new SentinelWebTotalInterceptor(config)).addPathPatterns("/**");
    }

}

 结构如下:

Sentinel简单实现_第8张图片

6.GlobalExceptionHandler

在 cn.iocoder.springboot.lab46.sentineldemo.web 包下,创建 GlobalExceptionHandler 配置类,自定义 sentinel-spring-webmvc-adapter 提供的拦截器。代码如下:

package cn.iocoder.springboot.lab46.sentineldemo.web;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice(basePackages = "cn.iocoder.springboot.lab46.sentineldemo.controller")
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(value = BlockException.class)
    public String blockExceptionHandler(BlockException blockException) {
        return "请求过于频繁";
    }

}

 结构如下:

Sentinel简单实现_第9张图片

7.DemoController

package cn.iocoder.springboot.lab46.sentineldemo.controller;

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

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/echo")
    public String echo() {
        return "echo";
    }

    @GetMapping("/test")
    public String test() {
        return "test";
    }

    @GetMapping("/sleep")
    public String sleep() throws InterruptedException {
        Thread.sleep(100L);
        return "sleep";
    }

    // 测试热点参数限流
    @GetMapping("/product_info")
    @SentinelResource("demo_product_info_hot")
    public String productInfo(Integer id) {
        return "商品编号:" + id;
    }

    // 手动使用 Sentinel 客户端 API
    @GetMapping("/entry_demo")
    public String entryDemo() {
        Entry entry = null;
        try {
            // 访问资源
            entry = SphU.entry("entry_demo");

            // ... 执行业务逻辑

            return "执行成功";
        } catch (BlockException ex) {
            return "被拒绝";
        } finally {
            // 释放资源
            if (entry != null) {
                entry.exit();
            }
        }
    }

    // 测试 @SentinelResource 注解
    @GetMapping("/annotations_demo")
    @SentinelResource(value = "annotations_demo_resource",
            blockHandler = "blockHandler",
            fallback = "fallback")
    public String annotationsDemo(@RequestParam(required = false) Integer id) throws InterruptedException {
        if (id == null) {
            throw new IllegalArgumentException("id 参数不允许为空");
        }
        return "success...";
    }

    // BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致.
    public String blockHandler(Integer id, BlockException ex) {
        return "block:" + ex.getClass().getSimpleName();
    }

    // Fallback 处理函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
    public String fallback(Integer id, Throwable throwable) {
        return "fallback:" + throwable.getMessage();
    }

}

 8. 简单测试

使用浏览器,访问下 http://127.0.0.1:7070/ 地址,进入 Sentinel 控制台。此时,我们可以看到 demo-application 应用。如下图所示:

Sentinel简单实现_第10张图片

使用浏览器,访问下 http://127.0.0.1:8080/demo/echo 接口 10 次。然后点击 Sentinel 控制台的「实时监控」菜单,可以看到该接口的请求情况。如下图所示: 

Sentinel简单实现_第11张图片

 9.根据自己的需求设置:流量规则,降级规则,热点规则,系统规则等。

你可能感兴趣的:(java,sentinel)