1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
spring-boot-starter-actuator是微服务监控的,sentinel需要这个
2.添加yml配置,为微服务设置sentinel控制台地址
添加Sentinel后,需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的,所以需要设置,测试http://localhost:8800/actuator/sentinel
server:
port: 8800
spring:
application:
name: mall-user-sentinel-demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: 127.0.0.1:8080
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
# port: 8719
#暴露actuator端点
management:
endpoints:
web:
exposure:
include: '*'
3.在sentinel控制台中设置流控规则
- 资源名: 接口的API
- 针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
- 阈值类型: 分为QPS和线程数 假设阈值为10
- QPS类型: 只得是每秒访问接口的次数>10就进行限流
- 线程数: 为接受请求该资源分配的线程数>10就进行限流
测试: 因为QPS是1,所以1秒内多次访问会出现如下情形:
访问http://localhost:8800/actuator/sentinel, 可以查看flowRules
微服务和Sentinel Dashboard通信原理
Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制台,架构图如下所示:
浏览器访问: http://localhost:8719/api
[
{
"url": "/cnode",
"desc": "get clusterNode metrics by id, request param: id={resourceName}"
},
{
"url": "/setParamFlowRules",
"desc": "Set parameter flow rules, while previous rules will be replaced."
},
{
"url": "/origin",
"desc": "get origin clusterNode by id, request param: id={resourceName}"
},
{
"url": "/cluster/server/flowRules",
"desc": "get cluster flow rules"
},
{
"url": "/cluster/server/modifyFlowConfig",
"desc": "modify cluster server flow config"
},
{
"url": "/cluster/server/modifyTransportConfig",
"desc": "modify cluster server transport config"
},
{
"url": "/basicInfo",
"desc": "get sentinel config info"
},
{
"url": "/getClusterMode",
"desc": "get cluster mode status"
},
{
"url": "/cluster/client/modifyConfig",
"desc": "modify cluster client config"
},
{
"url": "/setClusterMode",
"desc": "set cluster mode, accept param: mode={0|1} 0:client mode 1:server mode"
},
{
"url": "/getRules",
"desc": "get all active rules by type, request param: type={ruleType}"
},
{
"url": "/api",
"desc": "get all available command handlers"
},
{
"url": "/setRules",
"desc": "modify the rules, accept param: type={ruleType}&data={ruleJson}"
},
{
"url": "/cluster/server/modifyNamespaceSet",
"desc": "modify server namespace set"
},
{
"url": "/cluster/client/fetchConfig",
"desc": "get cluster client config"
},
{
"url": "/cluster/server/paramRules",
"desc": "get cluster server param flow rules"
},
{
"url": "/tree",
"desc": "get metrics in tree mode, use id to specify detailed tree root"
},
{
"url": "/cluster/server/fetchConfig",
"desc": "get cluster server config"
},
{
"url": "/version",
"desc": "get sentinel version"
},
{
"url": "/clusterNode",
"desc": "get all clusterNode VO, use type=notZero to ignore those nodes with totalRequest <=0"
},
{
"url": "/jsonTree",
"desc": "get tree node VO start from root node"
},
{
"url": "/getParamFlowRules",
"desc": "Get all parameter flow rules"
},
{
"url": "/cluster/server/modifyParamRules",
"desc": "modify cluster param flow rules"
},
{
"url": "/metric",
"desc": "get and aggregate metrics, accept param: startTime={startTime}&endTime={endTime}&maxLines={maxLines}&identify={resourceName}"
},
{
"url": "/systemStatus",
"desc": "get system status"
},
{
"url": "/cluster/server/modifyFlowRules",
"desc": "modify cluster flow rules"
},
{
"url": "/cluster/server/metricList",
"desc": "get cluster server metrics"
},
{
"url": "/getSwitch",
"desc": "get sentinel switch status"
},
{
"url": "/setSwitch",
"desc": "set sentinel switch, accept param: value={true|false}"
},
{
"url": "/clusterNodeById",
"desc": "get clusterNode VO by id, request param: id={resourceName}"
},
{
"url": "/cluster/server/info",
"desc": "get cluster server info"
}
]