目录
[网关过滤器 参数为null 401](#网关过滤器 参数为null 401)
[网关过滤器 参数为123456-common 403权限不够](#网关过滤器 参数为123456-common 403权限不够)
[网关过滤器 参数为123456-admin 成功](#网关过滤器 参数为123456-admin 成功)
1.理论基础
客户端和服务端中间的一堵墙,可以起到的作用有:请求转发、负载均衡、权限控制等等
网关解决从客户端(如8080端口)进入服务端时调用哪个微服务的问题(请求转发功能),Feign解决各微服务之间的相互调用问题。
网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
一般来说网关对外暴露的URL或者接口信息,我们统称为路由信息。
在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。一般开发高并发系统常见的限流有:①限制总并发数(比如数据库连接池、线程池)。②限制瞬时并发数(如 nginx 的 limit_conn 模块,用来限制瞬时并发连接数)③限制时间窗口内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模块,限制每秒的平均速率);④其他还有如限制远程接口调用速率、限制 MQ 的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流
网关实现流程
- 客户端发送请求先到网关
- 将网关服务和其它要访问的服务在注册中心进行注册
- 通过网关访问到注册的其它服务
2.添加依赖
!!!不能和 web 依赖同时添加
常见的5中网关
- Zuul: 构建于 Servlet 2.5,兼容3.x,使用的是阻塞式的API,不支持长连接,比如 websockets。
- Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成
网关依赖:spring-cloud-starter-gateway。
网关也需要注册到nacos中,需要nacos依赖。
网关的作用之一,可以做负载均衡,所以加入loadbalancer负载均衡依赖。
bootstrap依赖:该资源文件中的配置生效依赖。
XML
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3.配置文件
首先开启网关,其次设置routes网关路由配置,其中
id为路由id,不重复即可
uri为路由的目标地址: http就是固定地址, lb就是负载均衡。
predicates: - Path=/shopping/** 为访问路径
filters: - StripPrefix=1 把网关地址截取第一个字段 其实访问的是 uri的地址
java
server:
port: 8081
spring:
main:
web-application-type: reactive
application:
name: GateWay
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册进入nacos服务器
gateway:
discovery:
locator:
enabled: true #开启网关
routes:
- id: CommodityCustomer
uri: http://localhost:9010 #访问消费者
predicates:
- Path=/Commodity/**
filters:
- StripPrefix=1
- id: UserProvider
uri: lb://UserProvider #直接访问生产者
predicates:
- Path=/User/**
filters:
- StripPrefix=1
4.效果
有用户模块和商品模块,用户模块由网关连接消费者,消费者做负载均衡。用户模块网关直接连接生产者,网关做负载均衡。
全局过滤器
- 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
- 认证通过,将用户信息进行加密形成token,返回给客户端aaaa,作为登录凭证
- 以后每次请求,客户端都携带认证的token
- 服务端对token进行解密,判断是否有效
依赖
XML
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
自定义全局过滤器
java
@Component
public class gatewayConfig implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 定义一个令牌字符串
String TOKEN_="123456-admin";
// 从请求中获取令牌
String token=exchange.getRequest().getQueryParams().getFirst("token");
if(token.isEmpty()){
// 如果令牌为空,则返回一个未授权的状态码(401)并拦截请求
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();//拦截
}else if (token.contains("123456-")) {
// 如果令牌包含预期的前缀,则进行权限检查
if(token.contains("admin")){
// 如果令牌具有预期的权限,则将请求发送到后续过滤器或路由处理程序
return chain.filter(exchange);
}else {
// 如果令牌没有预期的权限,则返回一个禁止访问的状态码(403)并拦截请求
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();//拦截
}
}
// 如果令牌不包含预期的前缀,则将请求发送到后续过滤器或路由处理程序
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 返回一个负整数,表示该 BeanPostProcessor 实现类应该被优先级较低的 BeanPostProcessor 实现类排除
return -1;
}
}