目录
网关能干什么
网关的技术实现
搭建网关服务
网关作用流程图
路由断言工厂(Route Predicate Factory)
gateway中有三种过滤器:
1. 默认过滤器(DefaultFiter)
2. 路由过滤器(GatewayFilter)
3. 全局过滤器(GlobalFilter)
当有多个全局过滤器时,如何决定过滤器的执行顺序呢?
三种过滤器执行的顺序
网关解决跨域问题
网关能干什么
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
网关的技术实现
在SpringCloud中网关的实现包括两种:
- gateway
- zuul
Zuul是基于Servlet的实现,属于阻塞式编程。
SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,性能更好。
搭建网关服务
1. gateway pom文件
<!-- gateway 网关 pom--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
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/ 开头就符合要求
网关作用流程图
路由断言工厂(Route Predicate Factory)
我们在yml配置文件中写的断言规则只是字符串 ,这些字符串会被Predicate Factory读取并处理,转变为路由判断的PathRoutePredicateFactory类
例如Path=/user/**是按照路径匹配, 这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的
像这样的断言工厂在SpringCloudGateway还有十几个,
例如:
gateway中有三种过滤器:
- 默认过滤器
- 路由过滤器
- 全局过滤器
1. 默认过滤器(DefaultFiter)
对全部路由进行拦截
默认过滤器配置
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 #默认过滤器的配置
2. 路由过滤器(GatewayFilter)
只对指定路由进行拦截
路由过滤器配置
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 #路由过滤器的配置
- filters:是配置路由过滤器的过滤器
- AddRequestHeader:是 Spring提供写好的的路由过滤器工厂
3. 全局过滤器(GlobalFilter)
自定义逻辑的全部路由进行拦截
全局过滤器实现
1. 实现 GlobalFilter 接口
/*** @param exchange:请求上下文,可以获得 Request,Response 等信息* chain: 请求传递给下一个过滤器* @return $返回表示当前过滤器业务结束*/
@Order()
@Component
public class fiter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获得请求参数MultiValueMap<String, String> 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 接口,重写返回值
@Overridepublic int getOrder() {return 0;}
三种过滤器执行的顺序
全局路由器通过适配器模式将默认过滤器和路由过滤器统一为GatewayFilter
- 每一个过滤器都必须指定一个int类型的order值, order值越小,执行优先级越高。
- GlobalFilter通过实现Ordered接口, 或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定, 默认是按照声明顺序从1递增。
- 当过滤器的order值一样时,会按照defaultFilter >路由过滤器> GlobalFilter的顺序执行。
网关解决跨域问题
跨域问题:浏览器(前端)禁止请求的发起者与服务器(后端)发送跨域ajax请求,不接收服务器的响应,请求被拦截器拦截的问题
什么是ajax请求:简单来说就是,局部更新前端页面
spring:cloud:gateway:# 开启网关的跨域功能,具体微服务上的跨域需要进行关闭,否则无效globalcors:add-to-simple-url-handler-mapping: true #解决options 请求被拦截问题corsConfigurations:'[/**]': # 匹配所有请求allowedOrigins: "*" # 跨域处理 允许所有的域(前端的值)allowedMethods: # 支持的方法- GET- POST- PUT- DELETEallowedHeaders: "*" #允许在请求中携带的头信息allowCredentials: true #是否允许携带cookiemaxAge: 360000 #这次跨域检测的有效期
配置Copy