项目背景:
要求配置文件application.properties加入一个开关gisq.zipkin.enable控制zipkin的日志是否写入elk.
分析:
其实就是gisq.zipkin.enable开关控制zipkin的过滤器,如果打开开关则走zipkin过滤器,反之不走过滤器
spring中添加过滤器的方式
方式一:通过web.xml中配置过滤器delegatingTracingFilter brave.spring.webmvc.DelegatingTracingFilter delegatingTracingFilter /* zipkinFilter com.gisquest.platform.filter.ZipkinFilter 方式二:通过注解webfilter配置过滤器 @WebFilter public class ZipkinFilter implements Filter{ } 方式三:通过实现WebApplicationInitializer接口配置过滤器 public class ZipkinFilterInitialer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { //注册Filter Dynamic traceFilter = servletContext.addFilter("traceFilter",DelegatingTracingFilter.class); //添加Filter的映射路径 traceFilter.addMappingForUrlPatterns(null, false, "/*"); Dynamic zipkinFilter = servletContext.addFilter("zipkinFilter",ZipkinFilter.class); //添加Filter的映射路径 zipkinFilter.addMappingForUrlPatterns(null, false, "/*"); } } 方式四:ServletContainerInitializer和@HandlesTypes @HandlesTypes public class FilterInitializer implements ServletContainerInitializer { @Override public void onStartup(Set zipkinFilter /* > c, ServletContext ctx) throws ServletException { FilterRegistration.Dynamic dynamic = ctx.addFilter("cors", new CorsFilter()); dynamic.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); dynamic.setInitParameter("allowedMethods","GET,POST"); } }}
spring中添加过滤器遇到的问题
主要涉及到两个过滤器DelegatingTracingFilter、ZipkinFilter其中DelegatingTracingFilter是brave包中过滤器
方式一:无法通过开关控制,是否动态加载过滤器DelegatingTracingFilter、ZipkinFilter。
方式二:DelegatingTracingFilter是brave包中的过滤器,无法添加@webfilter注解
方式三:无法通过Environment对象获取到配置文件中的配置属性值,无法通过开关控制
方式四:无法通过Environment对象获取到配置文件中的配置属性值,无法通过开关控制
注:获取到配置文件中的配置属性值虽然可以通过多种方式:
private static PropertiesLoader propertiesLoader = new PropertiesLoader(
"config.properties", "config-common.properties");
但是项目中要求这些属性交spirng管理,便于后期扩展apollo,通过apollo动态修改配置文件的属性值
spring中添加通过开关滤器解决方法:
通过org.springframework.web.context.ContextLoaderListene接口添加过滤器
public class WebContextListener extends
org.springframework.web.context.ContextLoaderListener {
@Override
public WebApplicationContext initWebApplicationContext(
ServletContext servletContext) {
if (!UserService.printKeyLoadMessage()) {
return null;
}
WebApplicationContext webApplicationContext =super.initWebApplicationContext(servletContext);
String enable =webApplicationContext.getEnvironment().getProperty("gisq.zipkin.enable");
if (null != enable && "true".equals(enable)) {
//注册Filter
Dynamic traceFilter = servletContext.addFilter("traceFilter",DelegatingTracingFilter.class);
//添加Filter的映射路径
traceFilter.addMappingForUrlPatterns(null, false, "/*");
Dynamic zipkinFilter = servletContext.addFilter("zipkinFilter",ZipkinFilter.class);
//添加Filter的映射路径
zipkinFilter.addMappingForUrlPatterns(null, false, "/*");
}
return webApplicationContext;
}


