在微服务架构中,服务的数量通常会不断增加。客户端需要与多个微服务进行交互,这就带来了一些问题,比如服务的路由、负载均衡、安全认证等。服务网关作为微服务架构中的重要组件,就像整个微服务系统的大门,负责统一处理客户端的请求,为客户端提供一个统一的入口。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
@EnableZuulProxy
public 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:8081
zuul.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);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public 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;
@Configuration
public class ZuulConfig {
@Bean
public 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 有所帮助!