当前位置: 首页 > article >正文

微服务之网关、网关路由、网关登录校验

简介:来源:SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)

认识网关

前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行
  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
    在这里插入图片描述
    在SpringCloud当中,提供了两种网关实现方案:
  • Netflix Zuul:早期实现,目前已经淘汰
  • SpringCloudGateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强。
    SpringCloudGateway官网:https://spring.io/projects/spring-cloud-gateway#learn
    在这里插入图片描述

网关路由-快速入门

接下来,我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块开发功能。大概步骤如下:

  • 创建网关微服务
  • 引入SpringCloudGateway、NacosDiscovery依赖
  • 编写启动类
  • 配置网关路由

1、创建项目
首先,我们要创建一个新的module,比如命名为gateway,作为网关微服务:

2、引入依赖
在gateway模块的pom.xml文件中引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

3、编写启动类
在gateway模块中新建一个启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

4、配置路由
接下来,在gateway模块的resources目录新建一个application.yaml文件,内容如下:

server:
  port: 8080
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.254.129:8848
    gateway:
      routes:
        - id: item # 路由规则id,自定义,唯一
          uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
          predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
            - Path=/items/**,/search/** # 这里是以请求路径作为判断规则
        - id: cart
          uri: lb://cart-service
          predicates:
            - Path=/carts/**
        - id: user
          uri: lb://user-service
          predicates:
            - Path=/users/**,/addresses/**
        - id: trade
          uri: lb://trade-service
          predicates:
            - Path=/orders/**
        - id: pay
          uri: lb://pay-service
          predicates:
            - Path=/pay-orders/**

网关路由-路由属性

网关路由对应的Java类型是RouteDefinition,其中常见的属性有

  • id:路由唯一标示
  • uri:路由目标地址
  • predicates: 路由断言,判断请求是否符合当前路由
  • filters:路由过滤器,对请求或响应做特殊处理

Spring Cloud Gateway官网:https://docs.spring.io/spring-cloud-gateway/docs/3.1.9/reference/html/

1、路由断言
12种Route Predicate Factories实现示例
在这里插入图片描述
2、路由过滤器
33种路由过滤器官网实现示例
在这里插入图片描述
在default-filters下设置的过滤器对所有路由生效:

spring:
  cloud:
    gateway:
      routes:
        - id: item
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**
      default-filters:
        - AddRequestHeader=truth, anyone long-press like button will be rich

网关登录校验-思路分析

在这里插入图片描述
在这里插入图片描述

注意:NettyRoutingFilter是做请求转发的,所以应该在NettyRoutingFilter之前且在过滤器的pre逻辑之前进行登录校验

网关登录校验-自定义过滤器

在这里插入图片描述
自定义GlobalFilter过滤器

进行登录校验一般都选择自定义GlobalFilter过滤器

在这里插入图片描述
在这里插入图片描述
自定义GagtewayFilter过滤器

自定义GagtewayFilter过滤器比较麻烦,大多数情况都选择自定义GlobalFilter过滤器

自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory。最简单的方式是这样的:

@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
    @Override
    public GatewayFilter apply(Object config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                // 获取请求
                ServerHttpRequest request = exchange.getRequest();
                // 编写过滤器逻辑
                System.out.println("过滤器执行了");
                // 放行
                return chain.filter(exchange);
            }
        };
    }
}

注意:该类的名称一定要以GatewayFilterFactory为后缀!

然后在yaml配置中这样使用:

spring:
  cloud:
    gateway:
      default-filters:
            - PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器

另外,这种过滤器还可以支持动态配置参数,不过实现起来比较复杂,示例:

@Component
public class PrintAnyGatewayFilterFactory // 父类泛型是内部类的Config类型
                extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {

    @Override
    public GatewayFilter apply(Config config) {
        // OrderedGatewayFilter是GatewayFilter的子类,包含两个参数:
        // - GatewayFilter:过滤器
        // - int order值:值越小,过滤器执行优先级越高
        return new OrderedGatewayFilter(new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                // 获取config值
                String a = config.getA();
                String b = config.getB();
                String c = config.getC();
                // 编写过滤器逻辑
                System.out.println("a = " + a);
                System.out.println("b = " + b);
                System.out.println("c = " + c);
                // 放行
                return chain.filter(exchange);
            }
        }, 100);
    }

    // 自定义配置属性,成员变量名称很重要,下面会用到
    @Data
    static class Config{
        private String a;
        private String b;
        private String c;
    }
    // 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺序获取
    @Override
    public List<String> shortcutFieldOrder() {
        return List.of("a", "b", "c");
    }
        // 返回当前配置类的类型,也就是内部的Config
    @Override
    public Class<Config> getConfigClass() {
        return Config.class;
    }

}

然后在yaml文件中使用:

spring:
  cloud:
    gateway:
      default-filters:
            - PrintAny=1,2,3 # 注意,这里多个参数以","隔开,将来会按照shortcutFieldOrder()方法返回的参数顺序依次复制

上面这种配置方式参数必须严格按照shortcutFieldOrder()方法的返回参数名顺序来赋值。
还有一种用法,无需按照这个顺序,就是手动指定参数名:

spring:
  cloud:
    gateway:
      default-filters:
            - name: PrintAny
              args: # 手动指定参数名,无需按照参数顺序
                a: 1
                b: 2
                c: 3

网关登录校验-实现登录校验

网关登录校验-网关传递用户到微服务

网关登录校验-OpenFeign传递用户信息


http://www.kler.cn/news/364310.html

相关文章:

  • 论文阅读与写作入门
  • ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome,AdGuardHome实现的DHCP和DNS 去广告
  • 101. UE5 GAS RPG 实现范围技能奥术爆发表现
  • 【linux】物理卷、卷组、逻辑卷
  • 论当前的云计算
  • Django从请求到响应
  • MySQL数据库—多表查询
  • 数码管显示屏驱动高亮LED驱动芯片VK16K33A数码管控制电路
  • 电脑程序变化监控怎么设置?实时监控电脑程序变化的五大方法,手把手教会你!
  • qt QMainWindow详解
  • 智象未来(HiDream.ai)携手Rokid,开启虚拟与现实交融新体验
  • fmql之Linux RTC
  • 关闭CPU C State 解决卡屏死机问题
  • 音视频:安防监控
  • SIP 业务举例之 Call Hold(呼叫保持)
  • 【AIGC】2023-ICCV-为文本到图像的传播模型添加条件控制
  • 使用预训练的BERT进行金融领域问答
  • 忘记7-zip文件7-zip文件,还可以解压zip文件吗?
  • cosine_with_warmup_scheduler(lrgb文件中的cosine_scheduler.py)
  • Electron 离线环境打包解决方案(electron-forge)
  • 堆(堆排序,TOP K, 优先级队列)
  • AI图片生成3D物体和2D视频提取3D动画
  • vr头显都是什么操作系统
  • SpringColoud GateWay 核心组件
  • 纷享销客生态大会成都站成功举办:携手精英伙伴,共话CRM新纪元
  • RTC(Real-Time Clock)简介