Spring Cloud Gateway(黑马springcloud笔记)

news2024/11/28 6:28:34

Gateway

目录

  • Gateway
    • 一、为什么需要网关
    • 二、gateway入门
    • 三、断言工厂
    • 四、过滤器工厂
    • 五、全局过滤
      • 1. 实现
      • 2. 过滤器执行顺序
    • 六、跨域问题

一、为什么需要网关

不能让外部能够直接访问微服务,而是需要通过网关访问:

在这里插入图片描述

网关的作用:

  • 身份认证和权限校验
  • 请求路由,负载均衡
  • 限流

二、gateway入门

搭建网关步骤:

  1. 创建新的模块,引入依赖:

    <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>
    
  2. 配置nacos和路由

    spring:
      cloud:
        nacos:
          server-addr: localhost:80
        gateway:
          routes:
            -
              id: user-service # 路由id 必填 不重复即可
              uri: lb://userService # 路由目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - 'Path=/user/**' # 判断路径是否以/user开头,如果是则符合
            -
              id: order-service
              uri: lb://orderService
              predicates:
                - 'Path=/order/**'
      application:
        name: gateway
    
    server:
      port: 10010
    
  3. 启动测试:

    在这里插入图片描述

    在这里插入图片描述

  4. 小结:

    在这里插入图片描述

三、断言工厂

我们配置时候配置的路由断言就是由断言工厂解析的,我们配置的是字符串,路由工厂则取解析。

在这里插入图片描述

配一个after试试:


spring:
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes:
        -
          id: user-service # 路由id 必填 不重复即可
          uri: lb://userService # 路由目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - 'Path=/user/**' # 判断路径是否以/user开头,如果是则符合
        -
          id: order-service
          uri: lb://orderService
          predicates:
            - 'Path=/order/**'
            - After=2023-01-14T23:38:47.789+08:00[Asia/Shanghai]
  application:
    name: gateway

server:
  port: 10010

改着玩,如果符合要求就能请求成功,如果不符合要求就404了。

四、过滤器工厂

可对进入网关的请求和服务的响应作处理。

在这里插入图片描述

局部配置:


spring:
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes:
        -
          id: user-service # 路由id 必填 不重复即可
          uri: lb://userService # 路由目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - 'Path=/user/**' # 判断路径是否以/user开头,如果是则符合
          filters:
            - AddRequestHeader=IHeader,this is filter
        -
          id: order-service
          uri: lb://orderService
          predicates:
            - 'Path=/order/**'
            - After=2023-01-14T23:40:00+08:00[Asia/Shanghai]
  application:
    name: gateway

server:
  port: 10010

修改user-service的代码:

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
                      @RequestHeader(value = "IHeader", required = false) String IHeader) {
    System.out.println(IHeader);
    return userService.queryById(id);

}

访问user-service的接口即可看到打印 this is filter

全局配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes:
        -
          id: user-service # 路由id 必填 不重复即可
          uri: lb://userService # 路由目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - 'Path=/user/**' # 判断路径是否以/user开头,如果是则符合
        -
          id: order-service
          uri: lb://orderService
          predicates:
            - 'Path=/order/**'
            - After=2023-01-14T23:40:00+08:00[Asia/Shanghai]
      default-filters:
       - AddRequestHeader=IHeader,this is filter
  application:
    name: gateway

server:
  port: 10010

访问user-service的接口即可看到打印 this is filter

五、全局过滤

1. 实现

和上一种配置的过滤器一样,区别在于全局过滤器可以自定义逻辑。

实现GlobalFilter接口即可(有web Flux的感觉)

public class IFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return null;
    }
}

例子:

// 过滤器链上的优先级 越低优先级越高
@Order(-1)
@Component
public class IFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        // 2.获取某个参数
        String auth = queryParams.getFirst("username");
        // 3.业务
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 修改返回状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 拦截
        return exchange.getResponse().setComplete();
    }
}

这里有个小坑:

如果这个全局过滤器没有放在和启动类同包下,那么无法被扫描,也就无法生效,解决方案也很简单:

  1. 放在和启动类同包下
  2. 使用@ComponentScan、@Import等注解,将其导入IOC容器中。

2. 过滤器执行顺序

不管是yml中配置的filters、default-filters还是GlobalFilter,其本质都是GatewayFilter。

所以他们的执行顺序是由他们的order值决定,他们的order值有以下规则:

  • 路由过滤器和默认过滤器的order由spring指定,默认是按照声明顺序从1递增
  • GlobalFilter的Order值由我们决定
  • 当过滤器的order值相同时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

六、跨域问题

经典问题,配置解决即可

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOrigins: "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 本次跨域有效期
         allowedOrigins: "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 本次跨域有效期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法基础(王卓)(8):线性表的应用(并集和有序表合并)

PPT&#xff1a;第二章P173&#xff1b; 并集集合&#xff1a;线性表的合并&#xff08;无需有序&#xff0c;不能重复&#xff09; 线性表&#xff1a; Status Union(Sqlist& A, Sqlist& B)//并集 {int len_A A.length;int len_B B.length;for (int i 1; i < …

研究生如何能(较快)找出某领域(去噪)已有算法的创新点或者引入其他领域的新算法?

广义上说&#xff0c;滤波就是给不同的信号分量分配不同的权重&#xff0c;较为复杂的维纳滤波, 是根据信号的统计量设计权重。狭义上说&#xff0c;降噪/去噪&#xff0c;可以看成滤波的一种。降噪的目的在于突出信号本身而抑制噪声影响。从这个角度&#xff0c;降噪就是给信号…

C/C++ 调用规则

平栈&#xff1a;清理参数对调用栈的操作步骤&#xff1a;参数传递三种调用约定&#xff1a;cdecl &#xff08;C调用约定&#xff09;:从右往左传参&#xff0c;参数通过栈传递&#xff0c;调用方(caller)负责平参&#xff08;支持类似printf的不定参&#xff09;stdcall (标准…

hadoop简介

文章目录1&#xff1a;hadoop简介2&#xff1a;Hadoop系统2.1&#xff1a;hadoop架构1&#xff1a;MapReduce2&#xff1a;YARN架构3&#xff1a;HDFS2.2&#xff1a;HDFS、YARN、MapReduce三者关系1&#xff1a;hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础…

如何快速删除CSV、Excel、Markdown表格的重复行?

如果你正在使用 CSV、Excel 或 Markdown 表格&#xff0c;你可能会遇到重复行的问题。这可能是因为你手动输入了重复的数据&#xff0c;或者是因为你从其他源导入了重复的数据。无论原因是什么&#xff0c;删除重复行是一项重要的数据清理任务。本文将向你展示如何使用几种不同…

RESTful的风格提倡 URL 地址使用统一的风格设计

RESTful概念实现REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。资源&#xff1a;资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。资源的表述资源的表…

nnUNet 训练 AMOS22数据集 Task216(抽丝剥茧指令+原理篇)

环境准备篇 安装hiddenlayer&#xff08;用来生成什么网络拓扑图&#xff1f;管他呢&#xff0c;装吧&#xff09; pip install --upgrade githttps://github.com/nanohanno/hiddenlayer.gitbugfix/get_trace_graph#egghiddenlayer 安装环境&#xff0c;由于服务器已经装好py…

网络安全日益严峻下计算机主机加固的意义

​ 近年来&#xff0c;计算机以及互联网应用在中国得到普及和发展&#xff0c;已经深入到社会每个角落&#xff0c;政府&#xff0c;经济&#xff0c;军事&#xff0c;社会&#xff0c;文化和人们生活等各方面都越来越依赖于计算机和网络&#xff0c;电子政务&#xff0c;无纸办…

【计算机体系结构】指令集体系结构、微体系结构简介

1. “虚拟” to “现实” 首先可以看这张图片&#xff0c;下面的 Physics 所指的是我们的物理世界中看得见摸得到或者是客观存在的事物&#xff0c;而人类希望将自己的工作内容或者需求以某种方式映射到物理层面上&#xff0c;用物理变化带来的影响来完成人类工作内容。例如早期…

《Linux Shell脚本攻略》学习笔记-第二章

2.1 简介 本章将为你介绍一些最值得关注同时也是最实用的命令。 2.2 用cat进行拼接 cat命令能够显示或者拼接文件内容。cat能够将标准输入数据与文件数据组合在一起。 通常的做法是将stdin重定向到一个文件&#xff0c;然后再合并两个文件。而cat命令一次就能搞定这些操作。 1&…

【Linux】基础常见指令

目录​​​​​​​ 前言 一、Linux的环境搭建与远程控制 Linux 环境的搭建方式主要有三种 使用 XShell 远程登陆到 Linux 二、常见指令 1. ls 指令 2. pwd命令 3. cd 指令 4. touch指令 5. mkdir指令 6. rmdir指令 && rm 指令 7. man指令 8. cp指令 9. mv指令 10.…

【微信小程序】实用教程02-添加全局页面配置、页面、底部导航

开始前&#xff0c;请先完成项目创建&#xff0c;详见 【微信小程序】实用教程01-注册登录账号&#xff0c;获取 AppID、下载安装开发工具、创建项目、上传体验 前期准备 因我们的项目是根据模板创建的&#xff0c;需先清理掉无效的页面代码&#xff0c;具体操作方式如下&…

LeetCode 64. 最小路径和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 64. 最小路径和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 64…

【Redis】使用阻塞队列+Redis优化秒杀业务

【Redis】使用阻塞队列Redis优化秒杀业务 文章目录【Redis】使用阻塞队列Redis优化秒杀业务1. 为什么要优化2. 怎么优化2.1 查询优惠卷2.2 判断秒杀库存2.3 校验一人一单2.4 减库存2.5 创建订单2.6 保证redis操作的原子性3. 确认优化方案4. 实现优化方案4.1 编写lua脚本4.2 定义…

jvm系列(3)--运行时数据区Runtime

目录运行时数据区概述及线程前言运行时数据区结构运行时数据区与内存线程的内存空间Runtime类线程JVM 线程JVM 系统线程程序计数器(PC寄存器)PC寄存器介绍PC寄存器的作用举例两个面试题CPU 时间片本地方法接口本地方法举例为什么要使用 Native Method&#xff1f;与Java环境外交…

Tomcat打破双亲委派模型

tomcat的类加载器结构tomcat的类加载&#xff08;loadClass&#xff09;过程和原本的双亲委派模型思路差不多&#xff0c;先看有没有加载过。先在本地 Cache 查找该类是否已经加载过&#xff0c;也就是说 Tomcat 的类加载器是否已经加载过这个类。如果 Tomcat 类加载器没有加载…

【学习笔记】【Pytorch】张量(Tensor)的基础操作

【学习笔记】【Pytorch】张量&#xff08;Tensor&#xff09;的基础操作一、创建张量1.使用数据创建张量2.无需数据的创建选项3.torch.Tensor与torch.tensor的区别4.PyTorch中张量的创建方法的选择二、张量的属性1.张量的 torch.dtype2.张量的 torch.device3.张量的 torch.layo…

阿维塔冲击年10万台订单,第二款车型Q2发布

1月13日&#xff0c;阿维塔科技在重庆总部召开渠道合作伙伴大会。今年&#xff0c;阿维塔计划推出&#xff1a; •阿维塔11后驱版本 •并发布第二款产品&#xff0c;代号E12&#xff0c;定位中大型轿车。阿维塔今年计划冲击10万辆订单目标。在当前CHN平台的基础上&#xff0c;阿…

Openresty记录笔记

最近由于项目需要学习了安全代理的相关知识&#xff0c;其实刚开始的时候是非常需要一个入门的介绍&#xff0c;大概说明下这个到底是个什么东西&#xff0c;能干啥&#xff0c;简单的原理是什么&#xff0c;为此我记录下我看完用完的心得&#xff0c;记录成笔记。 一般我们代码…

Redis 持久化详解

目录一、简介二、RDB持久化2.1、SAVE2.2、BGSAVE2.3、SAVE选项2.4、RDB文件结构2.5、RDB文件载入三、AOF持久化3.1、开启AOF功能3.2、配置AOF文件的冲洗频率3.3、AOF重写3.3.1、BGREWRITEAOF命令&#xff08;手动&#xff09;3.3.2、AOF重写配置选项&#xff08;自动&#xff0…