Gateway的简介
Gateway是SpringCloud中的API网关,提供鉴权和路由的功能
Gateway的工作机制
-
客户端发送请求给Gateway网关,网关将请求发送给处理器映射(HandlerMapping)
-
网关通过路由的匹配,将请求发送给Web处理器处理,请求就需要经过一系列过滤器
-
过滤器分为“pre"前置和”post"后置两种,前置过滤器实现鉴权作用,后置过滤实现性能统计或日志收集
-
通过过滤器就到达需要的服务
Gateway的路由
GateWay路由规则
时间点后匹配
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
时间点前匹配
spring:
cloud:
gateway:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
时间区间匹配
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
指定Cookie正则匹配指定值
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=chocolate, ch.p
指定Header正则匹配指定值
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
请求Host匹配指定值
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.org
请求Method匹配指定请求方式
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
请求路径正则匹配
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
请求包含某参数
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=green
请求包含某参数并且参数值匹配正则表达式
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=red, gree.
远程地址匹配
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24
使用注册中心时,uri以 lb: //开头(lb代表从注册中心获取服务),后面是需要转发到的服务名称
使用方法:
1)创建网关项目, 引入eureka-client和gateway依赖
2)编写配置
server:
port: 9999
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: goods-service-route
uri: lb://goods-service
predicates:
- Path=/goods/**
- id: order-service-route
uri: lb://order-service
predicates:
- Path=/order/**,/orders/**
eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8888/eureka
Gateway的过滤器
从过滤器生命周期(影响时机点)的角度来说,主要有两个pre和post:
生命周期时机点 | 作用 |
---|---|
pre | 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。 |
post | 这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。 |
从过滤器类型的角度,Spring Cloud GateWay的过滤器分为GateWayFilter和GlobalFilter两种
过滤器类型 | 影响范围 |
---|---|
GateWayFilter | 应用到单个路由上 |
GlobalFilter | 应用到所有的路由上 |
/**
* 自定义全局过滤器,用于用户权限验证
*/
@Slf4j
@Component
public class AuthenticationFilter implements GlobalFilter, Ordered {
//过滤请求和响应
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获得请求和响应
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//获得请求参数 如果有token=123456 就表示登录
String token = request.getQueryParams().getFirst("token");
log.info("url==>"+request.getURI());
log.info("token==>"+token);
if(!"123456".equals(token)){
//如果没有参数token=123456,拒绝访问
response.setStatusCode(HttpStatus.UNAUTHORIZED);
String msg = "Request Denied!!";
DataBuffer wrap = response.bufferFactory().wrap(msg.getBytes());
return response.writeWith(Mono.just(wrap));
}
//如果有就放行
return chain.filter(exchange);
}
//返回过滤器顺序,越小越靠前
@Override
public int getOrder() {
return 0;
}
}