Zuul
Zuul 是 Netflix 的基于 JVM 的路由器和服务器端负载均衡器,提供智能路由、访问过滤等功能。
适用场景:Spring Cloud 微服务的统一入口、需要动态路由和过滤器机制的遗留系统维护。新项目推荐使用 Gateway。
已停止维护
Zuul 1.x 已停止维护,新项目推荐使用 Gateway。
快速开始
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>启动类加 @EnableZuulProxy 注解。
路由配置
# 忽略所有服务名直接访问
zuul.ignored-services=*
# 路由规则
zuul.routes.reception.service-id=service-reception
zuul.routes.reception.path=/reception/**过滤器
Zuul 提供四种过滤器类型:
| 类型 | 说明 | 场景 |
|---|---|---|
| PRE | 请求路由前调用 | 身份验证、路由选择 |
| ROUTING | 将请求路由到微服务 | 构建请求、调用服务 |
| POST | 路由到微服务后执行 | 添加响应头、统计 |
| ERROR | 其他阶段发生错误时执行 | 统一错误处理 |
自定义过滤器:
@Component
public class TestFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.DEBUG_FILTER_ORDER;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
String requestURI = currentContext.getRequest().getRequestURI();
return null;
}
}禁用默认过滤器:
zuul.SendErrorFilter.error.disable=true熔断降级
实现 FallbackProvider 接口:
@Component
public class ProviderFallback implements FallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "text/html; charset=UTF-8");
return headers;
}
@Override
public InputStream getBody() {
return new ByteArrayInputStream("服务正在维护,请稍后再试.".getBytes());
}
@Override
public HttpStatus getStatusCode() {
return HttpStatus.BAD_REQUEST;
}
@Override
public int getRawStatusCode() {
return HttpStatus.BAD_REQUEST.value();
}
@Override
public String getStatusText() {
return HttpStatus.BAD_REQUEST.getReasonPhrase();
}
@Override
public void close() {
}
};
}
}常见问题处理
路由不生效
- 检查
zuul.ignored-services是否误排除了目标服务 - 确认目标服务是否注册到注册中心
- 检查
zuul.routes的service-id和path配置
过滤器不执行
- 确认
shouldFilter()方法返回true - 检查过滤器是否添加了
@Component注解 - 确认
filterType()返回正确的类型(pre/route/post/error)