(目前项目中使用的Hystrix,而Hystrix已经不维护了,至今仍然是2018年发布的1.5.8版本。)

开始学习一下新的服务治理框架Sentinel

Sentinel官网介绍

在集成Sentinel案例中碰到的问题

微服务,无法在sentinel dashboard中看到微服务的监控信息。

在网上查找的各位网友们的解决方法:

sentinel.eager

要配置sentinel.eager为true的,这个尝试了,确实可以在sentinel中直接就能看到服务信息,

但是在sentinel控制台中微服务的实时监控中,无法看到请求信息。

sentinel.transport.clientIp 

指定sentinel.transport.clientIp

增加启动参数

Dcsp.sentinel.dashboard.server=consoleIp:port

以上方法都试过了,并没有解决我遇到的问题。

有考虑过时版本兼容问题,也降过版本,还是不行。

我使用的spring boot、spring cloud 、spring cloud alibaba、 sentinel版本都是官方匹配的版本。

考虑过是其他依赖冲突、配置冲突导致,最后在不断的尝试中,终于找到了原因。

因为项目中配置了WebMvcConfigurationSupport ,导致sentinel拦截器失效。

package pers.kw.config.mvc;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;


@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TokenInfoInterceptor());
        super.addInterceptors(registry);
    }

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new StringHttpMessageConverter(
                StandardCharsets.UTF_8));

        //1、定义FastJson转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //2、添加fastjson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        SerializerFeature[] features = {
                SerializerFeature.WriteMapNullValue, // 输出空置字段
                SerializerFeature.WriteNullListAsEmpty, // list字段如果为null,输出为[],而不是null
                SerializerFeature.WriteNullStringAsEmpty,// 字符类型字段如果为null,输出为"",而不是null
                SerializerFeature.WriteMapNullValue //MAP为null输出空
        };
        //SerializerFeature.PrettyFormat
        fastJsonConfig.setSerializerFeatures(features);
        //3、在convert中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);

        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        //4、将convert添加到converters中
        converters.add(fastConverter);
        super.addDefaultHttpMessageConverters(converters);
    }
}

在openai找到了解释

在Spring Boot项目中,如果你配置了`WebMvcConfigurationSupport`类,可能会导致Sentinel无法监控到服务请求信息。这是因为`WebMvcConfigurationSupport`类会覆盖Spring Boot默认的Web MVC配置,其中包括Sentinel的拦截器。

为了解决这个问题,你可以尝试以下几种方法:

  1. 不使用`WebMvcConfigurationSupport`:如果你的项目中没有必要使用`WebMvcConfigurationSupport`,可以尝试删除该类或将其注释掉。这样可以恢复Spring Boot默认的Web MVC配置,包括Sentinel的拦截器。

  2. 手动添加Sentinel拦截器:如果你需要使用`WebMvcConfigurationSupport`类,可以尝试在该类中手动添加Sentinel的拦截器。你可以创建一个`Bean`,继承自`WebMvcConfigurer`接口,并重写`addInterceptors`方法,在方法中添加Sentinel的拦截器。

添加SentinelWebInterceptor到拦截器中

  @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TokenInfoInterceptor());
        registry.addInterceptor(new SentinelWebInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐