package com.jt;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class FilterChainTests {
public static void main(String[] args) {
List list = new CopyOnWriteArrayList<>();
Filter filter1 = new Filter() {
@Override
public boolean filter() {
System.out.println("I am Filter false");
return true;
}
};
Filter filter2 = new Filter() {
@Override
public boolean filter() {
System.out.println("I am Filter true");
return true;
}
};
list.add(filter1);
list.add(filter2);
FilterChain filterChain = new FilterChain(list, new Servlet() {
@Override
public void dispatch() {
System.out.println("正在分发");
}
});
filterChain.doFilter();
}
}
class FilterChain{
private List filters = new CopyOnWriteArrayList<>();//过滤器
private Servlet servlet;//控制器(请求控制逻辑)
public FilterChain(List filters, Servlet servlet) {
this.filters.addAll(filters);
this.servlet = servlet;
}
public void doFilter(){
for (int i = 0; i < filters.size(); i++) {
if(!filters.get(i).filter())return;
}
servlet.dispatch(); //请求分发
}
}
interface Filter{
boolean filter();
}
interface Servlet{
void dispatch();
}
- Spring Cloud Gateway
优点:
性能强劲:是网关1.0 Zuul的1.6倍。
功能强大:内置功能如转发、监控、限流等
设计优秀,容易扩展。
缺点:
依赖Netty与WebFlux(Spring5.0),不是传统的Servlet编程模型(Spring MVC就是基于此模型实现)。
需要Spring Boot 2.0及以上的版本,才支持
使用流程:
pom.xml:
org.springframework.cloud
spring-cloud-starter-gateway
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: http://localhost:8081/ #网关帮我们转发的url
predicates: #断言:匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义,对应url中的资源
filters: #网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,如nacos
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8180
port: 8719
eager: true
gateway:
discovery:
locator:
enabled: true #开启通过服务注册中心的serviceId创建路由
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: lb://sca-provider # lb为服务前缀(负载均衡单词的缩写),不能随意写
predicates: #断言:匹配请求规则
- Path=/nacos/provider/out/** #请求路径定义,对应url中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,如nacos