GateWay网关

目录

1.理论基础

网关实现流程

2.添加依赖

3.配置文件

4.效果

全局过滤器

依赖

自定义全局过滤器

测试

网关过滤器 参数为null 401

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

网关过滤器 参数为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依赖:该资源文件中的配置生效依赖。

<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的地址

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进行解密,判断是否有效

依赖

<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
        </dependency>

自定义全局过滤器

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

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随便1007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值