Springboot2(49)集成sentinel

版权声明:转载请注明出处 https://blog.csdn.net/cowbin2012/article/details/90769370

源码地址

springboot2教程系列

启动Sentinel控制台

下载

下载最新版的控制台sentinel-dashboard-1.6.1.jar,下载地址

本地启动

java -Dserver.port=8080 -jar sentinel-dashboard.jar

本地访问sentinel控制台

http://10.10.2.139:8080,用户和密码都是sentinel

方法一:springcloud项目接入到sentinel控制台

在spring boot里集成sentinel比较容易,找个现有的spring boot的项目,或者去https://start.spring.io/创建一个即可

pom.xml 引入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>0.9.0.RELEASE</version>
</dependency>

application.yml配置里加上和sentinel控制台通信的配置

spring.application.name: MySentinel
server.port: 8001

spring.cloud.sentinel.eager: true
spring.cloud.sentinel.transport.port: 8720
spring.cloud.sentinel.transport.dashboard: 10.10.2.139:8234
spring.cloud.sentinel.transport.heartbeat-interval-ms: 500

注意这里的8720端口是应用端的sentinel和sentinel控制台通信的端口

编写熔断测试代码

在项目里编写测试控制器比如 MyController.java 核心代码如下

@RestController
@RequestMapping("test")
public class MyController {

    @GetMapping(value = "/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }

}

SentinelResource注解里的值是资源标识符,可以为这个资源标识符指定限流,熔断规则等

在浏览器里请求这个地址,然后查看sentinel控制台

扫描二维码关注公众号,回复: 6400078 查看本文章

在这里插入图片描述

可以看到sentinel控制台已经成功监控到了这个测试的url

降级测试

编写一个控制器路由,让这个路由能够触发降级阈值,核心代码如下:

@GetMapping(value = "/mye")
@SentinelResource("mye")
public String mye() {
    if (true) {
        throw new RuntimeException("mye");
    }
    return "mye Sentinel";
}

可以看到这段代码是会100%抛出异常

配置降级规则 点击 降级规则->新作降级规则 按钮新增降级规则

在这里插入图片描述

右键新窗口可以查看大图,这个熔断规则是任务当请求里的异常比例超过50%后,熔断接口30秒

然后多次请求这个异常接口,查看控制台日志,在几次异常后,可以看到sentinel已经开始熔断保护这个接口了

在这里插入图片描述

限流测试

编写一个输出字符串的接口来测试,核心代码如下:

@GetMapping(value = "/myrate")
@SentinelResource("myrate")
public String myrate() {
    return "myrate Sentinel";
}

添加限流规则

在这里插入图片描述

这里为了看到效果,阈值设置得比较极端:qps超过1秒就限流

然后在浏览器里访问这个接口,按住ctrl+r模拟频繁访问的效果,因为阈值设置得比较极端,立刻就可以在应用控制台里看到已经触发了sentinel的限流保护机制了

在这里插入图片描述

页面上也开始提示No message了

在这里插入图片描述

一些注意的点

测试时注意端口不要冲突了,setinel控制台占用了两个端口(8719, 8080),应用也会占用两个端口(8720, 8666), 8666应用web端口可以自行设置

应用的sentinel客户端会缓存sentinel控制台的熔断规则,如果sentinel控制台宕机了,应用还会继续使用缓存的熔断规则进行熔断。可以重启应用让熔断规则失效

方法二.客户端接入控制台

pom.xml 引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.6.1</version>
</dependency>

启动类添加

@SpringBootApplication
public class NettyApplication {
	
	public static void main(String[] args){
        System.setProperty("project.name","netty");
        System.setProperty("csp.sentinel.dashboard.server","10.10.2.139:8234");
        InitExecutor.doInit();
        SpringApplication app = new SpringApplication(NettyApplication.class);
       // app.setWebEnvironment(false);
        app.run(args);
	}

}

或者

-Dcsp.sentinel.dashboard.server=10.10.2.139:8234

限流代码

public void channelActive(ChannelHandlerContext ctx) throws Exception {
    String resourceName = "testSentinel";
    Entry entry = null;
    String retVal;
    try{
        entry = SphU.entry(resourceName,EntryType.IN);
        retVal = "passed";
    }catch(BlockException e){
        retVal = "blocked";
        System.out.println(retVal);
    }finally {
        if(entry!=null){
            entry.exit();
        }
    }
    log.info("连接");
}

@PostConstruct
public  void initFlowQpsRule() 
    List<FlowRule> rules = new ArrayList<FlowRule>();
    FlowRule rule1 = new FlowRule();
    rule1.setResource("testSentinel");
    // set limit qps to 20
    rule1.setCount(20);
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule1.setLimitApp("default");
    rules.add(rule1);
    FlowRuleManager.loadRules(rules);
}

猜你喜欢

转载自blog.csdn.net/cowbin2012/article/details/90769370