Sentinel-dashboard
Dashboard控制台
sentinel-dashboard是一个单独的应用,通过spring-boot进行启动,主要提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。
我们只需要对应用进行简单的配置,就可以使用这些功能。
1 启动控制台
1.1 下载代码并编译控制台
- 下载 控制台 工程,或者 在sentinel的子目录有源码
- 使用以下命令将代码打包成一个 fat jar:
mvn clean package
1.2 启动
使用如下命令启动编译后的控制台:
$ java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar target/sentinel-dashboard.jar
上述命令中我们指定了一个JVM参数,-Dserver.port=8080 用于指定 Spring Boot 启动端口为 8080。
2 客户端接入控制台
控制台启动后,客户端需要按照以下步骤接入到控制台。
2.1 引入客户端jar包
通过 pom.xml 引入 jar 包:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>x.y.z</version>
</dependency>
2.2 配置启动参数
启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。
除了修改 JVM 参数,也可以通过配置文件取得同样的效果。更详细的信息可以参考 启动配置项。
2.3 触发客户端初始化
确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。
sentinel-dashboard是一个独立的web应用,可以接受客户端的连接,然后与客户端之间进行通讯,他们之间使用http协议进行通讯。他们之间的关系如下图所示:

dashboard
dashboard启动后会等待客户端的连接,具体的做法是在 MachineRegistryController 中有一个 receiveHeartBeat 的方法,客户端发送心跳消息,就是通过http请求这个方法。
dashboard接收到客户端的心跳消息后,会把客户端的传递过来的ip、port等信息封装成一个 MachineInfo 对象,然后将该对象通过 MachineDiscovery 接口的 addMachine 方法添加到一个ConcurrentHashMap中保存起来。
这里会有问题,因为客户端的信息是保存在dashboard的内存中的,所以当dashboard应用重启后,之前已经发送过来的客户端信息都会丢失掉。
client
client在启动时,会通过CommandCenterInitFunc选择一个,并且只选择一个CommandCenter进行启动。
启动之前会通过spi的方式扫描获取到所有的CommandHandler的实现类,然后将所有的CommandHandler注册到一个HashMap中去,待后期使用。
PS:考虑一下,为什么CommandHandler不需要做持久化,而是直接保存在内存中。
注册完CommandHandler之后,紧接着就启动CommandCenter了,目前CommandCenter有两个实现类:
- SimpleHttpCommandCenter 通过ServerSocket启动一个服务端,接受socket连接
- NettyHttpCommandCenter 通过Netty启动一个服务端,接受channel连接
CommandCenter启动后,就等待dashboard发送消息过来了,当接收到消息后,会把消息通过具体的CommandHandler进行处理,然后将处理的结果返回给dashboard。
这里需要注意的是,dashboard给client发送消息是通过异步的httpClient进行发送的,在HttpHelper类中。
但是诡异的是,既然通过异步发送了,又通过一个CountDownLatch来等待消息的返回,然后获取结果,那这样不就失去了异步的意义的吗?具体的代码如下:
private String httpGetContent(String url) {
final HttpGet httpGet = new HttpGet(url);
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<String> reference = new AtomicReference<>();
httpclient.execute(httpGet, new FutureCallback<HttpResponse>() {
@Override
public void completed(final HttpResponse response) {
try {
reference.set(getBody(response));
} catch (Exception e) {
logger.info("httpGetContent " + url + " error:", e);
} finally {
latch.countDown();
}
}
@Override
public void failed(final Exception ex) {
latch.countDown();
logger.info("httpGetContent " + url + " failed:", ex);
}
@Override
public void cancelled() {
latch.countDown();
}
});
try {
latch.await(5, TimeUnit.SECONDS);
} catch (Exception e) {
logger.info("wait http client error:", e);
}
return reference.get();
}
项目结构

1、pom.xml
首先我们看下pom.xml,这也是我看源码的习惯,看完目录结构再看pom文件。
通过pom文件,可以了解到该项目:
- 基于Spring boot快速开发的,且spring boot版本为2.0.5.RELEASE
- 基于JDK8编译开发的
- 引用了sentinel-web-servlet、sentinel-transport-simple-http等依赖,sentinel-web-servlet是一个sentinel的适配器,因此该项目可能也可以进行限流降级控制
2、client
主要可以看到SentinelApiClient,这个类的功能是通过http获取引用的监控指标以及设置限流、降级、熔断的规则并发送到对应的应用中。
可以看到大致有以下方法:
fetch拉取方法
- fetchResourceOfMachine: 获取应用的资源
- fetchFlowRuleOfMachine: 获取应用限流规则
- fetchDegradeRuleOfMachine: 获取应用降级规则
- fetchSystemRuleOfMachine: 获取应用的系统保护规则
- fetchParamFlowRulesOfMachine:获取热点参数限流参数
- fetchAuthorityRulesOfMachine: 获取机器的授权规则
set设置方法
- setFlowRuleOfMachine: 设置限流规则
- setDegradeRuleOfMachine:设置降级规则
- setSystemRuleOfMachine:设置系统规则
- setAuthorityRuleOfMachine:设置授权规则
- setParamFlowRuleOfMachine:设置热点参数规则
然后通过httpGetContent方法调用。
这里只是简单介绍了有哪些调用方法,具体调用调用方法会请求到哪,其实会到sentinel-transpor模块中,其中有个CommandHandler接口,通过SPI的形式实现了很多Handler处理器。具体调用链后续文章会讲解。
3、config
只有一个文件WebConfig:
- 继承了WebMvcConfigurerAdapter,用来设置web的资源目录、控制器、过滤器等
- 增加@Configuration,表示该项目启动时加载
- 增加了CommonFilter,用设置可以限流、降级的资源,可以看到设置资源为/*
4、datasource.entity
不用说,这里放的是实体对象地方,主要有服务实体、指标实体、各种监控规则实体等
5、discovery
这个包下主要是sentinel客户端信息,也就是使用sentinel框架的客户端信息
- 主要可以看下SimpleMachineDiscovery这个方法,应用的信息会被保存在apps这个Map中。
- dashboard应用在启动后,客户端会调用/registry/machine(view包下的MachineRegistryController类)这个接口把服务信息写到Map中
- dashborad应用获取应用就是从map中拿的
6、domain
只有一个类ResourceTreeNode,就是监控指标的对象实体,主要包括qps,异常信息等信息。
7、metirc
只有个MetricFetcher类,表示获取应用的统计信息,也就是拉取实时监控信息
- 启动是通过构造函数调用start方法进行定时拉取所有客户端指标信息。执行周期是10+n1(秒)*
- fetchService线程池用来拉取该APP所有机器的metric
- fetchWorker工作线程池用来调用http获取实时指标信息
- 最后通过writeMetric方法调用的MetricsRepository的saveAll方法保存所有指标信息
8、repository
主要是metric和rule的信息保存
- metric的信息来源已经说过了,通过InMemoryMetricsRepository的save方法可以看到客户端实时指标信息在dashboard中保留5分钟
- rule包下的类主要是获取下一个为使用的id
9、util
- RuleUtils用来解析Rule的JSON对象
- VersionUtils解析Sentinel版本
10 view
这个包下就是一些资源控制器了,主要是前端提供接口
- AppController:应用列表控制器
- AuthorityRuleController:授权规则控制器
- DegradeController:降级控制器
- FlowController:降流控制器
- MachineRegistryController:应用注册控制,这个控制器比较特殊并不是给前端的,而是客户端注册使用的
- MetricController :实时监控控制器
- ParamFlowRuleController:热点参数规则
- ResourceController :机器资源
- SystemController :系统规则控制
11、DashboardApplication
应用启动类,可以直接启动,默认端口号8080
12、resources
资源配置文件:application.properties
13、webapp
这个就是前端资源目录,前端使用的是angularjs开发的,二次开发需要搭建前端环境,可以见目录下的README_zh.md文件。
二、分析
1、dashborad模块代码比较简单,主要数据都是从内存获取的
2、在面向生产使用时,还是缺少一些内容的,比如权限控制,数据持久化,登录功能等
3、前端使用angularjs开发,对未接触过人来说,二次开发前端页面难度较大
三、我的小结
1、sentinel系列通过先分享dashboard模块,主要考虑在一个可视化的界面中设置规则,方便后续模块的调试跟踪
2、大致分析了dashboard每个包下的内容
3、针对面向生产时,面对dashbord的痛点。下篇文章会介绍如何扩展一个生产使用的控制台传送门, 主要扩展以下功能:
A: 登录功能、设置统一拦截器
B: 系统权限功能,就是用户只能看到用户权限的系统
C: 核心数据持久化
Sentinel-dashboard的更多相关文章
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos
上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo.下面通过这篇,详细介绍当使用Nacos作为配置中心之后,如何实现Sentinel Dashbo ...
- Spring Cloud Alibaba基础教程:Sentinel Dashboard同步Apollo存储规则
在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...
- Sentinel Dashboard 的 Docker 镜像使用
1.下载 docker 镜像:https://hub.docker.com/r/anjia0532/sentinel-docker 2.启动 docker 容器:docker run -p8080:8 ...
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo
在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...
- Sentinel Dashboard(基于1.8.1)流控规则持久化到Nacos——涉及部分Sentinel Dashboard源码改造
前言 之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8, ...
- Sentinel Dashboard 规则 持久化到Nacos
本篇文章基于sentinel1.8.4版本进行改造的.本篇主要记录改造步骤 1.下载源码 https://github.com/alibaba/Sentinel 2.打开下载的sentinel,到se ...
- Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则.Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储 ...
- Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则
通过上一篇<使用Sentinel实现接口限流>的介绍,相信大家对Sentinel已经有了初步的认识.在Spring Cloud Alibaba的整合封装之下,接口限流这件事情可以非常轻易的 ...
- Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流
最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...
- [Spring-Cloud-Alibaba] Sentinel 规则持久化
在之前的练习中,只要应用重启,就需要重新配置,这样在我们实际的项目是非常不实用的,那么有没有办法把我们配置的规则保存下来呢?答案是YES,那么接下来,给大家来介绍如何将Sentinel规则持久化. D ...
随机推荐
- jquery中ajax跨域的写法
由于JS同源策略的影响,因此js只能访问同域名下的文档.因此要实现跨域,一般有以下几个方法: 一.处理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2 ...
- PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
本文实例讲述了PHP获取日期对应星期.一周日期.星期开始与结束日期的方法.分享给大家供大家参考,具体如下: /* * 获取日期对应的星期 * 参数$date为输入的日期数据,格式如:2018-6-22 ...
- C与C++基础知识补遗
本随笔用来记载项目开发中遇到的以前没掌握的C/C++基础知识 void * buffer; 无类型指针,可以指向任何类型数据.ANSI标准规定无类型指针不能进行算法,而GNU规定无类型指针算法操作与c ...
- 词频统计 ——Java
github地址 :https://github.com/NSDie/personal-project 一.计划表 PSP2.1 Personal Software Process Stages 预估 ...
- icmp隧道手工操作
ICMP协议被用于检测网络连通状态的协议,通常情况下,防火墙会默认放过该协议. 渗透测试中经常出现一种情况是,我们通过某一种方式取得了一台主机的权限,得到了一些文件,比如域hash,密码文件之类的东西 ...
- APUE学习笔记——6 系统数据文件与信息
1.用户口令:/etc/passwd文件 该文件中包含下列结构体信息.其中,当下主修熊passwd不再这里显示,是使用了一个占位符. struct passwd { char * pw_name; / ...
- mac svn: E210004: Number is larger than maximum
SVN服务器IP地址发现改变,在Eclipse中的SVN资源库中执行Relocate重定位时发生错误: mac svn: E210004: Number is larger than maximum ...
- Golang的简明安装指南
引言: Go language现在是大名鼎鼎,很多的开源项目都是基于go来做的,比如codis, ethereum等都用到了go lang,所以免不了要使用这个东东,本文将简明介绍安装步骤以及环境变量 ...
- MySQL笔记之多表
貌似很久不写博客了,趁着项目刚完结,记录一下这段时间了解到的一些认识,或许有些地方理解的还不够到位,看到的希望能不吝赐教. 外键 概念 与索引的关系 写法 查询 一对多多对一查询 多对多查询 插入 多 ...
- 基于sklearn进行文本向量化
sklearn中,计数向量化用CountVectorizer,tfidf向量化用TfidfVectorizer: import pickle from sklearn.feature_extracti ...