下载Sentinel
为了满足需求,本文需要直接下载源码(后面需要修改源码)
下载地址:https://github.com/alibaba/Sentinel
首先可以先启动一下界面是啥效果 ( 端口自行配置,默认8080 )
image.png
访问页面
image.png
一、SpringBoot 项目Sentinel (简单版,了解)
以下更改位置:你自己的项目中
在pom.xml文件中依耐
<!--父工程中引用-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--项目里面引用-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置文件中配置:
#Sentinel 对应的地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8890
配置完成
启动项目,在控制台就能看见了,然后根据需要配置规则
缺点:配置的规则是存储到项目的内存中,下次重启失效,需要重新配置
二、SpringBoot 项目Sentinel (Nacos配置版,Nacos同步到 Sentinel )
以下更改位置:你自己的项目中
<!--父工程中引用-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--项目里面引用-->
<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>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<!--spring-cloud-starter-alibaba-nacos-discovery 或者以下-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置文件中配置:
#Sentinel 对应的地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8890
#简单版: 基础上,新增配置
#${nacos.config.server-addr}代表nacos地址,例如:127.0.0.1:8848
#-flow-rules 和 SENTINEL_GROUP 配置系统默认(可自定义),双向同步的时候需要指定,不建议自定义,不然还得修改源码
spring.cloud.sentinel.datasource.flow.nacos.server-addr=${nacos.config.server-addr}
spring.cloud.sentinel.datasource.flow.nacos.dataId=${spring.application.name}-flow-rules
spring.cloud.sentinel.datasource.flow.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.flow.nacos.rule-type=flow
spring.cloud.sentinel.datasource.flow.nacos.data-type=json
大功告成
在nacos中配置你需要的规则,在sentinel web页面上就能看到了
例如:
image.png
[
{
"resource":"/home",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
resource: 资源名称
limitApp: 来源应用
grade:阈值类型,0表示线程数,1表示QPS;
count:单机阈值;
strategy: 流控模式,0表示直接,1表示关联,2表示链路
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群
验证限流功能
启动Nacos服务
启动spring boot服务
启动sentinel-dashboard服务
image.png
image.png
image.png
三、SpringBoot 项目Sentinel (Sentinel 同步到 Nacos )
修改 sentinel-dashboard 源码
1.修改pom.xml中的sentinel-datasource-nacos的依赖,将<scope>test</scope>注释掉,这样才能在主程序中使用。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
2.找到resources/app/scripts/directives/sidebar/sidebar.html中的这段代码
<li ui-sref-active="active">
<a ui-sref="dashboard.flowV1({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则
</a>
</li>
修改成 以下
<li ui-sref-active="active">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则
</a>
</li>
3.用来编写针对Nacos的扩展实现,复制一份
image.png
4.修改配置,对应的Nacos地址
image.png
@Bean
public ConfigService nacosConfigService() throws Exception {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
return ConfigFactory.createConfigService(properties);
}
如果你的项目配置dataId 和 groupId 不是默认的,需要修改以下
image.pngimage.png
image.png
5.修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2中DynamicRuleProvider和DynamicRulePublisher注入的Bean,改为上面我们编写的针对Apollo的实现
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
配置已完成,在Sentinel web页面修改规则,Nacos上面就能同步修改了。
四、自定义响应
系统默认返回的 Blocked by Sentinel (flow limiting) 在使用过程中显然不可取,需要自行修改。
在你的SpringBoot项目中配置如下:
// 新版已经修改为实现 BlockExceptionHandler ,老版实现 UrlBlockHandler
@Configuration
public class SentinelException implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
ErrorResponse errorResponse = new ErrorResponse();
if (e instanceof FlowException) {
errorResponse.setMsg("被限流了");
errorResponse.setStatus(1);
} else if (e instanceof DegradeException) {
errorResponse.setMsg("服务降级了");
errorResponse.setStatus(2);
} else if (e instanceof ParamFlowException) {
errorResponse.setMsg("被限流了");
errorResponse.setStatus(3);
} else if (e instanceof SystemBlockException) {
errorResponse.setMsg("被系统保护了");
errorResponse.setStatus(4);
} else if (e instanceof AuthorityException) {
errorResponse.setMsg("被授权了");
errorResponse.setStatus(5);
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(JSONObject.toJSONString(message));
}
}
/**
* 简单的响应结构体
*/
class ErrorResponse {
private Integer status;
private String msg;
public Integer getStatus() {
return status;
}
public static Object builder() {
return null;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
网友评论