网关的作用
GateWay-网关是我们服务的守门神,所有微服务的统一入口。
Spring Cloud GateWay官方文档
GateWay入门使用
使用步骤
1. 创建GateWay项目
2. 引入依赖Nacos和GateWay依赖
引入Nacos依赖的目的是为了将GateWay项目注册到Nacos中,以及可以实现负载均衡
3. 配置application.yml,包括服务名称,Nacos地址,GateWay路由等
server: port: 10010 spring: application: name: gateway cloud: nacos: server-addr: localhost:8848 # Nacos服务地址 gateway: routes: # 网关路由配置 - id: user-service #路由id,自定义,唯一即可 #uri: http://localhost:8082 # 路由目标地址 http就是固定地址 uri: lb://userservice # 路由目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 断言:判断进入当前路由规则 - Path=/user/** # 这个是按照路径匹配,只要以/user/开头的就符合要求 - id: order-service uri: lb://orderservice predicates: - Path=/order/** - Before=2031-01-20T17:42:47.789-07:00[America/Denver] # 时间断言,符合时间规则才可以访问Before之前,After之后
4. 运行GateWay项目,启动GateWay网关服务
开启网关之后客户端与服务端访问流程如下:
路由断言工厂
最常用的断言规则就是Path规则,表示“请求路径必须符合指定规则”。还有很多其他断言规则,
如下图:
路由过滤器
GateWayFilter:网关过滤器
GateWayFilter的作用
1. 给请求和响应加工处理,比如添加请求头
2. 可以为单个路由添加Filter,也可以为所有的路由都添加DefaultFilter
使用步骤
1. 配置application.yml
server: port: 10010 spring: application: name: gateway cloud: nacos: server-addr: localhost:8848 # Nacos服务地址 gateway: routes: # 网关路由配置 - id: user-service #路由id,自定义,唯一即可 #uri: http://localhost:8082 # 路由目标地址 http就是固定地址 uri: lb://userservice # 路由目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 断言:判断进入当前路由规则 - Path=/user/** # 这个是按照路径匹配,只要以/user/开头的就符合要求 # filters: # 网关过滤器,只过滤当前路由网关 # - AddRequestHeader=say,I`m freaking awesome! - id: order-service uri: lb://orderservice predicates: - Path=/order/** - Before=2031-01-20T17:42:47.789-07:00[America/Denver] # 时间断言,符合时间规则才可以访问Before之前,After之后 default-filters: # 网关过滤器,过滤所有路由网关 - AddRequestHeader=say,I`m freaking awesome!
GlobalFilter 全局过滤器
GlobalFiler-全局过滤器
/*
* 模拟拦截判断用户身份,查看authorization的值是否为admin,满足放行,否则拦截
*/
//@Order(-1) 过滤器优先级
@Component
public class AuthorizationFilter implements GlobalFilter, Ordered {
/**
* 处理当前请求,有必要的话通过{@link GatewayFilterChain} 将请求交给下一个过滤器处理
* @param exchange 请求上下文,里面可以获取Request Response等信息
* @param chain (过滤器链)用来把请求委托给下一个过滤器
* @return {@code Mono<Void>} 返回标识当前过滤器业务结束
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.通过exchange获取Request
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.从Request对象中获取authorization
String auth = params.getFirst("authorization");
// 3.判断authorization是否等于admin
if("admin".equals(auth)){
// 4.是,放行
return chain.filter(exchange);
}
// 5.否,拦截
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2 响应状态码
return exchange.getResponse().setComplete();// 响应结束
}
@Override
public int getOrder() {// 过滤器优先级,数字越小 优先级越高
return -1;
}
}
过滤器执行顺序
跨域问题处理
跨域:域名不一致就是跨域,主要包括:
- 域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
- 域名相同,端口不同:localhost:8080 和 localhost:8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案:CORS
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现。
server: port: 10010 spring: application: name: gateway cloud: nacos: server-addr: localhost:8848 # Nacos服务地址 gateway: globalcors: # 全局跨域配置 add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题 corsConfigurations: '[/**]': allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090" - "www.xxx.com" #允许跨域的域名 allowedMethods: # 允许的跨域ajax请求方式 - GET - POST - DELETE - PUT - OPTIONS - HEAD allowedHeaders: # 允许在请求中携带的头信息 - "*" allowCredentials: true # 是否允许携带Cookie maxAge: 360000 # 这次跨域检测的有效期 这个时间段内,一直可以跨域访问