gateway服务网关
gateway相当于所有请求的必经之路,客户端请求通过gateway后由定义的路由、断言、过滤器进行验证后转发,只有同时符合条件才给予转发。常用的功能包括路由转发,权限校验,限流。
gateway核心概念
路由(route):路由是网关中最基础的一部分,路由包括一个id,url,一组断言工厂,一组filter组成。
断言(predicates):断言是由开发者去定义匹配规则。
过滤器(filter):Gateway中的filter分为Gateway Filter和Global Filter。Filter 可以对请求和响应进行处理。
例如:
spring:
cloud:
gateway:
routes:
- id: payment_login
uri: lb://CLOUD-PAYMENT-SERVICE
predicates:
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
- Path=/login/**
filters:
- PrefixPath=/sent/user
gateway构建步骤
-
加maven依赖,不需要加web依赖否则会报错。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
写yml文件路由规则
server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true routes: - id: payment_login uri: lb://CLOUD-PAYMENT-SERVICE predicates: - After=2018-01-20T06:06:06+08:00[Asia/Shanghai] - Path=/login/** filters: - PrefixPath=/sent/user eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eurek
全局过滤器
无需另外配置,对所有路由生效。
@Component
@Slf4j
public class PaymentGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String username = exchange.getRequest().getQueryParams().getFirst("username");
if (!"admin".equals(username)){
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
log.info("非法闯入"+ new Date().toString());
return exchange.getResponse().setComplete();
}
log.info("登录时间"+ new Date().toString());
return chain.filter(exchange);
}
/**
* 加载顺序,越小越先加载
* @return
*/
@Override
public int getOrder() {
return 0;
}
}