使⽤sentinel遇到的⼀些坑
在之前的架构⾥边,想要在gateway⽹关⾥边使⽤阿⾥的开源技术,sentinel来做⽹关层⾯的限流。⼀⽅⾯,阿⾥开源的,扛过⾼并发,上过⽣产,放⼼使⽤。另⼀⽅⾯社区相对来说已经成熟。
但是由于错误的评估,话费了⾮常多的时间,因为sentinel使⽤起来,并不是那么的容易。特别是⽤在gateway⽹关中,更是到处都是坑。
⽬前我已经实现
1. gateway整合sentinel ,也就是在⽹关层⾯,实现使⽤sentinel限流。限流包括针对客户端ip限流,针对热点参数限流,针对head的某个字段限流。
2. 在经过修改源码以后,能够实现将sentinel的限流规则从dashbord推送到nacos。
我的技术选⽤
springboot 2.2.5
<version>2.2.5.RELEASE</version>
springCloud Hoxton.SR3
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
springCloudAlibaba 2.2.1.RELEASE
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
gateway 利⽤了springCloudAlibaba去适配的版本
nacos 利⽤了springCloudAlibaba去适配的版本, nacous的职责有 :注册中⼼*(⽤于gateway根据服务名称准发)、服务的配制中⼼、sentinel限流规则持久化的承载中⼼
这篇⽂章的⽬的
帮助想要使⽤sentinel的⼈,合理的去避免⼀些坑,少⾛⼀些弯路。明确⼀点,我这个主要针对在gateway⽹关中使⽤sentinel。我会写出来⼀些例⼦,就是demo项⽬的全部代码。
不是和sentinel官⽅抬杠。写的真的不怎么样,我是⼀个喜欢以官⽅⽂档作为⼀⼿学习资料的⼈,但是看过这么多,唯独sentinel这个,实在是看不下去,到处都是坑。
先来聊聊sentinel中都有哪些坑
官⽅⽂档不完整
sentinel的官⽅⽂档,真的敷衍的不⾏。如果不花点时间,真的不知道在搞什么,看着官⽅⽂档,绝对搞不出来个⼀⼆三来。没有注意事项,没有详细的⽂档。⾃⼰借助了挺多⽂章来解决问题的。我都会分享出来。
使⽤sentinel因为版本没选对,⽽导致sentinel限流不⽣效问题
各种不⽣效问题,多半是因为选⽤版本造成的。sentinel的官⽅⽂档上,并没有告诉我们,我们具体应该使⽤哪个版本。这就导致了,⽹上、社区⾥,官⽅⾥,到处都是问为什么我的sentinel不⽣效。sentinel⽀持了跟很多技术的整合,可能功能挺好,但是⽂档太寒酸了。我会在这篇⽂章⾥把能⽤的资料都分享出来,具体的问题,在哪⾥资料,以及如何解决。
我遇到的第⼀个问题,就是在gateway 中刚引⼊sentinel的时候,限流不⽣效。官⽅⽂档没有告诉我们,springboot的版本⼤于
2.2.0 ⼩于 2.
3.1的。这个官⽅⽂档上并没有说。如果超出这个范围就是不⽣效。这是在我怎么都不⽣效的时候,我重新创建项⽬重新引⼊依赖的时候发现的。看下边的截图。
关于需要改源码才⽣上⽣产的问题
sentinel官⽅版本,⽬前到1.8.2版本是不⽀持 持久化限流规则的。在官⽅⽂档上,告诉我们,这样不能上⽣产,想要上⽣产,必须改造源码。⾄于怎么改造,没有明说,官⽹的例⼦很难看懂。果然是做技术
的都不喜欢写⽂档,感情官⽹是加班写的吧。不过毕竟是有收费版的,如果这个⼤家都能⽤了,谁还去⽤收费版呢!
能够上⽣产的sentinel,必须是把限流规则持久化到例如 nacos,等⽂件中。我们希望在⽣产中,能够不重启⽹关服务,就能够进⾏修改流控规则。我们最想要在sentinel提供的dashbord控制台修改了限流规则,然后把这个规则推到nacos,然后由我们的⽹关客户端吗,把它加载到内存中,并且限流⽣效。我选⽤的是使⽤nacos来做持久化,源码也是针对nacos来改造的。其实也不是很难,抓住⼀个关键点,⽆⾮就是到把限流规则加载到内存中的操作,替换成推送到nacos。始终都是围绕这个点来展开的,我会⽤⼀篇详细的⽂章来介绍,如何改源码。并负责能让你的流控⽣效,⼜能持久化到你的nacos中。
⽽限流规则⼀共有这么⼏种⽅式:
通过编写代码的⽅式(弊端就是,每次修改规则,都需要重启⽹关,但凡是线上项⽬,都不会每次都重启项⽬来更新限流规则);
通过sentinel提供的dashbord控制台(官⽅实现的是基于内存的,重启项⽬,就会丢失,相当于是每次重启项⽬,都需要⼿动重新配制限流规则,⼩孩⼦过家家,都不会这样玩);
或者引⼊第三⽅放数据源(⽀持nacos,⽂件,等。但是想要使⽤这个,都是需要⾃⼰实现的,需要改源码的。本⾝sentinel源码⾥边并不⽀持,只能通过改源码)。
如何解决问题
官⽅⽂档不完整
关于这个问题,个⼈是时间。很难不去全部补上,我这⾥只能给⼀个可⽤的案例。我会提供两篇单独的⽂章补到这⾥。⼀篇是 gateway + sentinel + nacos 的案例。
⼀篇是修改源码,让sentinel—gateway ⽀持推送限流规则到 nacos。
我会保证我写的案例,⼀步⼀步跟着做出来,能够跑通。不再踩坑!
使⽤sentinel因为版本没选对,⽽导致sentinel限流不⽣效问题
另外我在这⾥分享出来我gateway整合sentinel 的全部的pom。这个是我使⽤的,我可以保证百分百能⽤。替换成我的,还是不能⽤的话,绝对是其他地⽅的错误,不⽤担⼼是因为版本的问题。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.angus</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>业务⽹关</description>
<!-- 如果想要使⽤我的依赖依赖的话,就从这⾥开始,复制我的替换你全部pom。另外我这个是改造了把限流规则持久化到nacos的依赖,
如果没有改造则不⽤引⼊ -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
&ding>UTF-8</ding>
&porting.outputEncoding>UTF-8</porting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<hutool.version>5.4.3</hutool.version>
<fastjson.version>1.2.71</fastjson.version>
<lombok.version>1.18.8</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 基于 spring cloud gateway 实现⽹关服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 整合 nacos 服务注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 添加监控端点的访问依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 这个也是⽤来连接客户端和sentinel服务端的。在这⾥说⼀下sentinl服务端是指,你下载了sentinel的dashbord后台的jar包,并启动了起来。此时你的⽹关部分就叫客户端。真正执⾏限流的部分,是在⽹关实现的,连上服务端,也只是为了获取限流规则。-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.csp</groupId>-->
<!-- <artifactId>sentinel-transport-simple-http</artifactId>-->
fastjson怎么用<!-- <version>1.7.1</version>-->
<!-- </dependency>-->
<!--这⾥边是包括了上边提到的,连接sentinel dashbord 后台的实现,为什么使⽤这个不使⽤上边的。
因为使⽤上边的不能在 yml配制 sentinel相关的内容。配制以后不⽣效。这也是导致sentinel不⽣效的原因,有的有察觉到是配制⽂件不⽣效-->
<!-- sentinel 和 alibaba结合相关的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- gateway⽹关相关的依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
<version>1.8.1</version>
</dependency>
<!-- sentinel热点参数限流相关的依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.8.1</version>
</dependency>
<!-- sentinel限流规则持久化nacos⽤到的相关的依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论