一、gateway网关的作用
1.身份认证,权限校验
2.路由转发,负载均衡
3.对用户请求做限流
二、创建gateway项目并且实现网关路由转发功能
1.新建model
2.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.编写yml配置文件
端口、注册naocs、gateway配置
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8845
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
4.图解
三、路由断言工厂(PredicateFactory)
1.路由断言工厂的作用
解析yml中写的Predicate字符串,转化为判断条件
2.11种路由断言工厂
a.11种断言的使用方法:
请转到这里查看=======>11种路由断言工厂-CSDN博客
3.思考题
四、路由的过滤器配置
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
1.过滤器种类
官方提供了三十多种过滤器,我们可以在需要时查看,部分过滤器如下:
2.流量染色
通过过滤器可以实现多种功能,例如流量染色,判断请求是否来源于gateway,如果不是gateway转发,将抛出异常。
实现:
application.yml:
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8845
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- AddRequestHeader=passGateway, true
UserController.java
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
@RequestHeader(value = "PassGateway", required = false) boolean passGateway) {
if (!passGateway) {
throw new RuntimeException("passGateway is false");
}
System.out.println(passGateway);
return userService.queryById(id);
}
}
如果不经过gateway则抛出异常:
java.lang.RuntimeException: passGateway is false
at cn.itcast.user.web.UserController.queryById(UserController.java:45) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~
3.default-filters
给所有的路由请求请求加上过滤器:
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8845
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
# filters:
# - AddRequestHeader=passGateway, true
default-filters:
- AddRequestHeader=passGateway, true
五、全局过滤器(GlobalFilter)
1.实现全局过滤器
通过实现GlobalFilter接口,并且实现其中的filter方法即可定义全局过滤器
filter方法参数讲解:
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
2.ServerWebExchange
接口包含以下重要方法:
- getRequest():获取当前的HTTP请求对象。
- getResponse():获取当前的HTTP响应对象。
- getAttributes():获取与当前请求关联的属性map,可以用于在请求处理过程中共享数据。
- getFormData():获取表单数据,返回一个Mono<MultiValueMap<String, String>>对象,可以使用flatMap操作符来处理表单数据。
- mutate():创建一个新的ServerWebExchange实例,可以对请求和响应进行修改。
- getSession():获取当前的会话对象,返回一个Mono<WebSession>对象,可以用于管理用户会话状态。
3.GatewayFilterChain
GatewayFilterChain是 Spring Cloud Gateway 中的一个接口,用于定义一系列的过滤器链。在请求进入网关后,会经过一系列的过滤器对请求进行处理和转换,然后再转发到后端服务。
GatewayFilterChain接口定义了一个 filter方法,调用该filter方法表示放行。
chain.filter(exchange);
六、过滤器链执行顺序
1.三种过滤器的处理
gateway中有三种过滤器:Default过滤器、路由过滤器、全局过滤器
Default过滤器和路由过滤器回通过AddRequestHeaderGatrewayFilterFactory这个工厂类转化为GatewayFilter类型的拦截器
【注】AddRequestHeaderGatrewayFilterFactory不是所有的Default过滤器和路由过滤器都是这个工厂类处理,而是对应filter配置文件中写的过滤器对应的工厂类。
全局过滤器会通过GatewayFilterAdapter类转换成GatewayFilter类型的类
2.执行顺序
七、网关的cors跨域配置
跨域问题:浏览器禁止请求的发起者与服务端发生跨域的Ajax请求
解决方案:
globalcors:
add-to-simple-url-handler-mapping: true
corsConfigurations:
'[/**]':
allowedOrigins: # 允许跨域访问的地址
- "http://localhost:8080"
- "www.baidu.com"
allowedMethods: # 允许跨域访问的请求方式
- "GET"
- "POST"
- "PUT"
- "DELETE"
allowedHeaders: # 允许请求头中携带的字段
- "*"
allowCredentials: true #是否允许携带cookies
exposedHeaders: # 允许跨域访问的响应头
- "*"
maxAge: 3600
踩坑日志:网关配置跨域之后,如果每个服务重新配置跨域,例如使用@CrossOrign注解,会导致出错