实现 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 类的所有抽象方法的默认实现。

implementing-zuul-logging-filter.png

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 拦截请求。

标签: spring, Spring教程, spring cloud, spring cloud教程, spring cloud框架, spring cloud面试题, springcloud组件, springcloud微服务架构, springcloud入门教程, springcloud主件, spring cloud架构图