在微服务架构中,服务的数量通常会不断增加。客户端需要与多个微服务进行交互,这就带来了一些问题,比如服务的路由、负载均衡、安全认证等。服务网关作为微服务架构中的重要组件,就像整个微服务系统的大门,负责统一处理客户端的请求,为客户端提供一个统一的入口。Zuul 是 Netflix 开源的一个基于 JVM 路由和服务端的负载均衡器,是传统服务网关的典型代表。本文将详细介绍 Zuul 的使用,包括基本概念、配置和演示代码。
使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加以下依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
在主应用类上添加 @EnableZuulProxy 注解:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication@EnableZuulProxypublic class ZuulGatewayApplication {public static void main(String[] args) {SpringApplication.run(ZuulGatewayApplication.class, args);}}
在 application.properties 中配置路由规则:
# 服务名映射到具体的服务地址zuul.routes.user-service.path=/user-service/**zuul.routes.user-service.url=http://localhost:8081zuul.routes.order-service.path=/order-service/**zuul.routes.order-service.url=http://localhost:8082
上述配置表示,所有以 /user-service 开头的请求将被转发到 http://localhost:8081,所有以 /order-service 开头的请求将被转发到 http://localhost:8082。
创建一个自定义的 PRE 过滤器,用于在请求被路由之前进行日志记录:
import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;public class LoggingFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();logger.info("Received request: {} {}", request.getMethod(), request.getRequestURL().toString());return null;}}
在配置类中注册自定义过滤器:
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class ZuulConfig {@Beanpublic LoggingFilter loggingFilter() {return new LoggingFilter();}}
启动 Zuul 网关服务以及模拟的 user-service 和 order-service。
使用浏览器或工具(如 Postman)发送请求:
http://localhost:8080/user-service/api/users,Zuul 网关会将该请求转发到 http://localhost:8081/api/users。http://localhost:8080/order-service/api/orders,Zuul 网关会将该请求转发到 http://localhost:8082/api/orders。同时,在控制台可以看到自定义过滤器记录的请求日志。
| 特性 | Zuul 1.x |
|---|---|
| 路由功能 | 支持基于 URL 的路由规则配置 |
| 过滤功能 | 提供 PRE、ROUTING、POST、ERROR 四种过滤器类型 |
| 性能 | 同步阻塞 I/O,高并发场景性能一般 |
| 维护情况 | 已停止维护 |
通过本文的介绍和演示代码,你应该对 Zuul 作为传统服务网关有了更深入的了解。虽然 Zuul 1.x 存在一些不足之处,但在一些中小规模的项目中仍然可以发挥重要作用。
希望本文对你理解和使用 Zuul 有所帮助!