网上介绍zuu、介绍zuul过滤器的很多,就不再一一赘述,整了一个pre、一个error的过滤器,简单的看看网关的调用情况
代码实现如下:
preFilter
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.nykj.framework.utils.Identities;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @auther: com.cn
* @description:
* @date: 17:59 2018/7/30
*/
@Component
@Slf4j
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
/**
* 未在网关中配置的路径不会路由到这里
* @return
*/
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String uuid = Identities.uuid();
log.info("send {} request to {} 请求ip:{}; uuid:{}", request.getMethod(), request.getRequestURL().toString(), getIpAddress(request), uuid);
request.setAttribute("request-uuid", uuid);
return null;
}
public String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
ErrorFilter
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @auther: com.cn
* @description:
* @date: 18:16 2018/7/30
*/
@Component
@Slf4j
public class ErrorFilter extends ZuulFilter {
@Override
public String filterType() {
return "error";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String requestUuid = (String)request.getAttribute("request-uuid");
log.error("异常过滤器: send {} request to {}, RequestContext ResponseBody:{}, 请求uuid:{}", request.getMethod(), request.getRequestURL().toString(),ctx.getResponseBody(), requestUuid);
log.error("异常过滤器: realUri路径 {}, 请求uuid:{}, (可能会打印两次)异常信息:{} ", ctx.get("requestURI"), requestUuid, ((Exception)ctx.get("throwable")));
return null;
}