Spring Cloud Gateway-系统保护Sentinel集成

文章目录

    • Sentinel介绍
    • Spring Cloud Gateway集成Sentinel
      • pom依赖
      • Sentinel配置
      • Sentinel集成Nacos作为数据源
      • 自定义降级响应

Sentinel介绍

​ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 — 摘自官网

Spring Cloud Gateway集成Sentinel

pom依赖

​ 添加spring cloud gateway sentinel的starter依赖。

<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

Sentinel配置

​ 引入starter依赖后只需要一些配置就可以实现网关对于后端API的流控,降级等功能,具体的实现starter提供实现,Spring Cloud Gateway可以让spring-cloud-alibaba-sentinel-gateway中的自动化配置生效,配置前缀前缀为spring.cloud.sentinel.filter.scg

  • Spring Cloud Alibaba Sentinel 提供了这些配置选项
配置项含义默认值
spring.cloud.sentinel.enabledSentinel自动化配置是否生效true
spring.cloud.sentinel.eager是否提前触发 Sentinel 初始化false
spring.cloud.sentinel.transport.port应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer(可以不配置)8719
spring.cloud.sentinel.transport.dashboardSentinel 控制台地址(可以配置host:port,这样就不用单独配置port)
spring.cloud.sentinel.transport.heartbeat-interval-ms应用与Sentinel控制台的心跳间隔时间
spring.cloud.sentinel.transport.client-ip此配置的客户端IP将被注册到 Sentinel Server 端
spring.cloud.sentinel.filter.orderServlet Filter的加载顺序。Starter内部会构造这个filterInteger.MIN_VALUE
spring.cloud.sentinel.filter.url-patterns数据类型是数组。表示Servlet Filter的url pattern集合/*
spring.cloud.sentinel.filter.enabledEnable to instance CommonFiltertrue
spring.cloud.sentinel.metric.charsetmetric文件字符集UTF-8
spring.cloud.sentinel.metric.file-single-sizeSentinel metric 单个文件的大小
spring.cloud.sentinel.metric.file-total-countSentinel metric 总文件数量
spring.cloud.sentinel.log.dirSentinel 日志文件所在的目录
spring.cloud.sentinel.log.switch-pidSentinel 日志文件名是否需要带上pidfalse
spring.cloud.sentinel.servlet.block-page自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL
spring.cloud.sentinel.flow.cold-factorhttps://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81— %E5%86%B7%E5%90%AF%E5%8A%A8[冷启动因子]3
spring.cloud.sentinel.zuul.order.preSentinelZuulPreFilter 的 order10000
spring.cloud.sentinel.zuul.order.postSentinelZuulPostFilter 的 order1000
spring.cloud.sentinel.zuul.order.errorSentinelZuulErrorFilter 的 order-1
spring.cloud.sentinel.scg.fallback.modeSpring Cloud Gateway 熔断后的响应模式(选择 redirect or response)
spring.cloud.sentinel.scg.fallback.redirectSpring Cloud Gateway 响应模式为 ‘redirect’ 模式对应的重定向 URL
spring.cloud.sentinel.scg.fallback.response-bodySpring Cloud Gateway 响应模式为 ‘response’ 模式对应的响应内容
spring.cloud.sentinel.scg.fallback.response-statusSpring Cloud Gateway 响应模式为 ‘response’ 模式对应的响应码429
spring.cloud.sentinel.scg.fallback.content-typeSpring Cloud Gateway 响应模式为 ‘response’ 模式对应的 content-typeapplication/json

请注意。这些配置只有在 Servlet 环境下才会生效,RestTemplate 和 Feign 针对这些配置都无法生效

​ 表格中的配置看似很多,实际上应用的并不多,有些配置使用默认值即可,根据实际需求配置响应参数即可,这里我给出一个我本地的一个配置示例,配置直接使用可能有问题,因为我这里只摘取了spring.cloud.gateway.sentinel的相关配置,仅供参考。

spring:application:name: ruuby-gatewayprofiles:active: devcloud:gateway:routes:- id: account-svcuri: lb://account-svcpredicates:- Path=/gateway/account/**filters:- StripPrefix=1sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8080filter:enabled: true# 配置默认fallback,也可以编码自定义fallback  scg.fallback:mode: responseresponse-status: 444response-body: 1234scg:order: -100

​ 配置完成后启动网关,这时候可以在Sentinel控制台中看到gateway已经注册到了Sentinel控制台,但是没有任何资源,这时候需要手动创建资源,资源就是Sentinel系统保护的一个单元。在Spring Cloud Gateway中配置的资源可以是url,也可以是转发服务的服务id,也就是服务发现的service,如上配置中的account-svc,所以我们在Sentinel控制台就可以创建熔断或限流规则,我这里创建了一个流控规则,API名称就是account-svc,API类型是Route ID,阈值类型是QPS,单机的阈值是0,如下图:
在这里插入图片描述

​ 这就意味着一个请求都不会转发到account-svc服务的请求,因为阈值设置为0,请求结果如下:

在这里插入图片描述

account-svc是一个使用Spring Cloud Alibaba开发脚手架开发的一个业务服务,后面在讲到服务发现注册的时候会把该服务的一些代码写出来,也可以参考GitHub。

Sentinel集成Nacos作为数据源

​ 在生产系统中,我们往往不会对接Sentinel的控制台,而且想在服务启动时就已经把Sentinel控制的资源配置好,这个时候我们可以将Sentinel控制的数据源配置起来,这里就以Nacos为例,将Sentinel的资源配置通过Nacos配置中心管理。

spring-cloud-alibaba-sentinel-gatewaystarter中已经提供了Sentinel DataSource的相关依赖,我们在使用时只需要配置即可。配置内容如下:

  • ruuby-gateway-dev.yml配置
server:port: 8081spring:application:name: ruuby-gatewayprofiles:active: devcloud:nacos:username: "nacos"password: "nacos"discovery:# 服务注册中心地址server-addr: 127.0.0.1:8848# 阿里云平台ak,sk# access-key:# secret-key:namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2config:server-addr: 127.0.0.1:8848# 阿里云平台ak,sk# access-key:# secret-key:# 配置文件格式file-extension: ymlshared-configs:- ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2group: DEFAULT-GROUPgateway:routes:- id: account-svcuri: lb://account-svcpredicates:- Path=/gateway/account/**filters:- StripPrefix=1sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8080# nacos配置持久化datasource:ds1:nacos:server-addr: 127.0.0.1:8848dataId: ${spring.application.name}-sentinel-${spring.profiles.active}.jsonnamespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2groupId: DEFAULT_GROUPdata-type: jsonrule-type: gw-flowfilter:enabled: true# 配置默认fallback,也可以编码自定义fallback  scg.fallback:mode: responseresponse-status: 444response-body: 1234scg:order: -100

spring.cloud.sentinel.datasource配置制定数据源,数据源可以是多个,这里使用的是nacos,配置的Sentinel规则的配置文件是${spring.application.name}-sentinel-${spring.profiles.active}.json也就是ruuby-gateway-sentinel-dev.json,配置内容格式为json,该配置内容如下:

[{"resource": "account-svc","count": 5,"grade": 0,"limitApp": "default"}
]

​ 启动网关,这时可以在Sentinel控制台上看到我们在json文件中配置好的流控规则,如下图:

在这里插入图片描述

​ 这时如果在Nacos修改参数会同步到Sentinel控制台,但是从Sentinel控制台修改参数不会同步到Nacos配置中心,所以生产上如果使用Nacos作为Sentinel数据源的话,建议从Nacos上修改Sentinel资源参数。

自定义降级响应

​ 通过上面的实验,我们可以知道通过配置spring.cloud.gateway.sentinel.filter.scg.fallback可以实现服务降级后的返回,Spring Cloud Gateway Sentinel也提供了接口让开发人员实现自定义的服务降级响应,只要实现BlockRequestHandler即可,代码如下:

@Slf4j
public class SentinelFallbackHandler implements BlockRequestHandler {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange,Throwable throwable) {log.info(LogUtil.marker(), "SCG Sentinel blocked!");return ServerResponse.status(444).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue("SCG Sentinel blocked!"));}
}

​ 自定义降级配置代码如下:

@Configuration
public class GatewayConfiguration {@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public SentinelFallbackHandler sentinelFallbackHandler() {return new SentinelFallbackHandler();}
}

注:使用自定义降级时不能配置spring.cloud.gateway.sentinel.filter.scg.fallback,配置的优先级是大于自定义实现的

​ 测试结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发实例(七)Axios的安装与使用

说明&#xff1a; 如果只是在前端&#xff0c;axios常常需要结合mockjs使用&#xff0c;如果是前后端分离&#xff0c;就需要调用对应的接口&#xff0c;获取参数&#xff0c;传递参数&#xff1b;由于此文章只涉及前端&#xff0c;所以我们需要结合mockjs使用&#xff1b;由于…

动态规划(算法竞赛、蓝桥杯)--分组背包DP

1、B站视频链接&#xff1a;E16 背包DP 分组背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品&#xff0c;能放…

H12-821_106

106.如图所示&#xff0c;RTA的GEO/0/0、GEO/0/1接口分别连接部门1和2&#xff0c;其网段分别为10.1.2.0/24、10.1.3.0/24网段&#xff0c;为限制部门1和2之间的相互访间&#xff0c;在RTA上部署traffic-filter&#xff0c;以下哪些部署方式是正确&#xff1f; A.配置ACL3000拒…

scanBasePackages原理和使用范例

scanBasePackages原理和使用范例 目录概述需求&#xff1a; 设计思路实现思路分析1.正文 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,…

JavaWeb--JDBC

一&#xff1a;JDBC概述 1.概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 2.本质 官方&#xff08; sun 公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口&#xff1b;各个…

【无标题】TMGM官网平台切尔西足球俱乐部合作

TMGM作为一家在三大洲均设有办事处的行业领导者&#xff0c;TMGM 被视为可靠的差价合约交易提供商&#xff0c;其重点是监管合规、技术创新与他联系➕&#x1f6f0;️TMGM818卓越的客户服务。 切尔西足球俱乐部在亚太地区拥有庞大的球迷群体&#xff0c;并在该地区建立了多种亚…

给自己的2023年写了个年终总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 2023年的余额已经严重不足&#xff0c;再有5天&#xff0c;2023年也将成为历史中的年份了。 从网上看到很多小伙伴已经进入了年终总结的模式&#xff0c;我也忍不住想&#xff0c;今年收获了什么&#xff1f;又失去了…

mac iNode 断开后没网 经测试 后台还在运行

界面断开&#xff0c;但是连不上网&#xff1a;实际上可能是服务在后台还在运行 解决方式&#xff1a;终端执行命令 &#xff0c;手动停止iNode服务 sudo /Library/StartupItems/iNodeAuthService/iNodeAuthService stop 停掉之后&#xff0c;有可能连不上网&#xff0c;断开wi…

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据&#xff0c;去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章&#xff0c;这次是根据…

【C语言】熟悉文件顺序读写函数

前言 本篇详细介绍了 文件顺序读写常用函数&#xff0c;快来看看吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 ​编辑 文件顺序读写函数 fgetc函数 示例 fputc函数 逐个字符写入 写入26个字母 文…

Vue全家桶:vue2+vue3全部搞懂:第六篇,了解Vue生命周期,如何一进页面就马上发送请求、渲染页面

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;不然不好懂 这一专栏知识将一次性将vue、vue2、vue3全部讲明白 一、啥是Vue的生命周期&#xff0c;一个Vue生命周期有哪几个阶段&#xff1f; 简单来说生命周期就是从【你&#xff08;new…

11:日志分析系统ELK|Elasticsearch|kibana

日志分析系统ELK&#xff5c;Elasticsearch&#xff5c;kibana 日志分析系统ELKELK概述Elasticsearch安装Elasticsearch部署Elasticsearch集群Elasticsearch插件 熟悉Elasticsearch的API调用_cat API创建 tedu 索引使用 PUT 方式增加数据查询数据修改数据删除数据 KibanaKibana…