oot与springcloud的版本不一致导致的,以后有同学遇到同样问题,记得将对应的版本号改成一致
在实际开发过程中,我们详细的版本对应关系:
现在我们将父pom中springcloud的版本号修改为:Greenwich.SR1 ,再启动springcloud-zuul-server服务模块,可以启动成功了,eureka上服务信息如下:
打开浏览器访问访问zuul服务的端口9700:http://localhost:9700/api/a/testzuul?name=young码农,我们发现/api/b/*的请求路由到 springcloud-ribbon-client模块
打开浏览器访问zuul服务的端口9700:http://localhost:9700/api/b/testzuul?name=young码农,我们发现/api/b/*的请求路由到 springcloud-feign-client模块
三、Zuul实现服务过滤:
zuul不仅只是路由,并且还能过滤,可以用来做一些安全验证和日志记录,我写一个简单的接口执行时间记录的功能
新建一个类:BaseZuulFilter
package com.haly.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class BaseZuulFilter extends ZuulFilter {
protected final Logger logger = LoggerFactory.getLogger(getClass());
// 单例多线程 开始时间绑定在线程上
private ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
@Override
public String filterType() {
// 在请求被处理之后,会进入该过滤器
return "post";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
// 请求开始计时
long startTime = System.currentTimeMillis();
startTimeThreadLocal.set(startTime);
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
String requestURI = String.valueOf(context.get("requestURI"));
// 请求结束时间
Long startTime = startTimeThreadLocal.get();
Long endTime = System.currentTimeMillis();
logger.info("[进入zuul日志记录功能] RequestURI:{}, {}:ms", requestURI, endTime - startTime);
return null;
}
}
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:路由之前
routing:路由之时
post: 路由之后
error:发送错误调用
filterOrder:过滤的顺序
shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
浏览器分别请求zuul服务模块:http://localhost:9700/api/b/testzuul?name=young码农,http://localhost:9700/api/b/testzuul?name=young码农,会打印如下日志:
2019-05-25 16:41:07.228 INFO 20984 --- [io-9700-exec-10] com.haly.filter.BaseZuulFilter : [进入zuul日志记录功能]请求地址:/testzuul, 耗时0:ms
有兴趣的可以自己参考上面代码,做一个简单接口权限验证的功能。
四、总结:
当前为止,项目结构:
|