目录
网关能干什么
网关的技术实现
搭建网关服务
网关作用流程图
路由断言工厂(Route Predicate Factory)
gateway中有三种过滤器:
1. 默认过滤器(DefaultFiter)
2. 路由过滤器(GatewayFilter)
3. 全局过滤器(GlobalFilter)
当有多个全局过滤器时,如何决定过滤器的执行顺序呢?
三种过滤器执行的顺序
网关解决跨域问题
在SpringCloud中网关的实现包括两种:
Zuul是基于Servlet的实现,属于阻塞式编程。
SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,性能更好。
1. gateway pom文件
org.springframework.cloud
spring-cloud-starter-gateway
2. 配置yml
server :
port: 10010 #gate网关端口(统一访问端口)
spring :
application:
name: gateway #网关服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: #网关路由配置
- id: cloud-client #路由id,自定义,只要唯- -即可
uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/hello/** #这个是按照路径匹配,只要以/user/ 开头就符合要求
我们在yml配置文件中写的断言规则只是字符串 ,这些字符串会被Predicate Factory读取并处理,转变为路由判断的PathRoutePredicateFactory类
例如Path=/user/**是按照路径匹配, 这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的
像这样的断言工厂在SpringCloudGateway还有十几个,
例如:
对全部路由进行拦截
默认过滤器配置
server :
port: 10010 #gate网关端口(统一访问端口)
spring :
application:
name: gateway #网关服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: #网关路由配置
- id: cloud-client #路由id,自定义,只要唯- -即可
uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/hello/** #这个是按照路径匹配,只要以/user/ 开头就符合要求
default-filters:
- AddRequestHeader = Truth,this is demo #默认过滤器的配置
只对指定路由进行拦截
路由过滤器配置
server :
port: 10010 #gate网关端口(统一访问端口)
spring :
application:
name: gateway #网关服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: #网关路由配置
- id: cloud-client #路由id,自定义,只要唯- -即可
uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/hello/** #这个是按照路径匹配,只要以/user/ 开头就符合要求
filters:
- AddRequestHeader = Truth,this is demo #路由过滤器的配置
自定义逻辑的全部路由进行拦截
全局过滤器实现
1. 实现 GlobalFilter 接口
/**
* @param exchange:请求上下文,可以获得 Request,Response 等信息
* chain: 请求传递给下一个过滤器
* @return $返回表示当前过滤器业务结束
*/
@Order()
@Component
public class fiter implements GlobalFilter {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获得请求参数
MultiValueMap params = exchange.getRequest().getQueryParams();
//获取参数中的authorization参数
String auth = params.getFirst("authorization");
//进行判断
if("admin".equals(auth)){
//正确,放行
return chain.filter(exchange);
}
//错误,结束,返回错误码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
方法一:@Order()注解:当有多个全局过滤器时,决定过滤器的执行顺序,数字越小越先执行
方法二:实现 Ordered 接口,重写返回值
@Override
public int getOrder() {
return 0;
}
全局路由器通过适配器模式将默认过滤器和路由过滤器统一为GatewayFilter
跨域问题:浏览器(前端)禁止请求的发起者与服务器(后端)发送跨域ajax请求,不接收服务器的响应,请求被拦截器拦截的问题
什么是ajax请求:简单来说就是,局部更新前端页面
spring:
cloud:
gateway:
# 开启网关的跨域功能,具体微服务上的跨域需要进行关闭,否则无效
globalcors:
add-to-simple-url-handler-mapping: true #解决options 请求被拦截问题
corsConfigurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" # 跨域处理 允许所有的域(前端的值)
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
allowedHeaders: "*" #允许在请求中携带的头信息
allowCredentials: true #是否允许携带cookie
maxAge: 360000 #这次跨域检测的有效期
配置Copy