前言
我们的项目为了方便移植,所以选择了阿里云来进行部署,脱离的公司自己的技术能力平台。项目中使用sentinel做 限流,单原本的sentinel只有基于的内存存储的单机限流攻击,无法满足线上软件的要求。我们需要在sentinel的基础上,改造dashboard完成如下能力。
- 接入Sentinel-Dashboard提供更灵活的限流配置管理和更直观的查看系统资源的入口。
- 接入nacos 提供持久化的限流配置存储能力。
- 接入token-server,提供集群限流的能力。
- Sentinel-Dashboard 接入sqllite,持久化度量展示。
本文则会详细展开来讲解每一项的改动过程。
sentinel 初识
在Sentinel改造之前,我们来简单看一下sentinel官方提供了什么的基础能力。
sentinel官网
在sentinel中,限流的基本单位就是资源。用户可以自己将应用程序中的任何内容定义为一个资源,并围绕这个资源实时设定相关的限流规则。从而实现系统的限流保护,熔断降级等高可用的保障能力。下面是官方提供的一个简单例子。
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
//指定资源
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//设置qps的限流值
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
public static void main(String[] args) {
// 配置规则.
initFlowRules();
//定义Hello World资源
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
至此,我们就简单的实现了使用sentinel做一个单机限流的一个代码实例,只不过这个限流的规则是通过硬编码的方式存储在应用启动的内存当中的。当应用启动以后将无法实时的查看资源的使用情况和动态调整资源的限流规则。为此Sentinel提供了一个dashbaord 启动控制台,可以实时监控各个资源的运行情况,并且可以实时地修改限流规则。
接入dashboard
首先我们将sentinel-dashboard下载到本地。先在github上找到sentinel的源代码,地址:https://github.com/alibaba/Sentinel。并单独打开sentinel-dashboard工程,
可以看到sentinel-dashboard是一个包含了前端和后端资源的springBoot工程,我们直接运行DashboardApplication就可以直接启动sentinel的dashboard。
我们把使用到限流的业务工程称为sentienl客户端, sentinel-dashboard启动后,我们先把dashboard放在一边,来看一下sentinel客户端如何接入dashboard.
sentienl的客户端和dashboard之间通过 sentinel-transport-simple-http 模块通信,sentinel客户端每秒讲资源的实时情况通过http汇总到dashboard,并监听来自于dashboard的规则修改指令。因此客户端需要引入如下依赖。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
客户端启动时,需要额外增加Sentinel相关的参数
-Dproject.name=client-biz-test # 指定当前客户端的名称
-Dcsp.sentinel.dashboard.server=127.0.0.1:8080 # 指定远程的dashoard的地址。
sentinel的资源创建是一个懒加载的过程,在客户端启动后,一定要先触发一次请求。否则在dashboard讲查看不到任何的客户端信息。触发一次后,再打开dashboard地址,通过默认的账号和密码(sentinel:sentinel)就可以查看到当前资源的信息了。
但目前来说,所有的规则配置信息都是保存着客户端内存中,如果客户端重启,所有的配置信息将全部丢失。如果想要在线上生成环境更好的使用sentinel就需要进行深入的改造工程。
开始sentinel改造之旅
接入nacos
改造的第一站,就是要实现 规则配置的持久化:将规则存储在第三方的配置中心(比如nacos或zookeeper),我在项目中使用的是nacos,本文也讲着重讲解如何使用nacos来存储规则。
sentienl的原始模式与push模式
上面的通过dashboard将配置写入到客户端内存中的这种方式就是原始模式。
而我们的目标:从nacos中实时感知规则配置的变更的这种模式就是push模式。
在push模式中控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端监听Nacos,获取配置变更的推送消息,完成本地配置更新。
sentinel的客户端改造
参考官方网站的指引:动态规则扩展
首先我们先完成 sentinel的客户端改造。只需要两步:
首先引入依赖
<dependency>
<groupId>com.alibaba.csp