一、作用
- 权限:访问具体服务,需要登录或者凭证,否则拦截请求
- 限流:根据目标服务能够处理的单位请求数,限制请求数量
- 请求路由:根据某种规则,路由到具体的服务
二、创建网关
- 创建微服务gateway
继承父工程
- 导入依赖
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置文件
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: userservice #路由id,是一个唯一标识
uri: lb://userservice #lb:负载均衡 userservice是服务名
predicates: #断言工厂,下面的规则如果成立,就会进行路由
- Path=/user/** # 以/user开头的请求都路由到userservice微服务中
- id: orderservice
uri: lb://orderservice
predicates:
- Path=/order/**
#基于网关访问用户服务
#http://localhost:10010/user/1
- 启动网关
通过网关访问目标服务
http://localhost:10010/user/1
三、局部过滤器
- 种类
- 局部过滤器、默认过滤器
需求:给通过网关进入 userservice 的请求增加请求头
- 在user-service新增接口用来获取请求头
四、全局过滤器
@Component
@Order(-101)
public class MyAuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("--------------->进去过滤器");
ServerHttpRequest request = exchange.getRequest();
String token = request.getQueryParams().getFirst("token");
if ("admin".equals(token)){
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
}
五、过滤器执行顺序
1、先根据order值判断,值越小优先级越高
路由过滤器和默认过滤器的order由Spring指定,默认是按照声明顺序从1递增。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
注解方式、接口方式
上述方案二选一
2、order值一样
默认过滤器 > 路由过滤器 > GlobalFilter
六、跨域问题
springcloud解决跨域问题
spring:
cloud:
gateway:
# 一定要复制
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求,如果是80端口,不要写端口号
- "http://localhost:8090"
- "http://127.0.0.1:8090"
- "http://localhost"
- "http://127.0.0.1"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
springmvc 解决跨域问题