1 Gateway介绍
gateway是网关的英文名称,又叫做网间连接器、协议转换器。网关是在采用不同体系结构或协议的网络之间进行互通时,用于提供协议转换、路由选择、数据交换等网络兼容功能的设施。出于安全考虑,一切请求都应该需要先经过网关,再进入服务器。
网关的作用:
1.对用户请求做身份认证、权限校验
2.将用户请求路由到微服务,并实现负载均衡
3.对用户请求做限流
2 搭建网关服务
1. 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.新建application.yml文件并且编写路由配置及nacos地址:
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: nacos:8858 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
3 路由断言工厂Route Predicate Factory
1 网关路由可以配置的内容包括:
● 路由id: 路由唯- -标示
● uri: 路由目的地,支持Ib和http两种
● predicates: 路由断台,判断请求是否符合要求,符合则转发到路由A的地
● filters: 路由过滤器,处理请求或响应
2 补充说明
● 我们在配置文件中写的断 言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的
条件
● 例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类米处理的
● 像这样的断 工厂在SpringCloudGateway还有十几个
Spring提供了11种基本的Predicate工厂:
小结
● PredicateFactory 的作用是什么?
读取用户定义的断言条件,对请求做出判断
● Path=/user/**是什么含义?
路径是以/user开头的就认为是符合的
4 路由过滤器GatewayFilter
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理,图解如下所示:
5 过滤器工厂GatewayFilterFactory
Spring提供了31种不同的路由过滤器工厂,可以在官方文档中查看。例如:
● 过滤器的作用是什么?
①对路由的请求或响应做加工处理,比如添加请求头
②配置在路由下的过滤器只对当前路由的请求生效
● defaultFilters的作用是什么?
①对所有路由都生效的过滤器
全局过滤器 GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自已写代码实现。
定义方式是实现GlobalFilter接口。
● 全局过滤器的作用是什么?
对所有路由都生效的过滤器,并且可以白定义处理逻辑
● 实现全局过滤器的步骤?
①实现GlobalFilter接口
②添加@Order注解或实现Ordered接口
③编写处理逻辑
过滤器执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter 、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
●每一个过滤 器都必须指定- -个int类型的order值,order 值越小,优先级越高,执行顺序越靠前。
●GlobalFilter 通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自已指定
●路由过滤 器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时, 会按照defaultFilter >路由过滤器> GlobalFilter 的顺序执行。
5 跨域问题处理
跨域:域名不一致就是跨域,主要包括:
● 域名不同: www.taobao.com 和www.taobao.org 和www.jd.com 和miaosha.jd.com
● 域名相同, 端口不同: localhost:8080 和localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案: CORS
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现,如下图所示: