Gateway

SpringCloudGateway是SpringCloud的全新组件,用于替代Zuul,基于Spring5和SpringBoot2构建。它提供统一的API路由管理,支持异步非阻塞操作。本文介绍了Gateway的基本概念如路由、断言和过滤器,并对比了Gateway与Zuul在性能和特性的差异。此外,展示了如何配置和使用Gateway,包括添加依赖、设置路由和使用过滤器进行权限验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud Gateway

简介

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由 方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

概念

Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为 真,则路由匹配。

Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹 配来自 HTTP 请求的任何内容,例如 headers 或参数。

Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请 求和响应。

Gateway和Zuul的区别与联系

Zuul
目前zuul有两个版本:zuul1和zuul2,目前spring cloud只集成了zuul1。zuul2是Netflix在2018年5月推出,它最 大的特点就是支持异步调用 (zuul1仅支持同步) ,可惜springcloud暂时没有计划集成zuul2,而且还推出spring cloud gateway来替代zuul1。

本质上就是一个同步 Servlet,每来一个请求,zuul会专门分配一个线程去处理,然后转发到后端服务,后端再启 线程处理请求,后端处理时网关的线程会阻塞,当请求数量比较大时,很容易造成线程池被沾满而无法接受新的请求,Netflix 为此还专门研发了Hystrix熔断组件来解决慢服务耗尽资源问题。

Gateway
Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成,开发体验相对来说十分不错。由于zuul2没有被spring cloud所集成,所以 拿zuul1与spring cloud gateway做一些简单的比较。

以下是比较图:

在这里插入图片描述
依赖

<dependency>
	<groupId>org.springframework.cloud</groupId> 
	<artifactId>spring-cloud-starter-gateway</artifactId> 
</dependency>

常用配置

spring: 
	cloud: 
		gateway: 
			discovery: 
				locator:
					enabled: true #开启从注册中心动态创建路由
			routes: 		# 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务] 
				- id: user-app		 # 当前路由的标识, 要求唯一
				  uri: lb://user-app #注册中心的配置 
				  #uri: http://localhost:8081 #实际路径
				  #order: 1 # 路由的优先级,数字越小级别越高
				  predicates: # 断言(就是路由转发要满足的条件)
				  	#- Path=/api/user/** # 当请求路径满足Path指定的规则时,才进行路由转发
				  	#- After=2022-01-20T06:06:06+08:00[Asia/Shanghai] #这个时间以后生效
				  	#- Cookie=username,mj #Cookie名必须为mj才能访问
				  	#- Method=GET #只有GET方法能访问
				  #filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
				  	#- StripPrefix=2 # 转发之前去掉1层路径
				  	http://localhost:10011/api/user/login
				  	http://localhost:8083/login

过滤器

@Component 
@EnableConfigurationProperties({FilterProperties.class, JwtProperties.class}) 
public class LoginFilter implements GlobalFilter, Ordered { 
	@Resource 
	private FilterProperties filterProperties; 
	@Resource 
	private JwtProperties jwtProperties; 
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		ServerHttpRequest request = exchange.getRequest();  											           
		ServerHttpResponse response = exchange.getResponse(); 
		String path = request.getURI().getPath(); 
		if (isAllowPath(path)) { 
			//放行 
			return chain.filter(exchange); 
		}
		String token = request.getHeaders().getFirst("token"); 
		if (StringUtils.isEmpty(token)) { 		
			response.setStatusCode(HttpStatus.UNAUTHORIZED); 
			return authError(response, ExceptionEnum.TOKEN_IS_EMPTY); 
		}
		try {
			JwtUtils.getUserInfo(jwtProperties.getPublicKey(), token); 
		} catch (Exception e) { 
			return authError(response, ExceptionEnum.TOKEN_IS_ERROR); 
		}
		return chain.filter(exchange); 
		}
		@Override public int getOrder() { 
			return 0; 
		}
	public boolean isAllowPath(String path) {
		System.out.println(path); 
		if (filterProperties.getAllowPaths().contains(path)) { 
			return true; 
		}
			return false; 
		}
	private Mono<Void> authError(ServerHttpResponse response, ExceptionEnum exceptionEnum) { 
		Response<Object> fail = ResponseApi.setFail(exceptionEnum.message(), exceptionEnum.value()); 
		DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONBytes(fail)); 
		return response.writeWith(Flux.just(dataBuffer)); 
	} 
}
### 网关 Gateway 技术介绍 网关(Gateway),特别是指 API 网关,在分布式服务架构、微服务架构中扮演着至关重要的角色[^1]。作为系统的入口,API 网关负责接收所有的客户端请求并将其转发给适当的服务实例。这不仅简化了前端应用与后端多个微服务之间的交互过程,还允许开发者集中处理跨域资源共享(CORS)、身份验证(Authentication)等问题。 对于采用 Spring Cloud 的项目而言,Spring Cloud Gateway 成为了构建 API 网关的理想选择之一。该框架旨在提供一种简单且高效的方式来配置路由规则以及实现诸如安全性、监控/度量等功能,这一切都是通过强大的过滤器机制来完成的[^2]。 具体来说,当一个 HTTP 请求到达 Spring Cloud Gateway 后,它会依次经过三种类型的过滤器:特定于当前路由定义的过滤器、全局默认过滤器(`DefaultFilter`)和全局过滤器(`GlobalFilter`)[^4]。这些过滤器可以在请求被发送到目标服务之前或响应返回给客户端之后执行各种操作,比如修改请求头信息、记录日志等。 随着技术的发展趋势,越来越多的企业倾向于使用更现代化的技术栈来进行开发工作;因此,在许多情况下,相较于 Zuul 而言,Spring Cloud Gateway 显示出了更高的性能表现和发展潜力,逐渐成为事实上的标准解决方案[^3]。 ### 使用场景 - **统一接入层**:为所有外部调用者提供单一接口,隐藏内部复杂性的同时提高灵活性。 - **流量管理**:支持动态调整不同版本间的流量分配策略,便于灰度发布和服务治理。 - **协议转换**:能够将来自不同源的数据格式标准化后再传递给下游服务消费。 - **认证授权**:集成 OAuth2.0 或 JWT 等第三方鉴权组件,保护资源免受未授权访问威胁。 - **熔断降级**:设置合理的超时时间和重试次数,防止因单点故障引发连锁反应影响整体稳定性。 ```java // 示例代码展示如何创建简单的 Spring Cloud Gateway 应用程序 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值