统一网关Gateway的使用:
为什么需要网关?
Gateway网关是我们服务的守门神,所有微服务的统一入口
网关的核心功能特性:
- 网关的功能:身份认证和权限校验
- 服务路由,负载均衡
- 请求限流
在SpringCloud中网关的实现包括两种:
- geteway
- zuul
搭建网关服务
-
创建新的module(模块),引入SpringCloudGateway的依赖和nacos的服务发现依赖:
-
编写启动类 :
package cn.itcast.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
-
编写路由配置及nacos地址
搭建网关服务:
总结:
网关搭建步骤:
-
创建项目,引入nacos服务发现和gateway依赖
-
配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:
-
路由id:路由的唯一标示
-
路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
-
路由断言(predicates):判断路由的规则,
-
路由过滤器(filters):对请求或响应做处理
路由断言工厂:
路由过滤器 GatewayFilter:
还有一个配置 filters :路由过滤器:对请求或响应做处理
会先经过过滤器 Spring提供了31种不同的过滤器工厂
默认过滤器 default-filters 会对所有的路由请求都生效
全局过滤器 GlobaFilter:
exchange 请求上下文 从请求进入开始一直到结束为止 可以拿到请求相关的信息,响应相关的信息 甚至 存东西和取东西也是可以的
chain 过滤器链 放行用的 交给下一个过滤器
自定义一个全局过滤器:
-
参数中是否有token,
-
token参数值是否为admin
如果同时满足则放行,否则拦截
@Component
@Order(1)
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
// 2.获取参数中的authorization参数
String auth = params.getFirst("token");
// 3.判断参数值是否等于admin
if ("admin".equals(auth)) {
// 4.是 放行
return chain.filter(exchange);
}
// 5.否 拦截
// 设置状态码
exchange.getResponse().setStatusCode(
HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
-
全局过滤器的作用是什么:
对所有路由都生效的过滤器,并且可以自定义处理逻辑
-
实现全局过滤器的步骤:
- 实现GlobalFilter接口
- 添加@order注解或者实现Ordered接口 数值越小 优先级越高
- 编写处理逻辑
过滤器执行顺序:
- 当过滤器的order值一样,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
跨域问题处理:
域的组成:协议,ip,端口
- 同域:协议,ip,端口 都相同
- 跨域:协议,ip,端口 有一个不同
网管跨域处理的方法 CORS方案 并且只需要简单的配置就能实现