Spring Boot/Cloud集成Sentinel实现流量控制 | Spring Cloud 23
创始人
2025-05-29 08:30:45
0

一、前言

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

在前面我们通过以下章节对Sentinel有了基础的了解:

Sentinel:分布式系统的流量防卫兵 | Spring Cloud 19

Sentinel:资源与规则定义 | Spring Cloud 20

Sentinel:原理深入浅出解读 | Spring Cloud 21

Sentinel:流量控制规则定义详解 | Spring Cloud 22

现在开始我们正式学习SentinelSpring Boot/Cloud中的集成使用。

二、启动Sentinel 控制台

Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。这里,我们将会详细讲述如何通过简单的步骤就可以使用这些功能。

Sentinel 控制台包含如下功能:

  • 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
  • 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
  • 规则管理和推送:统一管理推送规则。
  • 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。

2.1 获取 Sentinel 控制台

您可以从 release 页面 下载最新版本的控制台 jar 包。

2.2 启动 Sentinel 控制台

注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

使用如下命令启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080
其中 -Dcsp.sentinel.dashboard.server=consoleIp:port 用于指定 Sentinel 控制的访问地址,用于客户端接入控制台

Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel

在这里插入图片描述

2.3 触发客户端初始化

确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。

注意:您还需要根据您的应用类型和接入方式引入对应的 适配依赖,否则即使有访问量也不能被 Sentinel 统计。

2.4 查看机器列表以及健康情况

当您在机器列表中看到您的机器,就代表着您已经成功接入控制台;如果没有看到您的机器,请检查配置,并通过 ${user.home}/logs/csp/sentinel-record.log.xxx 日志来排查原因

在这里插入图片描述

注意:若接入 Sentinel 控制台不成功,可以参考 FAQ 排查问题。

三、项目集成 Sentinel

3.1 项目总体结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jiS(https://img-blog.csdnimg.cn/b43dd593e13f4f4890eacef98b051d1a.png)]
s://img-blog.csdnimg.cn/2761e8d353bf4b5783e4ae6b60002c1d.png)

  • 模块sentinel-nacos-provider

    用于演示自定义限流处理逻辑

  • 模块sentinel-nacos-consumer

    用于演示SentinelFeign 集成
    用于演示SentinelRestTemplate集成
    用于演示Sentinel 链路流控模式

3.2 sentinel-nacos-provider模块

3.2.1 引入依赖

com.alibaba.cloudspring-cloud-starter-alibaba-sentinel

完整sentinel/sentinel-nacos-provider/pom.xml


com.gmsentinel0.0.1-SNAPSHOT4.0.0sentinel-nacos-providerorg.springframework.cloudspring-cloud-starter-bootstraporg.springframework.cloudspring-cloud-starter-loadbalancercom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatorcom.alibaba.cloudspring-cloud-starter-alibaba-sentinelorg.springframework.bootspring-boot-maven-pluginsrc/main/resourcestrue**/*.xlsx**/*.xlssrc/main/resourcesfalse**/*.xlsx**/*.xls

3.2.2 自定义限流处理逻辑

自定义限流处理逻辑可以有两种实现方式

  • 方式一:新增 BlockExceptionHandler 实现类覆盖默认的 DefaultBlockExceptionHandler
  • 方式二:使用 @SentinelResource 注解的 blockHandlerblockHandlerClass 两个参数指定限流处理逻辑方法

本示例只演示方式一

限流默认处理类 DefaultBlockExceptionHandler

public class DefaultBlockExceptionHandler implements BlockExceptionHandler {public DefaultBlockExceptionHandler() {}public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {response.setStatus(429);PrintWriter out = response.getWriter();out.print("Blocked by Sentinel (flow limiting)");out.flush();out.close();}
}

新建com/gm/sentinel_nacos_provider/component/CustomUrlBlockHandler.java

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class CustomUrlBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg = null;if (e instanceof FlowException) {msg = "限流了,请稍后访问";} else if (e instanceof DegradeException) {msg = "降级了,返回默认数据";} else if (e instanceof ParamFlowException) {msg = "热点参数限流";} else if (e instanceof SystemBlockException) {msg = "系统规则(负载/...不满足要求)";} else if (e instanceof AuthorityException) {msg = "授权规则不通过";}// http状态码response.setStatus(500);response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json;charset=utf-8");response.setContentType("application/json;charset=utf-8");JSONObject jsonObject = new JSONObject();jsonObject.put("msg", msg);response.getWriter().write(jsonObject.toJSONString());}
}

3.2.3 新建服务测试类

新建com/gm/sentinel_nacos_provider/controller/ProviderController.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProviderController {@Value("${server.port}")private int port;@RequestMapping(value = "sayHello", method = RequestMethod.GET)public String sayHello(@RequestParam String world) {return "当前服务端口为:" + port + ",请求参数:" + world;}
}

3.2.4 新建服务启动类

新建com/gm/sentinel_nacos_provider/SentinelNacosProviderApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class SentinelNacosProviderApplication {public static void main(String[] args) {SpringApplication.run(SentinelNacosProviderApplication.class, args);}
}

3.2.5 配置文件信息

src/main/resources/bootstrap.yml:

server:port: 4000spring:application:name: @artifactId@cloud:nacos:username: @nacos.username@password: @nacos.password@discovery:server-addr: ${NACOS_HOST:nacos1.kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos2kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos3.kc}:${NACOS_PORT:8848}sentinel:transport:port: 8719dashboard: 127.0.0.1:8080
management:endpoints:web:exposure:include: '*'

3.2.6 流量控制测试

先访问:http://127.0.0.1:4000/sayHello?world=hello%20world 测试功能是否正常访问:

在这里插入图片描述

进入Sentinel控制台对/sayHello新增流控规则:

在这里插入图片描述

再次访问:http://127.0.0.1:4000/sayHello?world=hello%20world 验证流控规则和自定义限流控制逻辑是否生效:

在这里插入图片描述

此时通过响应结果可知:流控规则和自定义限流控制逻辑均已生效。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...