Sentinel限流接入
-
SpringBoot项目接入流程
-
SpringMVC项目接入流程
-
注意事项
-
并发接口测试
-
Sentinel日志说明
SpringBoot项目接入流程
-
Sentinel控制台
-
Nacos配置中心
-
SpringBoot应用
-
测试效果
Sentinel控制台
-
版本
1.7.2
-
登录账号
sentinel/sentinel
Nacos配置中心
-
版本
1.2.1
-
登录账号
nacos/nacos
-
各个应用需要添加
限流规则配置文件
, 并遵从如下规则-
data-id命名格式,
${spring.application.name}-flow-rules
, 其中${spring.application.name}
为应用配置的项目名称, 例如:spring.application.name=usersystem
-
所属group统一设置为
SENTINEL_GROUP
-
SpringBoot应用
-
版本及依赖
-
属性文件及Configure配置
-
RestTemplate接入
-
Dubbo接入
-
Redis接入
-
MQ接入
版本及依赖
1.版本信息.
<properties>
<springboot.version>2.1.2.RELEASE</springboot.version>
<!-- 接入sentinel版本 -->
<sentinel.version>1.7.1</sentinel.version>
<!-- sentinel-start版本 -->
<alibaba-sentinel-starter.version>2.2.1.RELEASE</alibaba-sentinel-starter.version>
<!-- nacos版本 -->
<nacos-config-spring-boot.version>0.2.7</nacos-config-spring-boot.version>
</properties>
2.父工程pom.xml.
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${alibaba-sentinel-starter.version}</version>
<!--排除该包, 解决RestTemplate初始化报错找不到 com.fasterxml.jackson.core.TSFBuilder 的问题-->
<exclusions>
<exclusion>
<artifactId>jackson-dataformat-xml</artifactId>
<groupId>com.fasterxml.jackson.dataformat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>${sentinel.version}</version>
</dependency>
</dependencies>
3.WEB子模块pom.xml.
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
</dependencies>
其他子模块若使用到@SentinelResource注解
, 只需在pom.xml引入spring-cloud-starter-alibaba-sentinel
包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${alibaba-sentinel-starter.version}</version>
</dependency>
属性文件及Configure配置
1.application.properties配置.
# 应用名
spring.application.name=usersystem
# nacos限流规则数据源配置
spring.cloud.sentinel.datasource.ds1.nacos.data-id=${spring.application.name}-flow-rules
spring.cloud.sentinel.datasource.ds1.nacos.group-id=SENTINEL_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
2.application-dev([test|pre|prod]).properties配置.
# sentinel与控制台通信端口, 根据环境修改
spring.cloud.sentinel.transport.port=38119
# 是否有访问量时才进行限流初始化(sentinel懒加载)
spring.cloud.sentinel.eager=true
# sentinel-dashboard控制台地址, 根据环境修改
spring.cloud.sentinel.transport.dashboard=172.16.10.41:8081
# sentinel-nacos通信配置地址, 根据环境修改
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=172.16.10.41:8848
# sentinel-nacos配置命名空间, 根据环境修改
spring.cloud.sentinel.datasource.ds1.nacos.namespace=dev-41-id
# 自定义日志文件, 根据自身应用修改, 建议设为 原始应用日志目录/csp, 以用户系统为例
spring.cloud.sentinel.log.dir=/work/www/usersystem_new.htjy.com/logs/csp
3.WebConfig配置.
/**
* WEB配置
* 可增加拦截器、异步/跨域支持
* <p>
* 注意:
* 1.@EnableWebMvc + implements WebMvcConfigurer
* 2.extends WebMvcConfigurationSupport
* 都会覆盖@EnableAutoConfiguration关于WebMvcAutoConfiguration的配置
* 例如: 请求参数时间格式/响应字段为NULL剔除
* 因此, 推荐使用 implements WebMvcConfigurer方式, 保留原有配置
* 3.自定义消息转换器, 推荐直接使用注册Bean
* 也可使用复写extendMessageConverters()方法,
* 但是注意: 不要使用configureMessageConverters, 该方法要么不起作用, 要么关闭了默认配置
*
*/
@Configuration
@Slf4j
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截器逻辑, 权限等
}
}
WebConfig不得extends WebMvcConfigurationSupport, 否则会引起默认配置失效
RestTemplate接入
-
SentinelRestTemplate异常处理工具类
-
配置RestTemplate
示例基类响应.
@Data
public class BaijiaCloudResp<T> implements Serializable {
private int code;
private String msg;
private T data;
}
SentinelExceptionUtil.
/**
* Sentinel异常统一处理工具类
*/
public class SentinelExceptionUtil {
public static SentinelClientHttpResponse restTemplateHandleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
BaijiaCloudResp resp = new BaijiaCloudResp();
resp.setCode(-1);
resp.setMsg("限流生效异常");
return new SentinelClientHttpResponse(JSONUtil.toJSONStringWithDateFormat(resp));
}
public static SentinelClientHttpResponse restTemplateFallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
BaijiaCloudResp resp = new BaijiaCloudResp();
resp.setCode(-1);
resp.setMsg("降级生效异常");
return new SentinelClientHttpResponse(JSONUtil.toJSONStringWithDateFormat(resp));
}
}
RestTemplateConfig.
@Configuration
public class RestTemplateConfig {
@Bean(name = "restTemplate")
// 被@SentinelRestTemplate标注的restTemplate执行http请求时底层会被拦截
// 默认情况下, 当发生限流\|降级异常时拦截器底层会返回固定字符串, 这将导致后续出现JSON解析异常
// 所以配置SentinelExceptionUtil中的异常处理方法, 返回一个空的基类响应对象, 并用特殊的code标识
@SentinelRestTemplate(blockHandler = "restTemplateHandleException", blockHandlerClass = SentinelExceptionUtil.class, fallback = "restTemplateFallback", fallbackClass = SentinelExceptionUtil.class)
RestTemplate ignoreHttpsRestTemplate() {
// 创建RestTemplate的代码
}
}
Dubbo接入
Redis接入
MQ接入
SpringBoot项目测试效果
-
HTTP接口server端测试
-
HTTP接口client端测试
-
Dubbo接口provider测试
-
Dubbo接口consumer测试
-
Redis测试
-
MQ测试
2.HTTP接口server端测试
3.HTTP接口client端测试
SpringMVC项目接入流程(待完善)
注意事项
- 应用端口和通信端口需要规划, 避免端口冲突
并发接口测试
-
Python脚本
-
环境要求: python3.x
-
针对接口不需要登录, 无参或者@RequestParam参数
-
安装python命令行插件 .shell命令
# 安装插件
pip3 install D8gerConcurrent
# 获取帮助信息
easy-http [-h|--help]
# 使用默认参数: 1个线程, 连续请求1次
easy-http http://www.baidu.com/
# 使用64个线程连续请求20,000次
easy-http http://www.baidu.com/ -w 64 -l 20000
- JMeter压测(待完善)
Sentinel日志说明
-
应用启动日志, NacosDataSource规则接收日志, 参见
sentinel-record.log
-
秒级监控日志
XXX-metrics.log
格式说明
时间戳 | 格式化时间 | 资源全称 | 到来的QPS | 已被拦截的QPS | 成功通过的QPS | 有异常的QPS | 平均响应时长RT(ms) | OccupiedPassQps:0 | concurrency:0 |
1588063361000 | 2020-04-28 16:42:41 | /ruok | 2 | 192 | 2 | 0 | 20 | 0 | 0 |
- 限流|降级请求拦截日志
sentinel-block.log
格式说明
时间戳 | 当前发生的第几个资源 | 资源名 | 异常名 | 针对调用应用来源 | 被拦截资源的调用者(可以为空) | 被拦截数量 |
2020-04-28 16:42:42 | 1 | /ruok | FlowException | default | (可以为空) | 17 |
辅助检查链路接口.
http://IP:通信端口(${spring.cloud.sentinel.transport.port})/tree\?type\=root
http://IP:通信端口(${spring.cloud.sentinel.transport.port})/origin\?id\=资源名称(/ruok)
总结
微信 |
支付宝 |
MiXin |