1.作用
请求路由。请求过滤。
通过使用Zuul来创建各种校验过滤器,然后指定哪些规则的请求需要执行校验逻辑,只有通过校验的才会被路由到具体的微服务接口,不然就返回错误提示
2.zuul-client
2.1 配置文件
server:
port: 8766 #端口号
spring:
application:
name: service-zuul #服务注册中心测试名
zuul:
routes:
api-a:
path: /ribbon/**
serviceId: ribbon-provider #如果是/ribbon/**路径下的请求,则跳转到service-ribbon
api-b:
path: /feign/**
serviceId: feign-provider #如果是/feign/**路径下的请求,则跳转到service-feign
eureka:
client:
serviceUrl:
defaultZone: http://admin:123@localhost:8761/eureka/ #服务注册中心
2.2 依赖和注解
依赖:spring-cloud-starter-netflix-zuul; spring-cloud-starter-netflix-eureka-client
注解:在启动类上增加注解:@EnableZuulProxy;@EnableEurekaClient
2.3 通配符说明
?:匹配任意单个字符
* :匹配任意数量的字符
**:匹配任意数量的字符,并支持多级目录
2.4 过滤类
在启动类上增加过滤类:
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
编写过滤类:AccessFilter
public class AccessFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
log.warn("accessToken is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("accessToken is empty");
} catch (Exception e) {
}
return null;
}
log.info("access is ok");
return null;
}
}
2.5 过滤类说明
- filterType: 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为pre,代表会在请求被路由之前执行。
- filterOrder: 过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。
- shouldFilter: 判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。
- run: 过滤器的具体逻辑。这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然也可以进 一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回的body内容进行编辑等。
2.6 访问地址
访问http://localhost:8766/ribbon/test?accessToken=ribbon,跳转到ribbon服务的接口下。