最近在研究Sentinel,前几天写的demo可以正常运行,在控制台 簇点链路中能显示接口,中间穿插着去做其他工作了,昨天再次启动后,发现簇点链路中显示不出调用的接口了,加上今天找了差不多2天问题…记录一下,和网上能找到的问题不太一样
用的是相对新的1.8.5版本的Sentinel,为不用最新版本呢,我刚开始研究的时候1.8.5是最新的,过了没几天之后,就发布了新版1.8.6,哈哈哈哈,因为源码已经改了懒得升级了,新版没准BUG还多
言归正传,当时看到Sentinel是支持openfegin的流控的,找博客发现大部分都是在说openfegin的fallback 处理,然后又研究了一下这个,再往后就去忙别的了。
现在问题是正常接口显示不出来,但是openfegin接口能在簇点链路中显示!!!
调用的是log-demo-service1的接口,log-demo-service1调用log-demo-service2的fegin接口,簇点链路中只有fegin接口,不显示我调用的log-demo-service1接口。
首先怀疑的是openfegin的问题,调用log-demo-service2的接口,log-demo-service2没有调用fegin,但是发现log-demo-service2也不行。而且之前是可以的log-demo-service1接口和fegin接口都能显示出来,这个直接paas
然后怀疑是包的问题,检查包,感觉没什么异常
翻了各种博客、文章,去github看Sentinel 的文档,一步步找问题,也没找到,昨天一整天各种改,怎么都不行,给我整崩溃了…
今天上午忙别的,下午决定重新弄个简单项目,单纯的springboot试一下看,然后逐步加上异常处理、fegin这些,新建项目,果然直接成功
简单项目,只有个ctrl,一个get接口
@RestController
@RequestMapping("test")
public class TestCtrl {
@GetMapping("{id}")
public String test1(@PathVariable("id") String id) {
return "GET:" + id;
}
@PostMapping ("{id}")
public String test2(@PathVariable("id") String id) {
return "POST:" + id;
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>sentinel-testartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<spring-cloud.version>2020.0.6spring-cloud.version>
<spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version>
<spring-boot-version>2.5.12spring-boot-version>
<lombok-version>1.18.20lombok-version>
<jdev-version>2.0.0jdev-version>
properties>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.12version>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot-version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok-version}version>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
project>
下一步,加上我司自己定义的基础包,处理全局异常、fegin异常的错误解码器等等,加上之后果然不行了,那么问题就在这几个基础包里。
首先考虑的是jar包里某些配置有冲突,我将基础包里引的包一个个排除
结果,全部排除了也还是不行。后来想起来这个基础包定义了几个配置类,通过spring.factories注入到spring,试着将这几个配置逐一排除,最终发现是这个配置导致的
@Slf4j
@ConditionalOnProperty(prefix = SimpleWebMvcConfigBean.PREFIX, name = "simple-config.enable", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@Configuration
public class SimpleWebMvcConfiguration extends WebMvcConfigurationSupport {
}
具体原因找不到,能力不够哈…但是猜测问题出在@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个
所以Sentinel 应该也有类似的处理,但是我翻了翻源码,没找到,希望有大佬可以指点一下
我直接将基础包里的这个类去掉了,当时定义了这个类应该就是留个口子,以后方便自定一些处理,但是现在里面没有东西,我试了一下删除后也没啥问题,看看后面会不会有坑吧