目录
介绍:
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
Sentinel 阿里下载地址:我这里是1.8.1版本
下载对应的文件下面 ,在地址栏输入cmd 然后 java -jar
sentinel-dashboard-1.8.1.jar(jar包的全名称路径) 然后运行,默认端口应该是:8080
运行成功访问端口:8080,要注意是否会出现端口冲突
下载地址:
https://github.com/alibaba/Sentinel/releases
运行成功的样子:
登录的账号密码均为:sentinel
需要在boot项目里面配置相关sentinel的信息 ,在控制台对应接口加入一个注解:
@SentinelResource(value="hi") 加入注解以后,运行项目访问接口,然后多次刷新sentinel 就能查看到 sentinel 就有对应接口相关信息了!!!
--------------------------------
boot 配置 sentinel
pom依赖:
<!-- sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.1.0.RELEASE</version> </dependency>
yml配置: 注意yml配置的空格约束
cloud: sentinel: transport: dashboard: localhost:8080
控制台配置: @SentinelResource(value="hi")
@SentinelResource(value="hi")
@RequestMapping("/hello")
public String hello(){
return "你好";
}
配置以后的运行效果:
先访问配置的接口:
访问成功以后:
多次刷新sentinel 出现对应接口信息 ,这里你就可以进行相关配置了
,nacos 注册中心就是集成这种 好像! 后面的自己去了解吧
我们这里可以对它进行配置一个流控,点击流控按钮
配置QPS
为1
点击新增后我们每秒都只能请求一次了
多次请求多了则会被限流
我们还可以定义我们受保护的资源
简单来说,就是我们的代码块
下面这段代码可以直接试着运行一下
package com.luodada;
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 com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import java.util.ArrayList;import java.util.List;/**
* sentinel测试类
*
*
*
*/public class SimpleSentinelTests {
public static void main(String[] args) {
// 配置规则.
initFlowRules();
while (true) {
// 1.5.0 版本开始可以直接利用 try-with-resources 特性
try (
// 判断资源的名称 如果是HelloWorld 就进去
Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}
private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld"); //设置资源的名称
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置流控的规则的以QPS为准,还有以线程为准
rule.setCount(20); //令牌 意思就是只能打印20次 HelloWorld信息
rules.add(rule);
FlowRuleManager.loadRules(rules); //添加进流控规则管理中
}
}
输出结果: 展示20次 需要保护的资源!!
后面就是 被流控的逻辑了
我们除了使用FlowRuleManager.loadRules
去配置资源流控规则以外,还可以直接在sentinel
控制台进行配置
在对应接口上面配置流控:
第二种流控异常: 通过后面的降级去处理
下面截图里面的三段代码:
若我们的应用使用了Spring AOP,我们需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:
@Configurationpublic class SentinelAspectConfiguration { @Bean
public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect();
}
}
找个地方注入这个Bean以后
我们在service实现类中写上这个注解
package com.ruben.simplesentinel.service.impl;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.ruben.simplesentinel.service.IHelloWorldService;import org.springframework.stereotype.Service;/**
* helloWorld业务层实现类
*
* @author <achao1441470436@gmail.com>
* @since 2021/6/29 0029 22:44
*/@Servicepublic class HelloWorldServiceImpl implements IHelloWorldService { @SentinelResource("HelloWorld") @Override
public void helloWorld() { // 资源中的逻辑
System.out.println("hello world");
}
}
然后方法调用:
package com.ruben.simplesentinel;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import com.ruben.simplesentinel.service.IHelloWorldService;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import java.util.ArrayList;import java.util.List;@SpringBootTestclass SimpleSentinelApplicationTests { @Resource
private IHelloWorldService helloWorldService; @Test
void contextLoads() {
initFlowRules(); while (true) {
helloWorldService.helloWorld();
}
} private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
可以看到在执行20次后抛出了java.lang.reflect.UndeclaredThrowableException
并且是由我们com.alibaba.csp.sentinel.slots.block.flow.FlowException导致的
除了进行限流,我们还可以直接配置降级: 因为上面出现异常 我们就可以使用降级来 提高用户使用体验!!!
当上面代码抛出异常,, 我们使用降级以后,当我们请求几次后 :就不会再执行我们的方法抛出NPE
了;,因为此时我们配置的服务降级生效
通过配置sentinel
限流与降级,提升了我们程序的健壮性,使得其不至于在高并发场景下压力过大,提供程序使用体验!
--------------------------------------------------------------------------------------------------
小知识总结:
java -Dserver.port=8000
-Dcsp.sentinel.dashboard.server=localhost:8000
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
命令详细
这里server.port=8000
表示在8000端口启动
csp.sentinel.dashboard.server
指定指定控制台地址和端口project.name
指定应用名
更多的参数参见 启动参数文档。
我这里创建的镜像 是使用的aliyun的
创建sentinel 和 web 依赖:
spring:
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: localhost:9000
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# client-ip:
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
eager: true
filter:
# 配置启用拦截器
enabled: true
# 配置拦截器路径
url-patterns: /**
结合阿超