Gateway,是系统的唯一对外的⼊入⼝口,介于客户端和服务器端之间的中间层,处理理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能
SpringCloud Gateway
基于Reactor+WebFlux
网关的使用:
网关是一个项目,需要新建一个模块module
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、连接到nacos负载均衡上拉取目标服务的信息
可以解决负载均衡问题和微服务地址写死的问题。
在网关中添加完nacos依赖后,启动类开启client
@EnableDiscoveryClient
3、配置文件
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
nacod:
discovery:
service-addr: ip:port
gateway:
routes: #数组形式
- id: order-service #路由唯⼀标识,一般写服务名称
uri: lb://xdclass-order-service #从nacos进行转发,lb是负载均衡的意思
order: 1 #优先级,数字越小优先级越高
predicates: #断言 配置哪个路径才转发
- Path=/order-server/**
filters: #过滤器,请求在传递过程中通过滤器修改
- StripPrefix=1 #去掉第一层前缀
discovery:
locator:
enabled: true # 开启网关拉取nacos的服务
网关的交互过程
交互过程:
客户端向Spring Cloud Gateway发出请求
如果网关处理程序映射确定请求与路由匹配
则将其发送到网关Web处理理程序
通过特定过滤器链运行,前置处理-后置处理
Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了了各种路由匹配规则
断言的种类:Path、Query、Method、Header ------配置中predicates设置断言
利用网关中的内置断言实现接口的定时下线
在配置中设置before的值,
配置完成后,超过这个时间就不能访问这个接口了
springcloud的过滤器
局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory 结尾
全局过滤器:作用全部路由上.
利用网关实现全局过滤器实现用户的鉴权
网关的第一职责是转发,不要加太多业务逻辑,否则会影响性能。
业务逻辑可以放在对应的微服务中
@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 业务逻辑
String token = exchange.getRequest().getHeaders().getFirst("token");
//TODO 根据业务开发对应的鉴权规则
if(StringUtils.isEmpty(token)){ // token为空的时候
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 不为空的时候,继续往下执行
return chain.filter(exchange);
}
// 过滤器的优先级,数字越小,优先级越高
@Override
public int getOrder() {
return 0;
}
}