项目背景:
要求配置文件application.properties加入一个开关gisq.zipkin.enable控制zipkin的日志是否写入elk.
分析:
其实就是gisq.zipkin.enable开关控制zipkin的过滤器,如果打开开关则走zipkin过滤器,反之不走过滤器
spring中添加过滤器的方式
方式一:通过web.xml中配置过滤器
<filter>
<filter-name>delegatingTracingFilter</filter-name>
<filter-class>brave.spring.webmvc.DelegatingTracingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>delegatingTracingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>zipkinFilter</filter-name>
<filter-class>com.gisquest.platform.filter.ZipkinFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>zipkinFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方式二:通过注解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<Class<?>> 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;
}