1. 序言

sentinel 默认加载到内存中,项目启动之后流控规则其实没办法改变了,sentinel这里提供了一个dashboard 服务,可以启动客户端查看对应的配置信息,也可以监控,十分方便

sentinel引入 服务端和客户端的概念

  • 服务端:及控制台dashboard程序,需要单独启动项目
  • 客户端:每一个用了sentinel且引入了连接包的服务

2. 基础工程

2.1. 工程搭建

2.1.1. 服务端

服务端直接从官方网站上下载即可:sentinel-dashboard

下载完成后启动jar 包

1
java -jar sentinel-dashboard-1.8.1.jar --server.port=8847 

默认的服务端口为8080,一般而言我们需要修改一下。
启动之后服务端就完成了

2.1.2. 客户端

客户端不需要做特殊改造,只需要引入依赖和加入配置即可

2.1.2.1. pom

1
2
3
4
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>

2.1.2.2. 配置文件

classpath下新建文件sentinel.properties

1
2
3
4
5
6
7
8
# dashboard显示的名称
project.name=test-transport
# dashboard的地址
csp.sentinel.dashboard.server=127.0.0.1:8847
# 日志输出方式,不重要
csp.sentinel.log.output.type=console
# app类型,这不能乱写,写了可能连接不上流控降级规则,默认为0,有篇文章说到因为顺序问题,在微服务中可以加type=11解决规则连接不上的问题
# csp.sentinel.app.type=11

引入后客户端会自动与服务端保持连接

dashboard

flow

2.1.3. 规则修改

规则修改可以在此处修改,修改后客户端的规则生效,默认保存在客户端内存中,重启后失效。

rule

2.2. 原理简介

2.2.1. 启动原理

  1. dashboard为单独的一个工程,其数据维护在内存当中,当启动dashboard时数据为空。
  2. 客户端启动时不会马上调用接口注册到dashboard中,注册是一个懒加载过程:当第一次调用流控规则时才启动新的端口(一般为8719,由客户端自动检测,当检测到有占用时会寻找下一个,也可以自己配置),之后注册到dashboard中,然后dashboard中显示相关数据。
  3. 当修改数据后dashboard调用客户端的接口将数据传给客户端,客户端保存至内存中

2.3. 问题及解决

  1. 客户端无法注册
    问题: 第一次引入的时候直接将sentinel-dashboard工程放在云服务器上运行,本地启动工程注册到dashboard中,出现了工程注册不上的问题
    原因: 服务在心跳检测的时候是dashboard调用客户端的接口,不是客户端主动上报的模式,因此本地的服务是无法被dashboard调用到的`
    解决: 本地启动dashboard工程,保持能互相调用

  2. 客户端获取不到流控规则
    问题: 注册上了但是没获取到流控规则,只有实时监控有监控数据
    原因: 配置了sentinel.properties中配置了csp.sentinel.app.type=1导致检测到为网关服务,调用接口时以网关的模式调用,因此检测不到数据
    解决: 配置文件就不要乱改,默认的为csp.sentinel.app.type=0就是为普通工程

引用:
未检测到规则的记录

3. 进阶-数据同步持久化模式

dashboard和客户端通信包括三种模式原始模式、Pull模式、Pull模式,其优缺点如下

推送模式 描述 优点 缺点 是否适用生产环境 图片
原始模式 规则推送到客户端并直接存储在内存 简单,无额外依赖 数据一致性差,服务重启时,内存中数据回消失 原始模式
Pull模式 客户端主动向某个规则管理中心(RDBMS,文件等)定期轮询拉起规则 简单,无额外依赖,规则持久化 一致性差,实时性差,拉取过于频繁时,可能存在性能问题 pull模式
Push模式 规则中心(Nacos、Zookeeper等配置中心)统一推送,客户端通过注监听器得方式时刻监听变化 持久化、一致化、快速 引入第三方依赖 PUSH模式

引用1
官方文档1
官方文档2

一般我们将配置交予第三方统一管理,选择push模式