(目前项目中使用的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的拦截器。
为了解决这个问题,你可以尝试以下几种方法:
-
不使用`WebMvcConfigurationSupport`:如果你的项目中没有必要使用`WebMvcConfigurationSupport`,可以尝试删除该类或将其注释掉。这样可以恢复Spring Boot默认的Web MVC配置,包括Sentinel的拦截器。
-
手动添加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);
}