Netflix OSS项目Zuul充当后端服务的网关,并支持添加安全性,路由等边缘功能。 在Zuul世界中,称为Zuul过滤器的组件提供了特定的边缘功能,为基于Spring Cloud的项目编写这种过滤器非常简单。 此处提供了添加过滤器的良好参考。 在这里,我想演示两个小功能–确定过滤器是否应对请求执行操作,其次要在转发请求之前添加标头。
编写Zuul过滤器
对于Spring Cloud而言 ,编写Zuul过滤器非常容易,我们需要做的就是添加一个实现ZuulFilter的Spring bean,因此在此示例中,它看起来像这样:
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Service;@Service
public class PayloadTraceFilter extends ZuulFilter {private static final String HEADER="payload.trace";@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 999;}@Overridepublic boolean shouldFilter() {.... }@Overridepublic Object run() {....}
}
此实现的一些高级细节,已将其标记为“ pre”的“过滤器类型”,这意味着将在将请求分派到后端服务之前调用此过滤器,filterOrder确定何时在服务器中调用此特定过滤器过滤器链,过滤器应确定是否为此请求完全调用此过滤器,并且运行包含过滤器的逻辑。
因此,就我的第一个考虑而言,此过滤器是否应完全作用于流-可以在逐个请求的基础上完成,我的逻辑很简单-如果请求uri以/ samplesvc开头,则此过滤器应对请求起作用。
@Override
public boolean shouldFilter() {RequestContext ctx = RequestContext.getCurrentContext();String requestUri = ctx.getRequest().getRequestURI();return requestUri.startsWith("/samplesvc");
}
关于修改后端服务的请求标头的第二个注意事项:
@Override
public Object run() {RequestContext ctx = RequestContext.getCurrentContext();ctx.addZuulRequestHeader("payload.trace", "true");return null;
}
获得此类请求的支持服务可以查找标头并采取相应的措施,例如,在这种特定情况下,请查看“ payload.trace”标头并决定记录传入的消息:
@RequestMapping(value = "/message", method = RequestMethod.POST)
public Resource<MessageAcknowledgement> pongMessage(@RequestBody Message input, @RequestHeader("payload.trace") boolean tracePayload) {if (tracePayload) {LOGGER.info("Received Payload: {}", input.getPayload());}
....
结论
如此处所示,Spring Cloud确实很容易为任何边缘需求添加Zuul过滤器。 如果您想进一步探索此样本,我可以在
我的github仓库 。
翻译自: https://www.javacodegeeks.com/2016/07/spring-cloud-zuul-writing-filter.html