Spring Cloud教程-实现 Zuul 日志过滤器
实现 Zuul 日志过滤器
在前一节中,我们讨论了在 API 网关中实现的常见功能。我们已经准备好了充当 API 网关的 Zuul 服务器。
在本节中,我们将在 Zuul API 网关中实现日志记录功能。
让我们在 Zuul API 网关中实现日志记录。
步骤 1: 在 netflix-zuul-api-gateway-server 项目中,创建一个名为 ZuulLoggingFilter 的新类文件。
步骤 2: 添加注解 @Component。
步骤 3: 扩展 ZuulFilter 类。ZuulFilter 类中有一些抽象方法,这些抽象方法必须在 ZuulLoggingFilter 类中实现。
步骤 4: 将光标移到 ZuulLoggingFilter 类上。它会提供两个快速修复选项,如下图所示。单击 Add unimplemented methods。我们将获得 ZuulFilter 类的所有抽象方法的默认实现。
ZuulFilter 类有四个抽象方法,如下所示:
- shouldFilter(): shouldFilter() 方法检查请求并决定是否执行过滤器。
- run(): 如果 !isFilterDisabled() 和 shouldFilter() 方法都返回 true,则会调用 run() 方法。
- filterType(): filterType() 方法按类型分类过滤器。在 Zuul 中有四种标准过滤器类型:pre 用于前置路由过滤,route 用于路由到原始源,post 用于后置路由过滤,error 用于错误处理。Zuul 还支持静态类型用于静态响应。可以创建或添加任何过滤器类型,并通过调用方法 runFilters(type) 运行它们。
- filterOrder(): 必须为过滤器定义过滤器顺序。如果过滤器的优先级不重要,那么过滤器可以具有相同的过滤器顺序。过滤器顺序不需要是连续的。
步骤 5: 创建 Logger 类对象,并调用 getLogger() 方法创建一个记录器。
private Logger logger=LoggerFactory.getLogger(this.getClass());
记住:导入 org.slf4j 包的 Logger 类。
步骤 6: 在 run() 方法中实现逻辑。
public Object run() throws ZuulException
{
//getting the current HTTP request that is to be handle
HttpServletRequest request=RequestContext.getCurrentContext().getRequest();
//printing the detail of the request
logger.info("request -> {} request uri-> {}", request, request.getRequestURI());
return null;
}
ZuulLoggingFilter.java
package cn.javatiku.microservices.netflixzuulapigatewayserver;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
@Component
public class ZuulLoggingFilter extends ZuulFilter
{
//creating Logger object
private Logger logger=LoggerFactory.getLogger(this.getClass());
@Override
public booleanshouldFilter()
{
return true; //executing filter for every request
}
//log the content of the request
@Override
public Object run() throws ZuulException
{
//getting the current HTTP request that is to be handle
HttpServletRequest request=RequestContext.getCurrentContext().getRequest();
//prints the detail of the requestin the log
logger.info("request -> {} request uri-> {}", request, request.getRequestURI());
return null;
}
@Override
public String filterType()
{
return "pre"; //intercept all the request before execution
}
@Override
public intfilterOrder()
{
return 1; //setting filter order to 1
}
}
在下一步中,我们将看到如何使用 Zuul 拦截请求。