SpringCloud Gateway 网关

约定不等于承诺〃 2022-10-24 01:49 396阅读 0赞

目录

      • 搭建getway网关
      • 路由断言Predicate
      • gateway 过滤器
      • gateway实现网关限流

gateway是springcloud官方推出网关,用于取代netflix的zuul。

gateway基于WebFlux,底层使用Netty,性能强劲、功能多样,但

  • 不支持springboot 1.x
  • 不能在servlet容器下工作,不能打成war包

搭建getway网关

创建时勾选 SpringCloud Routing -> Getway,也可以手动添加依赖

  1. <!--要注册到注册中心上-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-gateway</artifactId>
  9. </dependency>
  10. spring:
  11. application:
  12. name: gateway
  13. cloud:
  14. nacos:
  15. discovery:
  16. server-addr: 127.0.0.1:8848
  17. gateway:
  18. #启用智能路由,从注册中心拉取服务按照服务名路由
  19. discovery:
  20. locator:
  21. enabled: true
  22. #同时支持自定义路由配置
  23. #routes:

说明:getway内置了ribbon实现负载均衡,内置了hystrix实现容错。

路由断言Predicate

Predicate 断言,也叫做谓词,来源于Java8,接受输入参数,返回一个布尔值结果。gateway利用 Predicate 的特性实现了多种路由转发的判断条件,满足指定的Predicate后才会进行路由转发。

gateway内置了多种断言,名称为 XxxRoutePredicateFactory,可以同时搭配使用多种断言,设置时取RoutePredicateFactory前面部分单词即可。

gateway 过滤器

过滤器的作用时机

  • pre: 请求被路由到服务之前执行,一般用于鉴权、限流等
  • post:服务返回响应到网关后、网关返回给客户端响应之前执行,可用于修改响应结果

gateway的过滤器可分为

  • 局部过滤器:作用在指定路由上,gateway内置了多种局部过滤器,可以使用内置的,也可以继承下来重写方法。不管是内置的、还是自定义的,局部过滤器的类名都要以GatewayFilterFactory结尾。
  • 全局过滤器:作用在全部路由上,可以使用内置的,也可以自定义。

demo 全局过滤器的使用

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  4. import org.springframework.cloud.gateway.filter.GlobalFilter;
  5. import org.springframework.core.Ordered;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.web.server.ServerWebExchange;
  9. import reactor.core.publisher.Mono;
  10. @Component //放到容器中
  11. @Slf4j //实现 GlobalFilter, Ordered 2个接口
  12. public class LoginGlobalFilter implements GlobalFilter, Ordered {
  13. @Override
  14. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  15. //要进行的过滤操作
  16. String token = exchange.getRequest().getHeaders().getFirst("token");
  17. log.info("token:{}", token);
  18. if(StringUtils.isBlank(token)){
  19. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  20. //return终止后续操作
  21. return exchange.getResponse().setComplete();
  22. }
  23. //继续后续执行
  24. return chain.filter(exchange);
  25. }
  26. @Override
  27. public int getOrder() {
  28. //order指定过滤器优先级,数字越小,优先级越高
  29. return 0;
  30. }
  31. }

测试时可以在postman的header中传一个token字段。

网关尽量轻量,加太多的业务逻辑会影响性能。对个别服务的业务处理逻辑可以写在服务自身中。

gateway实现网关限流

gateway的内置过滤器 RequestRateLimiterGatewayFilterFactory 提供了限流能力,基于令牌桶算法实现,内置了RedisRateLimiter,使用Redis存储限流配置、统计数据。

也可以自己实现RateLimiter 接口,或继承AbstractRateLimiter,使用自定义的RateLimiter。

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读