GateWay网关

目录

1.理论基础

网关实现流程

2.添加依赖

3.配置文件

4.效果

全局过滤器

依赖

自定义全局过滤器

测试

[网关过滤器 参数为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或内存负载等来限流

网关实现流程

  1. 客户端发送请求先到网关
  2. 将网关服务和其它要访问的服务在注册中心进行注册
  3. 通过网关访问到注册的其它服务

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.效果

有用户模块和商品模块,用户模块由网关连接消费者,消费者做负载均衡。用户模块网关直接连接生产者,网关做负载均衡。

全局过滤器

  1. 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
  2. 认证通过,将用户信息进行加密形成token,返回给客户端aaaa,作为登录凭证
  3. 以后每次请求,客户端都携带认证的token
  4. 服务端对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;
    }
}

测试

网关过滤器 参数为null 401

网关过滤器 参数为123456-common 403权限不够

网关过滤器 参数为123456-admin 成功

相关推荐
SilentSamsara34 分钟前
ConfigMap 与 Secret:配置注入的四种姿势与安全边界
linux·运维·服务器·安全·微服务·kubernetes·k8s
zz0723201 小时前
Seata ——微服务分布式事务
分布式·微服务·架构·seata
一个public的class2 小时前
前后端 + Nginx + Gateway + K8s 全链路架构图解
前端·后端·nginx·kubernetes·gateway
rchmin2 小时前
Nacos 3.x 优势介绍及接入指南
微服务·服务发现·动态配置
匀泪19 小时前
云原生(Kubernetes service微服务)
微服务·云原生·kubernetes
uNke DEPH21 小时前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel
ERBU DISH1 天前
当遇到 502 错误(Bad Gateway)怎么办
gateway
全栈软件开发2 天前
企业年报服务系统/小微服务助手小程序源码带搭建教程
微服务·年报小程序源码
亚历克斯神2 天前
Java 代码质量与静态分析:2026 实战指南
java·spring·微服务
行者-全栈开发2 天前
拆解高可用CRM网站的容灾设计与云原生实践
微服务·云原生·异地多活·监控告警·高可用设计·crm架构·容灾演练