网关:身份认证和权限校验、服务路由,负载均衡、请求限流
-
gateway响应式编程
-
zuul阻塞式编程
一、搭建网关:引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
二、在application.yml中写入
-
路由id:路由唯一标识
-
uri:路由目的地,支持lb和http两种
-
predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
-
filters:路由过滤器,处理请求或响应
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates: #路由断言,判断请求是否符合规则
- Path=/user/** #路径断言,判断路径是否是以/user开头,如果是则符合
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
- After=2017-01-20T17:42:47.789-07:00[America/Denver] # 时间点后匹配
- Before=2017-01-20T17:42:47.789-07:00[America/Denver] # 时间点前匹配
- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] # 时间区间匹配
- Cookie=chocolate, ch.p # 指定cookie正则匹配
- Header=X-Request-Id, \d+ # 指定Header正则匹配
- Host=**.somehost.org,**.anotherhost.org # 请求Host匹配
- Method=GET,POST # 请求Method匹配指定请求方式
- Path=/red/{segment},/blue/{segment} # 请求路径正则匹配
- Query=green # 请求包含某参数
- Query=red, gree. # 请求包含某参数并且参数值匹配正则表达式(匹配red;green,greet,gree...)
- RemoteAddr=192.168.1.1/24 # 远程地址匹配
全局过滤器GatewayFilter
实现GlobalFilter接口,网页连接加上?authorization=admin
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @ClassName AuthorizeFilter
* @Description TODO
* @date 2024/8/30 11:36
* @Version 1.0
*/
@Component
// @Order(-1) 等同于实现Orderd接口,值越小,优先级越高,执行顺序越前。
public class AuthorizeFilter implements GlobalFilter, Ordered {
// 设置过滤器的等级
@Override
public int getOrder() {
return -1;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
// 2.获取参数中的authorization参数
String authorization = queryParams.getFirst("authorization");
// 3.判断参数是否等于admin
if ("admin".equals(authorization)){
return chain.filter(exchange);
}
//设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
三类过滤器:当前路由过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter合并到一个过滤器链中,排序后依次执行每个过滤器
当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行
跨域问题处理
CORS:
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-hand ler-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 # 这次跨域检测的有效期