为什么需要控制台?
没有控制台,我们的程序也能运行,但是仅限于硬编码,或者@SentinelResource
语法声明异常降级处理,不太方便定义流控规则(可以硬编码添加),有了控制台,我们可以在控制台编辑规则,然后,会自动同步至应用程序册,这样,流控规则就生效了
例如下面的代码,假设不涉及控制台,下面这个代码也可以运行的,仅限于降级,当访问 http://127.0.0.1:19966/foo?t=-100时,抛出异常,就会被外面声明的fallback = "helloFallback"捕获:
完整示例参见 【Sentinel入门】02 @SentinelResource语法(blockHandler、fallback)
public class TestServiceImpl implements TestService {
@SentinelResource(value = "hello", fallback = "helloFallback")
public String hello(long s) {
if (s < 0) {
throw new IllegalArgumentException("invalid arg");
}
return String.format("Hello at %d", s);
}
//降级服务的具体处理
public String helloFallback(long s, Throwable ex) {
// Do some log here.
ex.printStackTrace();
return "Oops, error occurred at " + s;
}
但是假如我们想实现流控怎么办?要么手动写代码,创建规则,要么通过控制台编辑规则,自动同步至客户端代码,后者明显更直观方便,也可以自动设置存储至数据库,重启系统也不会丢失数据。
sentinel-dashboard官网下载地址
启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
访问:http://127.0.0.1:8080/
用户名、密码默认都为:sentinel,也可在启动命令中自行配置:
-Dserver.port=8080
用于指定 Sentinel 控制台端口为 8080,也可以不指定,默认的端口是8080
,也可以指定其他的端口。
-Dcsp.sentinel.dashboard.server=consoleIp:port
指定控制台地址和端口,客户端必须按指定的访问,也可以省略,默认是127.0.0.1:8080
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel
。可以参考 鉴权模块文档 配置用户名和密码。
那么我们自己的应用怎么接入到控制台,使用控制台对应用的流量进行监控呢,诸位客官,请继续往下看。
首先添加maven依赖,客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.1</version>
</dependency>
配置filter,把所有访问的 Web URL 自动统计为 Sentinel 的资源(这一步不是必须的,也可以通过@SentinelResource进行定义规则):
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean sentinelFilterRegistration() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CommonFilter());
registration.addUrlPatterns("/*");
registration.setName("sentinelFilter");
registration.setOrder(1);
return registration;
}
}
在启动命令中加入以下配置:
-Dcsp.sentinel.dashboard.server=consoleIp:port
指定控制台地址和端口,即指定服务器位置,用于客户端向服务器端发起注册请求。-Dcsp.sentinel.api.port=xxxx
指定客户端监控 API 的端口,用于和服务器端进行通信,用来发送心跳检测以检测健康状态(默认是8719,避免同一个机器同时部署 服务器端和客户端冲突,因为控制台已经使用了8719,应用端为了防止冲突就使用8720,当然,可以不用配置,会自动寻找可以用的端口,不断尝试递增,8721、8722等,建议不使用显示配置
):-Dproject.name=sentinelDemo
防止默认的名称太长了-Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8720 -Dproject.name=sentinelDemo
如果是springboot项目,也可以在application.properties配置:
csp.sentinel.dashboard.server=127.0.0.1:8080
启动项目,我们可以看到多了一个应用名称sentinelDemo,点击机器列表,查看健康状况:
也可以通过yaml或properties进行配置,如果集成了spring cloud,也可以增加如下配置:
spring:
application:
name: xxxx
cloud:
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: 127.0.0.1:8080
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
#port: 8719
确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。
也就是说你需要访问某个url的时候,才会真正的发起连接
基于示例 【Sentinel入门】02 @SentinelResource语法(blockHandler、fallback),我们得知,如果定义了@SentinelResource,不管是加在url入口,即controller的方法还是service层的方法,都会出现在控制台的簇点链路菜单中,和代码中的@SentinelResource是一对一对应的:
控制台显示注册为sentinel资源的有:
DemoController的apiFoo()由于没有@SentinelResource修饰,则不是sentinel资源,对于springboot项目,非springcloud项目,也就是说,普通的url,如果不加@SentinelResource,即Controller内的方法没有被@SentinelResource修饰,则不是sentinel资源。
如果是springcloud项目,则springmvc有特殊包sentinel-spring-webmvc-adapter,会把所有的url都当做资源
Sentinel控制台服务搭建
超详细的Sentinel入门 借鉴端口配置
Sentinel 控制台 官网控制台介绍