美文网首页
gateway网关路由、断言、过滤

gateway网关路由、断言、过滤

作者: 拄杖忙学轻声码 | 来源:发表于2021-09-01 01:22 被阅读0次

Gateway 简介
是什么?
Spring Cloud 全家桶中有个很重要的组件:网关。
Spring Cloud Gateway基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建,使用了 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通讯框架。

能干嘛?
1、反向代理
2、鉴权
3、流量控制
4、熔断
5、日志监控
...

Gateway 的三大概念
1、Predicate(断言)
2、Route(路由)
3、Filter(过滤)

静态路由:
yml配置方式

server:
  port: 9527
spring:
  application:
    name: cloud-gateway9527
  cloud:
    gateway:
      routes:
        - id: news                      # 路由id
          uri: http://news.baidu.com    # 真实调用地址
          predicates:
            - Path=/guonei              # 断言,符合规则进行路由

编码方式

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("news2", r -> r.path("/guoji").uri("http://news.baidu.com"))
                .build();
    }
}

动态路由:
开启后,默认情况下 Gateway 会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh1
          #uri: http://localhost:8001     #静态,写死了地址,只能调用一个服务
          uri: lb://CLOUD-PAYMENT-SERVICE #动态,lb://微服务名
          predicates:
            - Path=/payment/get/**
        - id: payment_routh2
          #uri: http://localhost:8001
          uri: lb://CLOUD-PAYMENT-SERVICE
          predicates:
            - Path=/payment/lb/**

Filter过滤器 的使用
生命周期:pre、post
种类:GatewayFilter、GlobalFilter
GatewayFilter 在官方文档有几十种!详细配置可参考 官网,这里主要介绍自定义全局过滤器。

@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        //用户名为空时,给出错误响应
        if (username == null) {
            log.info("用户名为空,非法登录");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
 
    @Override
    public int getOrder() {
        return 0;
    }
}

示例结果如下:


image.png
image.png

相关文章

网友评论

      本文标题:gateway网关路由、断言、过滤

      本文链接:https://www.haomeiwen.com/subject/hwiziltx.html