SpringcloudAlibaba-GateWay
简介
Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和Project Reactor,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。
SpringCloud GateWay使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
特点:
- 性能强劲:是Zuul的1.6倍
- 功能强大:内置了很多实用的功能,例如转发、监控、限流等
- 设计优雅,容易扩展
官网: https://spring.io/projects/spring-cloud-gateway.
GateWay核心的流程就是:路由转发+执行过滤器链.
代码
- 父项目添加依赖
<spring.cloud-version>Hoxton.SR5</spring.cloud-version>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- GateWay添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- GateWay的YML配置
server:
port: 9012
spring:
application:
name: nacos-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #Nacos服务注册中心地址
gateway:
discovery:
locator:
enabled: true #开启注册中心路由功能
routes:
- id: nacos-config
uri: lb://nacos-config
predicates:
- Path=/getGateWay/**
- After=2022-01-07T14:39:10.529+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通
- GateWay添加过滤器
package com.yxkj.nacosspringcloudgatewayexample.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @program:FoundationStudy
* @Author: zhuyang
* @Date: 2022/02/13/18:39
* @Description:
*/
@Component
@Slf4j
public class MyFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String username = exchange.getRequest().getQueryParams().getFirst("username");
log.info("*************MyFilter:"+new Date());
if("zs".equals(username)){
log.info("**********用户名为zs,非法用户,请求被拒绝!");
//如果username为空,返回状态码为406,不可接受的请求
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
//进入下一个过滤器
return chain.filter(exchange);
}
/**
* @Description: 加载过滤器的顺序
* @Author: zhuyang
* @Date: 2022-02-13
* @Param: 整数数字越小优先级越高
* @return:
**/
@Override
public int getOrder() {
return 0;
}
}
- 子项目分别添加请求接口
@GetMapping("/getGateWay")
public String getGateWay(String username){
return "GateWay进行访问,传入username:"+username;
}
进行测试
http://127.0.0.1:9012/getGateWay?username=zss
:正常请求
http://127.0.0.1:9012/getGateWay?username=zs
:错误请求,被过滤器进行过滤
Gitee地址
XFS