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 成功

相关推荐
茶馆大橘8 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
coding侠客9 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
lexusv8ls600h10 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
码农爱java14 小时前
Kafka 之消息并发消费
spring boot·微服务·kafka·mq·消息中间件·并发消费
Flamesky14 小时前
dotnet core微服务框架Jimu ~ 会员注册微服务
微服务·services·micro
为美好的生活献上中指16 小时前
Java学习Day60:微服务总结!(有经处无火,无火处无经)
java·spring boot·spring cloud·微服务·sentinel·jetty
猫猫不是喵喵.16 小时前
【微服务】Docker 容器化
java·docker·微服务
诗这样的19 小时前
【需求变更】使用 Redis 和 Lua 脚本实现变更后方案编号的生成
java·redis·缓存·微服务·lua·需求分析
白总Server1 天前
OpenHarmony
后端·spring cloud·华为·微服务·ribbon·架构·系统架构