zuul功能
- Zuul 包含了对请求路由和校验过滤两个最主要的功能:
- 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:
- 客户端请求网关/api/product,通过路由转发到product服务,客户端请求网关/api/order,通过路由转发到order服务
- 而过滤功能则负责对请求的处理过程进行干预,是实现请求校验等功能的基础。
- 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:
- Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
zuul自定义过滤器
- 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的4个方法,如下:
- filterType:返回字符串代表过滤器的类型,返回值有:
- pre:在请求路由之前执行
- route:在请求路由时调用
- post:请求路由之后调用, 也就是在route和errror过滤器之后调用
- error:处理请求发生错误时调用
- filterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
- shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。
- run:过滤器的业务逻辑。
- filterType:返回字符串代表过滤器的类型,返回值有:
- 自定义过滤器 LoginFilter
- 继承 ZuulFilter
- 在类上添加 @Component 注解 (一定不要少了)
- 实现抽象方法
示例:
@Component //一定不要少了
public class LoginFilter extends ZuulFilter {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public String filterType() {
return "pre"; //请求路由前调用
}
@Override
public int filterOrder() {
return 1; //int值来定义过滤器的执行顺序,数值越小优先级越高
}
@Override
public boolean shouldFilter() {
return true; //该过滤器是否执行,true执行,false不执行
}
//定义 过滤功能
@Override
public Object run() {
//1.获取请求上下文
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
//如果说请求带了token值,则表示已经登录过
if (token == null) {
logger.warn("此操作需要先登录系统");
//没有登录 过,则不进行路由转发
context.setSendZuulResponse(false);//拒绝访问
context.setResponseStatusCode(200); //响应状态码
try {
context.getResponse().getWriter().write("token is empty...");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//通过,会进行路由转发
logger.info("通过,会进行路由转发");
return null;
}
}
Q.E.D.