Sentinel 实战-控制台篇
逅弈 转载请注明原创出处,谢谢!
系列文章
Sentinel 原理-全解析
Sentinel 原理-调用链
Sentinel 原理-滑动窗口
Sentinel 原理-实体类
Sentinel 实战-限流篇
Sentinel 实战-控制台篇
Sentinel 实战-规则持久化
Sentinel 实战-集群限流篇
Sentinel 系列教程,现已上传到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all_4_you/sentinel-tutorial
sentinel-tutorial.png
通过 Sentinel 的控制台,我们可以对规则进行查询和修改,也可以查看到实时监控,机器列表等信息,所以我们需要对 sentinel 的控制台做个完整的了解。
部署控制台
首先需要启动控制台, sentinel 的控制台是用 spring boot 写的一个web 应用,我们有几种方式来获取控制台:
下载可执行 jar 包
从 release 页面 下载截止目前为止最新版本的控制台 jar 包,如下图所示:
sentinel-dashboard-release-jar-1.png
下载源码构建
除了可以下载预先构建好的可执行 jar 包之外,我们还可以把控制台的工程下载下来自行用源码构建,sentinel 是一个多 maven 模块的项目,控制台是其中的一个项目,如下图所示:
sentinel-dashboard-module-1.png
如上图所示,我们可以下载完整的 sentinel 的项目,然后构建其中的 sentinel-dashboard 模块,也可以只下载 sentinel-dashboard 模块然后构建。
这里我选择将完整的 sentinel 工程下载下来,然后构建 sentinel-dashboard 模块,首先在项目根目录下执行:
cd sentinel-dashboard
将会进入 dashboard 模块,然后在 dashboard 目录下执行:
mvn clean package
maven将会把 sentinel-dashboard 模块打包成一个可执行的 fat jar包,如下图所示:
sentinel-dashboard-module-2.png
sentinel-dashboard-module-3.png
启动控制台
构建成功后,就可以启动控制台了,执行以下命令:
java -Dserver.port=8080 \
-Dcsp.sentinel.dashboard.server=localhost:8080 \
-jar target/sentinel-dashboard.jar
其中 -Dserver.port=8080
用于指定 Sentinel 控制台端口为 8080
。
执行完之后,你将看到如下信息:
sentinel-dashboard-start-1.png
sentinel-dashboard-start-2.png
当看到 Started DashboardApplication in xx seconds
时,说明你的控制台已经启动成功了,访问 http://localhost:8080/ 就可以看到控制台的样子了,如下图所示:
sentinel-dashboard-1.png
可以看到当前控制台中没有任何的应用,因为还没有应用接入。
接入控制台
要想在控制台中操作我们的应用,除了需要部署一个控制台的服务外,还需要将我们的应用接入到控制台中去。
引入 transport 依赖
首先需要在我们使用 sentinel 的服务中引入 sentinel-transport 的依赖,因为我们的应用是作为客户端,通过transport模块与控制台进行通讯的,依赖如下所示:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>x.y.z</version>
</dependency>
版本依然选择最新的 1.4.0
配置应用启动参数
引入了依赖之后,接着就是在我们的应用中配置 JVM 启动参数,如下所示:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
其中的consoleIp和port对应的就是我们部署的 sentinel dashboard 的ip和port,我这里对应的是 127.0.0.1 和 8080,按照实际情况来配置 dashboard 的ip和port就好了,如下图所示:
sentinel-connection-properties.png
从图中可以看到我设置的客户端的应用名为:lememo,当客户端连接上控制台后,会显示该应用名。
PS:需要注意的是,除了可通过 JVM -D 参数指定之外,也可通过 properties 文件指定,配置文件的路径为 ${user_home}/logs/csp/${project.name}.properties
。
配置文件中参数的key和类型如下所示:
sentinel-dashboard-properties.png
优先级顺序:JVM -D 参数的优先级最高,若 properties 文件和 JVM 参数中有相同项的配置,以 JVM -D 参数配置的为准。
触发客户端连接控制台
客户端配置好了与控制台的连接参数之后,并不会主动连接上控制台,需要触发一次客户端的规则才会开始进行初始化,并向控制台发送心跳和客户端规则等信息。
客户端与控制台的连接初始化是在 Env 的类中触发的,即下面代码中的 InitExecutor.doInit();
:
public class Env {public static final NodeBuilder nodeBuilder = new DefaultNodeBuilder();public static final Sph sph = new CtSph();static {// If init fails, the process will exit.InitExecutor.doInit();}
}
埋点
上篇文章中我们创建了一个 UserService 来做验证,正常时会返回一个用户对象,被限流时返回一个null,但是这样不太直观,本篇文章我换一个更简单和直观的验证方式,代码如下所示:
@GetMapping("/testSentinel")
public @ResponseBody
String testSentinel() {String resourceName = "testSentinel";Entry entry = null;String retVal;try{entry = SphU.entry(resourceName,EntryType.IN);retVal = "passed";}catch(BlockException e){retVal = "blocked";}finally {if(entry!=null){entry.exit();}}return retVal;
}
PS:这里有个需要注意的知识点,就是 SphU.entry 方法的第二个参数 EntryType 说的是这次请求的流量类型,共有两种类型:IN 和 OUT 。
IN:是指进入我们系统的入口流量,比如 http 请求或者是其他的 rpc 之类的请求。
OUT:是指我们系统调用其他第三方服务的出口流量。
入口、出口流量只有在配置了系统规则时才有效。
设置 Type 为 IN 是为了统计整个系统的流量水平,防止系统被打垮,用以自我保护的一种方式。
设置 Type 为 OUT 一方面是为了保护第三方系统,比如我们系统依赖了一个生成订单号的接口,而这个接口是核心服务,如果我们的服务是非核心应用的话需要对他进行限流保护;另一方面也可以保护自己的系统,假设我们的服务是核心应用,而依赖的第三方应用老是超时,那这时可以通过设置依赖的服务的 rt 来进行降级,这样就不至于让第三方服务把我们的系统拖垮。
下图描述了流量的类型和系统之间的关系:
sentinel-entry-type.png
连接控制台
应用接入 transport 模块之后,我们主动来访问一次 /testSentinel
接口,顺利的话,客户端会主动连接上控制台,并将自己的ip等信息发送给控制台,并且会与控制台维持一个心跳。
现在我们在来访问下控制台,看到客户端已经连接上来了,如下图所示:
sentinel-dashboard-2.png
客户端连接上dashboard之后,我们就可以为我们定义的资源配置规则了,有两种方式可以配置规则:
- 在【流控规则】页面中新增
- 在【簇点链路】中添加
我们可以在【流控规则】页面中新增,点击【流控规则】进入页面,如下图所示:
sentinel-add-flow-rule-1.png
在弹出框中,填写资源名和单机阈值,其他的属性保持默认设置即可,如下图所示:
sentinel-add-flow-rule-2.png
点击【新增】后,规则即生效了。
第二种方式就是在【簇点链路】的页面中找到我们埋点的资源名,然后直接对该资源进行增加流控规则的操作,如下图所示:
sentinel-add-flow-rule-3.png
上图中右侧的【+流控】的按钮点击后,弹出框与直接新增规则是一样的,只是会自动将资源名填充进去,省去了我们设置的这一步。
验证效果
规则创建完成之后,我们就可以在【流控规则】页面查询到了,如下图所示:
sentinel-flow-rule-list.png
接着我们就可以来验证效果了,让我们在浏览器中快速的刷新来请求 /testSentinel
这个接口,不出意外,应该会看到如下图所示的情况:
sentinel-flow-rule-effect-1.png
说明我们设置的流控规则生效了,请求被 block 了。
现在我们再到控制台的【实时监控】页面查询下,刚刚我们的一顿疯狂请求应该有很多都被 block 了,通过的 qps 应该维持在2以下,如下图所示:
sentinel-flow-rule-effect-2.png
原理
我们知道 sentinel 的核心就是围绕着几件事:资源的定义,规则的配置,代码中埋点。
而且这些事在 sentinel-core 中都有能力实现,也对外暴露了相应的 http 接口方便我们查看 sentinel 中的相关数据。
CommandCenter
sentinel-core 在第一次规则被触发的时候,启动了一个 CommandCenter,也就是我们引入的 sentinel-transport-simple-http 依赖中被引入的实现类:SimpleHttpCommandCenter。
这个 SimpleHttpCommandCenter 类中启动了两个线程池:主线程池和业务线程池。
主线程池启动了一个 ServerSocket 来监听默认的 8719 端口,如果端口被占用,会自动尝试获取下一个端口,尝试3次。
业务线程池主要是用来处理 ServerSocket 接收到的数据。
将不重要的代码省略掉之后,具体的代码如下所示:
public class SimpleHttpCommandCenter implements CommandCenter {// 省略初始化private ExecutorService executor;private ExecutorService bizExecutor;@Overridepublic void start() throws Exception {Runnable serverInitTask = new Runnable() {int port;{try {port = Integer.parseInt(TransportConfig.getPort());} catch (Exception e) {port = DEFAULT_PORT;}}@Overridepublic void run() {// 获取可用的端口用以创建一个ServerSocketServerSocket serverSocket = getServerSocketFromBasePort(port);if (serverSocket != null) {// 在主线程中启动ServerThread用以接收socket请求executor.submit(new ServerThread(serverSocket));// 省略部分代码} else {CommandCenterLog.info("[CommandCenter] chooses port fail, http command center will not work");}executor.shutdown();}};new Thread(serverInitTask).start();}class ServerThread extends Thread {private ServerSocket serverSocket;ServerThread(ServerSocket s) {this.serverSocket = s;}@Overridepublic void run() {while (true) {Socket socket = null;try {socket = this.serverSocket.accept();setSocketSoTimeout(socket);// 将接收到的socket封装到HttpEventTask中由业务线程去处理HttpEventTask eventTask = new HttpEventTask(socket);bizExecutor.submit(eventTask);} catch (Exception e) {// 省略部分代码}}}}
}
具体的情况如下图所示:
command-center.png
HTTP接口
SimpleHttpCommandCenter 启动了一个 ServerSocket 来监听8719端口,也对外提供了一些 http 接口用以操作 sentinel-core 中的数据,包括查询|更改规则,查询节点状态等。
PS:控制台也是通过这些接口与 sentinel-core 进行数据交互的!
提供这些服务的是一些 CommandHandler 的实现类,每个类提供了一种能力,这些类是在 sentinel-transport-common 依赖中提供的,如下图所示:
command-handler.png
查询规则
运行下面命令,则会返回现有生效的规则:
curl http://localhost:8719/getRules?type=<XXXX>
其中,type有以下取值:
flow
以 JSON 格式返回现有的限流规则;degrade
则返回现有生效的降级规则列表;system
则返回系统保护规则。
更改规则
同时也可以通过下面命令来修改已有规则:
curl http://localhost:8719/setRules?type=<XXXX>&data=<DATA>
其中,type 可以输入 flow
、degrade
等方式来制定更改的规则种类,data
则是对应的 JSON 格式的规则。
其他的接口不再一一详细举例了,有需要的大家可以自行查看源码了解。
作者:逅弈
链接:https://www.jianshu.com/p/c47dfd25eeee
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Sentinel 实战-控制台篇相关推荐
- sentinel 端口_Sentinel 实战控制台篇
上篇文章我通过一个简单的例子和大家分享了怎么接入 sentinel 但是规则的配置是通过硬编码来实现的,这种方式比较原始,不能动态修改,本篇文章我将通过接入 sentinel 控制台来解决这个问题. ...
- Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
本文是源码分析 Sentinel 系列的第十三篇,已经非常详细的介绍了 Sentinel 的架构体系.滑动窗口.调用链上下文.限流.熔断的实现原理,相信各位读者朋友们对Sentinel有一个较为体系化 ...
- vue 动态修改后端请求_vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单...
一. 前言 本篇基于 有来商城 youlai-mall微服务项目,通过对vue-element-admin的权限菜单模块理解个性定制其后台接口,实现对vue-element-admin工程几乎不做改动 ...
- service 层注入不同的数据源_.NET 理论基础+实战控制台程序实现AutoFac注入
(给DotNet加星标,提升.Net技能) 转自:在7楼 cnblogs.com/RayWang/p/11128554.html 简介 该系列共5篇文章,旨在以实战模式,在.NET下的 控制台程序 F ...
- 【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入
第一章|理论基础+实战控制台程序实现AutoFac注入 第二章|AutoFac的常见使用套路 第三章|实战Asp.Net Framework Web程序实现AutoFac注入 第四章|实战Asp.Ne ...
- 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...
- SpringBoot2零基础到项目实战-基础篇
springboot2零基础到项目实战-基础篇 课程内容说明 课程单元 学习目标 基础篇 能够创建SpringBoot工程 基于SpringBoot实现ssm/ssmp整合 应用篇 能够掌握Sprin ...
- IDEA的Docker插件实战(Dockerfile篇)
IDEA的Docker插件实战(Dockerfile篇) IntelliJ IDEA的Docker插件能帮助我们将当前工程制作成Docker镜像.运行在指定的远程机器上,是学习和开发阶段的好帮手,本文 ...
- Xamarin.Forms开发实战基础篇大学霸内部资料
Xamarin.Forms开发实战基础篇大学霸内部资料 介绍:本教程是国内第一本Xamarin.Forms开发专向教程.本教程针对Xamarin.Forms初学用户,全面细致的讲解Xmarin.For ...
- 数据中台实战入门篇:数据中台对内、对外合作机制
前言 之前文章讲了 <数据中台实战入门篇:双中台战略>,主要解决了什么是中台.什么是数据中台.业务中台.什么公司适合搭建双中台体系这几个问题.本篇文章讲一下数据中台的人员构成.内部如何合作 ...
最新文章
- (七)Vue 项目规范
- 要有自己的核心竞争力,应对时代变迁
- php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例
- 【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!
- 命令行解决mysql中文乱码
- while(条件) 语句;语句 容易理解错的一点
- uniapp 微信内置浏览器h5打开app
- 23个海外求职找各种工作的招聘网站
- 对于拖延症的最好方法
- win11电脑上如何设置微信双开(打开两个微信)
- unity全局总的音频管理器
- 【移动安全实战篇】————3、Android应用程序破解入门
- windows上安装linux_Linux系统安装Windows软件? 通过这个工具可以做到
- 【西欧经济史第二版】【4】第一章 导言
- My Sql报错:1273 - Unknown collation: ‘utf8_chinese_ci‘
- arcgis 投影坐标系的区分
- three.js 导入显示模型的时候自动计算模型缩放比例
- Android内存检测工具
- linux修改用户名、密码、组名等详细步骤
- 基于JAVA视频点播系统设计与实现 开题报告