执行流程:
从线程池中获取一个线程对象
→线程对象调用IO从网络中读取数据(遵循http格式)
→解析数据,封装到request对象中
→Filter过滤
→Servlet分发请求
→将处理完的结果封装到response对象中并相应到客户端
package com.jt.common.filter;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
//过滤器 特殊拦截器
interface Filter{
boolean inoke();
}
//控制器 分发请求
interface Servlet{
void dispatch();
}
//过滤链
class FilterChain{
private List<Filter> filters=new CopyOnWriteArrayList<>();//过滤器 请求数据过滤
private Servlet servlet;//控制器 请求控制逻辑
public FilterChain(List<Filter> 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).inoke()) return;
}
servlet.dispatch();
}
}
public class FilterChainTests {
public static void main(String[] args) {
List<Filter> filters=new CopyOnWriteArrayList<>();
Filter filter1=new Filter() {
@Override
public boolean inoke() {
System.out.println("过滤1");
return true;
}
};
Filter filter2=new Filter() {
@Override
public boolean inoke() {
System.out.println("过滤2");
return true;
}
};
filters.add(filter1);
filters.add(filter2);
Servlet servlet=new Servlet() {
@Override
public void dispatch() {
System.out.println("分发请求");
}
};
FilterChain fc=new FilterChain(filters,servlet);
fc.doFilter();
}
}
实现效果
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
注意:启动了Netty服务器
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: http://localhost:8081/ #网关帮我们转发的url
predicates: ###断言(谓此):匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
实现效果
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务的注册
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: lb://sca-provider #lb表示负载均衡 sca-provider为服务名
predicates: ###断言(谓此):匹配请求规则 http://localhost:9000/nacos/provider/echo/gateway
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
(图源官网)
<!--网管层面加限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!---->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务的注册
sentinel:
transport:
dashboard: localhost:8180 #Sentinel 控制台地址
eager: true #取消Sentinel控制台懒加载,即项目启动即连接
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: lb://sca-provider #lb表示负载均衡 sca-provider为服务名
predicates: ###断言(谓此):匹配请求规则 http://localhost:9000/nacos/provider/echo/gateway
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
idea配置
实现效果:取消Sentinel控制台懒加载,即项目启动即连接
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_55740233/article/details/121029637
内容来源于网络,如有侵权,请联系作者删除!