目录
一、网关技术的实现
在SpringCloud中网关的实现包括两种:
作用:
二、搭建网关服务
1、新建模块,并添加依赖
2、新建Gateway包,并编写启动类
3、编写yml文件
4、启动服务,并在网页内测试
5、步骤
三、路由断言工厂
1、网关路由可以配置的内容包括:
四、路由过滤器
配置路由过滤器:
1、修改yml文件
2、重启gateway服务,并在userController中添加请求头参数
3、重启user服务,并且在浏览器中进行测试
配置所有路由的过滤器:
1、在yml文件中添加默认路由过滤器
2、重启网关,并测试
五、全局过滤器
1、新增拦截器类
2、重启服务,并发送请求
3、添加过滤参数并发送请求
六、过滤器执行顺序
七、跨域问题的解决
一、网关技术的实现
在SpringCloud中网关的实现包括两种:
- gateway
- zuul
Zuul是基于Servlet的实现,属于阻塞式编程。
而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。
作用:
- 对用户请求做身份认证、权限校验
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流
二、搭建网关服务
1、新建模块,并添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、新建Gateway包,并编写启动类
3、编写yml文件
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes:
- id: user-service #路由标识(唯一)
uri: lb://userservice #目标路由的地址
predicates: #路由断言
- Path=/user/** #判断路径
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
4、启动服务,并在网页内测试
5、步骤
三、路由断言工厂
1、网关路由可以配置的内容包括:
- 路由id:路由唯一标示
- uri:路由目的地,支持lb和http两种
- predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
- filters:路由过滤器,处理请求或响应
具体使用方法可以在spring官网查看
当路由规则不符合时,会出现404的错误!
四、路由过滤器
路由过滤器工厂同样有30多个,这里是具体实现方法。
配置路由过滤器:
1、修改yml文件
filters:
- AddRequestHeader=Truth,Itcast is freaking aowsome!
2、重启gateway服务,并在userController中添加请求头参数
3、重启user服务,并且在浏览器中进行测试
说明请求头添加成功了
这只是配置单个路由的过滤器,若要添加所有路由过滤器,进行以下步骤
配置所有路由的过滤器:
1、在yml文件中添加默认路由过滤器
2、重启网关,并测试
发现请求头添加成功,也就是过滤器添加成功
五、全局过滤器
1、新增拦截器类
@Order(-1) //参数是指过滤器的优先级,值越低,优先级越高
@Component
public class AuthorizeFileter 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 authorization = params.getFirst("authorization");
// 3.判断参数值是否等于admin
if ("admin".equals(authorization)){
// 4.是则放行
return chain.filter(exchange);
}
else {
// 5.否则拦截
// 5.1设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 5.2拦截请求
return exchange.getResponse().setComplete();
}
}
}
2、重启服务,并发送请求
3、添加过滤参数并发送请求
六、过滤器执行顺序
- order值越小,优先级越高
- 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器
七、跨域问题的解决
在gateway的yml文件中加上,网站记得改
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期