Spring Cloud / Alibaba 微服务架构 | 2021年11月更文挑战(21)

222 阅读2分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

上篇文章给大家介绍了SpringCloud Gateway 的工作模型及请求进入到我们的SpringCloud Gateway后,最终到达Proxied Service 目标服务经过的四个阶段,本篇文章将介绍一下Predicate(谓词/断言)的原理与应用。

谓词 Predicate 的原理与应用

之前的文章中有介绍过Predicate,它是Gateway的三大组成部分之一,是对条件匹配的判断。

谓词Predicate是什么

认识Predicate

由Java8引入,位于java.util.function包中,是一个FunctionalInterface,即函数式接口。它只有一个test方法没有实现。

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
    ...
 }

可以看到,test方法需要输入一个参数,返回boolean类型,通常用在stream的filter中,表示是否满足过滤条件

我们先创建一个网关子模块,在里面写一些例子的测试代码让我们熟悉Predicate的方法,介绍Predicate的应用方法和应用过程。

创建网关子模块(e-commerce-gateway)来编写例子

1、创建子模块、修改pom文件等步骤不再赘述。

此处有一点需要注意,e-commerce-gateway之所以不像其他子模块一样在依赖里引入e-commerce-mvc-config,是因为我们的e-commerce-mvc-config依赖了starter-web,starter-web里依赖了starter-tomcat,它是由web去引用进来的。gateway子模块使用的是WebFlux,默认使用的是Netty,所以我们需要从依赖中排除tomcat相关的依赖,所以不能引入spring-boot-starter-web这个依赖。

2、resources下创建配置类bootstrap.yml

3、创建启动类

/**
 * <h1>网关启动入口</h1>
 * */
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {

        SpringApplication.run(GatewayApplication.class, args);
    }
}

4、创建测试类验证工程搭建正确性

image.png

Java8 Predicate test方法使用

/**
 * <h1>Java8 Predicate 使用方法与思想</h1>
 * */
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class PredicateTest {

    public static List<String> MICRO_SERVICE = Arrays.asList(
            "nacos", "authority", "gateway", "ribbon", "feign", "hystrix", "e-commerce"
    );

    /**
     * <h2>test 方法主要用于参数符不符合规则, 返回值是 boolean</h2>
     * */
    @Test
    public void testPredicateTest() {

        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        MICRO_SERVICE.stream().filter(letterLengthLimit).forEach(System.out::println);
    }
}

test 方法主要用于判断参数符不符合规则, 返回值是 boolean。

上图代码指的是依次输出MICRO_SERVICE中字符串长度大于5的。

下篇文章我们将介绍一下Predicate中and、negate、or、isEqual方法。