springboot sentinel使用示例(基于sentinel 1.8),流控,降级,sentinel-dashboard使用,blockHandler和fallback

废话不多说,直接上代码,首先看pom依赖:

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>
    </dependencies>

项目配置application.properties配置如下:

spring.application.name=sentinel-test-001
server.port=8080
spring.cloud.sentinel.transport.dashboard=localhost:8081
spring.cloud.sentinel.transport.port=8791

这是你自己项目需要用的,但是在启动项目之前,先得把sentinel-dashboard项目启动起来,可以从github直接下载sentinel源码下来自己编译启动sentinel源码位置 或者下载sentinel-dashboard发型版sentinel发行版list

因为我们自己项目中使用sentinel会向sentinel-dashboard注册相关信息,可以在sentinel-dashboard对相关的服务、接口进行流控、降级设置。sentinel-dashboard也是一个springboot项目

需要注意的是这里面有两个地方需要配置注意一下:
spring.cloud.sentinel.transport.dashboard=localhost:8081这个是sentinel-dashboard的访问位置,其中端口号可以在sentinel-dashboard指定,如果是发行版的jar包,可以在启动jar的时候加入server.port参数,指定自己需要的端口号。
spring.cloud.sentinel.transport.port=8791这个是sentinel-dashboard和你自己项目通信的端口,sentinel-dashboard会通过HTTP访问你自己项目的这个端口号进行相关配置的推送。

因此,这里可以看出, sentinel-dashboard是需要双方相互通信的,需要确保二者的IP都能够互相访问到。

将sentinel-dashboard启动好之后,通过localhost:8081(我这里指定sentinel-dashboard的端口号为8081了,默认如果不改的话就是8080),默认用户名和密码都是sentinel,刚开始我们没有启动访问自己的项目,是没有任何东西的,
我们启动自己的项目,项目就一个controller:

@SpringBootApplication
public class Bootstrap {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Bootstrap.class);
    }
}


@RestController
@RequestMapping("/test")
public class TestController {
    
    

   @GetMapping("/sayHello")
    public String sayHello(String name ){
    
    
        return "Hello World "+name;
    }
}

启动项目,访问localhost:8080/test/sayHello?name=test,这时候在看sentinel-dashboard页面的时候出现了自己的项目,
在这里插入图片描述

查看实时监控:在这里插入图片描述
查看簇点链路:
在这里插入图片描述

这时候我们对刚才访问的接口进行流控设置:
在这里插入图片描述
这时候查看流控规则,就有了我们刚才添加的规则:
在这里插入图片描述
这时候在访问刚才的接口,连续刷,就出现了如下的界面:
在这里插入图片描述

blockHandler

这是Sentinel默认的流控和返回,但是很多时候我们需要自己设定自己需要的返回内容,这时候需要使用SentinelResource自定义流控返回:

@RestController
@RequestMapping("/test")
public class TestController {
    
    

    @GetMapping("/sayHello")
    @SentinelResource(value = "testSayHello",blockHandler = "blockHandler")
    public String sayHello(String name ){
    
    
        return "Hello World "+name;
    }

    public String blockHandler(String name,BlockException e){
    
    
        e.printStackTrace();
        return "Blocked "+name;
    }
}

这时候在访问接口,然后在sentinel-dashboard页面上显示如下:
在这里插入图片描述

定义流控规则如下:
在这里插入图片描述

然后在刷新接口,返回如下:
在这里插入图片描述

这时候返回的就是我们刚才定义的返回内容,另外这里blockHandler对应的方法应该和被流控的方法参数一样,并且参数列表最后,多一个BlockException参数。

fallback

blockHandler定义了流控触发后的处理逻辑,fallback则是当接口发生错误异常后会触发的逻辑:

@RestController
@RequestMapping("/test")
public class TestController {
    
    
    private AtomicInteger count = new AtomicInteger();
    @GetMapping("/sayHello")
    @SentinelResource(value = "testSayHello",blockHandler = "blockHandler",fallback = "fallback")
    public String sayHello(String name ){
    
    
        if(count.incrementAndGet() % 2 == 0 ){
    
    
            throw new RuntimeException("error");
        }
        return "Hello World "+name;
    }

    public String blockHandler(String name,BlockException e){
    
    
        e.printStackTrace();
        return "Blocked "+name;
    }

    public String fallback(String name,Throwable e){
    
    
        e.printStackTrace();
        return "Fallback "+name;
    }
}

触发异常后,响应如下:
在这里插入图片描述
这时候,就可以定义降级规则了:
在这里插入图片描述

当在1s内触发了两次异常之后,在30s之内,都会被流控了,在这里插入图片描述

这是开始入门,后续在接着研究。

猜你喜欢

转载自blog.csdn.net/LeoHan163/article/details/121745164