Spring Cloud Alibaba-Spring Cloud Gateway-使用路由网关的全局过滤功能
2023-09-14 09:14:12 时间
概述
全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制等等。
注意:截止博客发表时间 2019 年 01 月 10 日,Spring Cloud Gateway 正式版为 2.0.2 其文档并不完善,并且有些地方还要重新设计,这里仅提供一个基本的案例
声明周期
Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用响应式编程风格,打开它的 Filter 的接口 GlobalFilter 你会发现它只有一个方法 filter。
创建全局过滤器
实现 GlobalFilter
, Ordered
接口并在类上增加 @Component
注解就可以使用过滤功能了,非常简单方便
package cn.dandelioncloud.hello.spring.cloud.gateway.filters;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Map;
/**
* 鉴权过滤器
*/
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
ServerHttpResponse response = exchange.getResponse();
// 封装错误信息
Map<String, Object> responseData = Maps.newHashMap();
responseData.put("code", 401);
responseData.put("message", "非法请求");
responseData.put("cause", "Token is empty");
try {
// 将信息转换为 JSON
ObjectMapper objectMapper = new ObjectMapper();
byte[] data = objectMapper.writeValueAsBytes(responseData);
// 输出错误信息到页面
DataBuffer buffer = response.bufferFactory().wrap(data);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return chain.filter(exchange);
}
/**
* 设置过滤器的执行顺序
* @return
*/
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
测试过滤器
浏览器访问:http://localhost:9000/nacos-consumer/echo/app/name
网页显示
浏览器访问:http://localhost:9000/nacos-consumer/echo/app/name?token=123456
网页显示
Hello Nacos Discovery nacos-consumer i am from port 8082
附:Spring Cloud Gateway Benchmark
Spring 官方人员提供的网关基准测试报告 GitHub
Proxy | Avg Latency | Avg Req/Sec/Thread |
---|---|---|
gateway | 6.61ms | 3.24k |
linkered | 7.62ms | 2.82k |
zuul | 12.56ms | 2.09k |
none | 2.09ms | 11.77k |
说明
- 这里的 Zuul 为 1.x 版本,是一个基于阻塞 IO 的 API Gateway
- Zuul 已经发布了 Zuul 2.x,基于 Netty,非阻塞的,支持长连接,但 Spring Cloud 暂时还没有整合计划
- Linkerd 基于 Scala 实现的、目前市面上仅有的生产级别的 Service Mesh(其他诸如 Istio、Conduit 暂时还不能用于生产)。
相关文章
- spring boot tomcat 打本地包成war,通过Tomcat启动时出现问题: ZipException: error in opening zip file
- spring mvc之启动过程源码分析
- Spring Cloud之配置中心搭建
- Spring Cloud 学习网址
- spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)
- spring-cloud: eureka之:ribbon负载均衡配置(一)
- 20-spring学习-Spring MVC基本操作
- [Java spring] Building a command-line application
- 跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用
- spring cloud 路由Zuul的高可用
- SPRING Thread开发实战
- 我们为什么要使用Spring Cloud?
- 在ABAP里模拟实现Java Spring的依赖注入
- Atitit 常用微服务实现 目录 1. 健康检测 max_fails与fail_timeout参 数1 1.1. spring cloud dubbo实现2 1.2. 、nginx多个tomc
- spring-session源码解读-4
- 探究Spring Cloud Elasticsearch:最佳性能调优技巧
- 基于CSE的微服务架构实践-Spring Cloud技术栈选型
- spring cloud Zuul 多层拦截 --- 心得
- 新手向,十分钟快速创建 Spring Cloud 项目
- 010-spring cloud gateway-过滤器-自定义局部、全局过滤器、区别
- 006-spring cloud gateway-GatewayAutoConfiguration核心配置-GatewayProperties初始化加载、Route初始化加载
- 001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点
- Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
- Spring整合Bean Validation
- spring cloud :四、路由网关(zuul)
- 服务降级是什么?Spring Cloud如何实现?
- Spring Cloud Ribbon结合RestTemplate实现负载均衡
- 慕课10、API网关-Spring Cloud Gateway
- Spring Cloud Tencent 1.7 版本发布