SpringCloudAlibaba学习笔记--SpringCloud网关学习
SpringCloud Gateway的作用
路由转发,它与第一代网关Zuul不同的是:gateway是同步非阻塞的(netty+webflux实现的);Zuul是同步阻塞的。

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越大,优先级越低,越晚被执行
- 全局过滤器所有请求都执行

浙公网安备 33010602011771号