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

相关推荐
摸五休二3 小时前
后端技术实战案例总结:从单体应用到微服务架构的迁移
后端·微服务·架构
_长银6 小时前
判断一个Java服务是不是GateWay
网络·gateway
程序员老茶6 小时前
SpringCloud:Gateway服务网关
spring·spring cloud·gateway
颜淡慕潇1 天前
【Sa-Token|2】Sa-Token在微服务中的使用
微服务·云原生·架构·单点登录·sso
续亮~1 天前
28、架构-技术方法论之向微服务迈进
java·运维·微服务·架构
三氧化真1 天前
微服务中不同服务使用openfeign 相互调用
java·微服务·架构
啟王朝1 天前
微服务SpringCloud,SpringAliBaBa(2)
java·spring cloud·微服务
续亮~1 天前
25、架构-微服务的驱动力
java·后端·微服务·云原生·容器·架构
增量星球2 天前
如何将现有系统逐步优化成微服务设计
数据库·微服务
luo♛2 天前
微服务(服务治理)
微服务·架构·springcloud