SpringCloud系列(40)--SpringCloud Gateway的Filter的简介及使用

前言:在上一节中我们介绍了SpringCloud Gateway各种Route Predicate的作用 ,而在本节中我们将介绍SpringCloud Gateway的Filter。

1、SpringCloud GatewayFilter的相关知识

生命周期:

(1)pre(业务逻辑之前)

(2)post(业务逻辑之后)

种类:

(1)GatewayFilter

共31种,详细见官方文档(都有官方模板,我这里不叙述了):

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories

(2)GlobalFilter

共10种,详细见官方文档(都有官方模板,我这里不叙述了):

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#global-filters

2、自定义Filter
(1)新建一个名为filter的包

效果图:

(2)新建一个名为MyLogGateWayFilter的类

效果图:

3、编写MyLogGateWayFilter类的内容
package com.ken.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
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.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("com in MyLogGateWayFilter:" + new Date());
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if(username == null) {
            log.info("用户名为null,非法用户");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //把这次请求通过的exchange继续传下去到下一个过滤器
        return chain.filter(exchange);
    }

    /**
     * 加载过滤器的顺序,值越小优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}


 application.yml内容如下,可以作为参考内容

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        #路由的ID,没有同定规则但要求唯一,建议配合服务名
        - id: payment_routh
          #断言,对与路径相匹配的进行路由,即对http://localhost:8001/payment/get/**下的路径进行路由
          predicates:
            - Path=/payment/get/**
          #匹配后提供服务的路由地址
          #uri: http://localhost:8001
          #匹配后提供服务的路由地址,lb://表示基于服务注册的负载均衡,lb是loadbalance的缩写
          uri: lb://cloud-payment-service
        #路由的ID,没有同定规则但要求唯一,建议配合服务名
        - id: payment_routh2
          #断言,对与路径相匹配的进行路由,即对http://localhost:8001/payment/lb/**下的路径进行路由
          predicates:
            - Path=/payment/lb/**
          #匹配后提供服务的路由地址
          #uri: http://localhost:8001
          #匹配后提供服务的路由地址,lb://表示基于服务注册的负载均衡,lb是loadbalance的缩写
          uri: lb://cloud-payment-service

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    #表示是否将自己注册进Eureka Server里,默认为true
    register-with-eureka: true
    #是否从Eureka Server抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

4、重启cloud-gateway-gateway9527服务

5、测试gateway拦截效果

在浏览器的地址栏里输入http://localhost:9527/payment/lb?username=ken,通过调用接口可以看出我们成功的通过gateway来把请求从对cloud-gateway-gateway9527服务的访问转发到了对provider-payment8001服务的访问

在浏览器的地址栏里分别输入http://localhost:9527/payment/lbhttp://localhost:9527/payment/lb?abc=1,通过调用接口可以看出gateway把我们不符合条件的请求给过滤屏蔽掉了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值