Loading

SpringCloudAlibaba学习笔记--SpringCloud网关学习

SpringCloud Gateway的作用

路由转发,它与第一代网关Zuul不同的是:gateway是同步非阻塞的(netty+webflux实现的);Zuul是同步阻塞的。
image

SpringCloud Gateway工作模型及其解读

  • 请求发送到网关,经由分发器请求匹配到相应的HandlerMapping
  • 请求和处理器之间有一个映射器,路由到网关处理程序,即Web Handler
  • 执行特定的请求过滤器链
  • 最终到达代理微服务

谓词Predicate的原理与应用

predicate采用java8的stream方式

点击查看代码
package com.imooc.ecommerce.service;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Java8 Predicate使用方法与思想
 */
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class PredicateTest {
    /**
     * 常用微服务注释
     */
    public static List<String> MICRO_SERVICE = Arrays.asList(
            "nacos", "authority", "gateway", "ribbon", "feign", "hystrix", "e-commerce"
    );

    /**
     * test方法主要用于参数不符合规则,返回值为boolean
     */
    @Test
    public void testPredicateTest() {
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        MICRO_SERVICE.stream().filter(letterLengthLimit).forEach(System.out::println);
    }

    /**
     * and方法等同于我们的逻辑与,存在短路特性,需要所有的条件都满足
     */
    @Test
    public void testPredicateAnd() {
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        Predicate<String> letterStartWith = s -> s.startsWith("gate");
        MICRO_SERVICE.stream().filter(letterLengthLimit.and(letterStartWith)).forEach(System.out::println);
    }

    /**
     * 等同于逻辑或,多个条件满足其中一个即可
     */
    @Test
    public void testPredicateOr(){
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        Predicate<String> letterStartWith = s -> s.startsWith("gate");
        MICRO_SERVICE.stream().filter(letterLengthLimit.or(letterStartWith)).forEach(System.out::println);
    }

    /**
     * 等同于逻辑非
     */
    @Test
    public void testPredicateNegate(){
        Predicate<String> letterStartWith = s -> s.startsWith("gate");
        MICRO_SERVICE.stream().filter(letterStartWith.negate()).forEach(System.out::println);

    }

    /**
     * isEqual类似于equals(),区别在于:先判断对象是否为NULL
     * 不为NULL再使用equal进行比较
     */
    @Test
    public void testPredicateIsEqual(){
        Predicate<String> equalGateway = s -> Predicate.isEqual("gateway").test(s);
        MICRO_SERVICE.stream().filter(equalGateway).forEach(System.out::println);
    }

}

注册网关监听器

获取nacos配置信息,推送到网关上面,获取网关的配置信息解析里面的路由信息,调用网关添加路由的接口,填到路由上面。

SpringCloud Gateway Filter的相关概念

  • SpringCloud Gateway基于过滤器实现,同zuul类似,有pre和post两种方式的filter,分别处理前置逻辑和后置逻辑
  • 客户端请求先经过pre类型的filter,然后将请求转发到具体的业务服务,收到业务服务响应以后,再经过post类型filter处理,最后响应到客户端。
  • Filter一共分为两大类:全局过滤器和局部过滤器
  • 过滤器有优先级之分,Order越大,优先级越低,越晚被执行
  • 全局过滤器所有请求都执行
posted @ 2022-09-07 16:48  DoDo神  阅读(33)  评论(0)    收藏  举报