项目场景:

最近在研究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

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>sentinel-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>


        <spring-cloud.version>2020.0.6</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
        <spring-boot-version>2.5.12</spring-boot-version>
        <lombok-version>1.18.20</lombok-version>
        <jdev-version>2.0.0</jdev-version>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.12</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud 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>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok-version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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 应该也有类似的处理,但是我翻了翻源码,没找到,希望有大佬可以指点一下


解决方案:

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

GitHub 加速计划 / sentine / Sentinel
22.25 K
7.98 K
下载
alibaba/Sentinel: Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件,提供实时监控、限流、降级和系统保护功能,适用于微服务治理场景。
最近提交(Master分支:3 个月前 )
195150bc * fix issue 2485 which occur oom when using async servlet request. * optimize imports * 1. fix the same issue in the webmvc-v6x 2. improve based on review comments 2 个月前
b78b09d3 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐