Sentinel 控制台 簇点链路不显示正常接口资源,但能显示openfegin接口资源

项目场景:

最近在研究Sentinel,前几天写的demo可以正常运行,在控制台 簇点链路中能显示接口,中间穿插着去做其他工作了,昨天再次启动后,发现簇点链路中显示不出调用的接口了,加上今天找了差不多2天问题…记录一下,和网上能找到的问题不太一样


问题描述

用的是相对新的1.8.5版本的Sentinel,为不用最新版本呢,我刚开始研究的时候1.8.5是最新的,过了没几天之后,就发布了新版1.8.6,哈哈哈哈,因为源码已经改了懒得升级了,新版没准BUG还多

言归正传,当时看到Sentinel是支持openfegin的流控的,找博客发现大部分都是在说openfegin的fallback 处理,然后又研究了一下这个,再往后就去忙别的了。

现在问题是正常接口显示不出来,但是openfegin接口能在簇点链路中显示!!!
Sentinel 控制台 簇点链路不显示正常接口资源,但能显示openfegin接口资源_第1张图片
调用的是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>

Sentinel 控制台 簇点链路不显示正常接口资源,但能显示openfegin接口资源_第2张图片
下一步,加上我司自己定义的基础包,处理全局异常、fegin异常的错误解码器等等,加上之后果然不行了,那么问题就在这几个基础包里。

首先考虑的是jar包里某些配置有冲突,我将基础包里引的包一个个排除
Sentinel 控制台 簇点链路不显示正常接口资源,但能显示openfegin接口资源_第3张图片
结果,全部排除了也还是不行。后来想起来这个基础包定义了几个配置类,通过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 应该也有类似的处理,但是我翻了翻源码,没找到,希望有大佬可以指点一下


解决方案:

我直接将基础包里的这个类去掉了,当时定义了这个类应该就是留个口子,以后方便自定一些处理,但是现在里面没有东西,我试了一下删除后也没啥问题,看看后面会不会有坑吧

你可能感兴趣的:(java,sentinel,sentinel,java,spring,boot)