SpringCloud(五)Gateway 路由网关

news2024/11/30 1:52:47

一、路由网关

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

我们需要连接互联网,那么就需要将手机或是电脑连接到家里的路由器才可以,而路由器则连接光猫,光猫再通过光纤连接到互联网,也就是说,互联网方向发送过来的数据,需要经过路由器才能到达我们的设备。而路由器充当的就是数据包中转站,所有的局域网设备都无法直接与互联网连接,而是需要经过路由器进行中转,我们一般说路由器下的网络是内网,而互联网那一端是外网。

我们的局域网设备,无法被互联网上的其他设备直接访问,肯定是能够保证到安全性的。并互联网发送过来的数据,需要经过路由器进行解析,识别到底是哪一个设备的数据包,然后再发送给对应的设备。

而我们的微服务也是这样,一般情况下,可能并不是所有的微服务都需要直接暴露给外部调用,这时我们就可以使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并且转发给多个相同微服务实例也可以实现负载均衡。

路由的实现一般使用Zuul,但是已经停更,而现在新出现了由SpringCloud官方开发的Gateway路由,它相比Zuul不仅性能上得到了一定的提升,并且是官方推出,契合性也会更好

1.部署网关

现在我们来创建一个新的项目,作为我们的网关,这里需要添加两个依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

第一个依赖就是网关的依赖,而第二个则跟其他微服务一样,需要注册到Eureka才能生效,注意别添加Web依赖,使用的是WebFlux框架。

然后我们来完善一下配置文件:

server:
  port: 8500
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
spring:
  application:
    name: gateway

接着将路由功能进行配置:

spring:
  cloud:
    gateway:
    	# 配置路由,注意这里是个列表,每一项都包含了很多信息
      routes:
        - id: borrow-service   # 路由名称
          uri: lb://borrowservice  # 路由的地址,lb表示使用负载均衡到微服务,也可以使用http正常转发
          predicates: # 路由规则,断言什么请求会被路由
            - Path=/borrow/**  # 只要是访问的这个路径,一律都被路由到上面指定的服务

路由规则的详细列表(断言工厂列表)在这里:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories,可以指定多种类型,包括指定时间段、Cookie携带情况、Header携带情况、访问的域名地址、访问的方法、路径、参数、访问者IP等。也可以使用配置类进行配置,但是还是推荐直接配置文件,省事。


接着启动网关可以看到,我们现在可以直接通过路由来访问我们的服务了:

 注意此时依然可以通过原有的服务地址进行访问:

 这样我们就可以将不需要外网直接访问的微服务全部放到内网环境下,而只依靠网关来对外进行交涉。

2.路由过滤器

路由过滤器支持以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应,路由过滤器的范围是某一个路由,跟之前的断言一样,Spring Cloud Gateway 也包含许多内置的路由过滤器工厂,详细列表:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

比如我们现在希望在请求到达时,在请求头中添加一些信息再转发给我们的服务,那么这个时候就可以使用路由过滤器来完成,我们只需要对配置文件进行修改:
 

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: borrow-service
          uri: lb://borrowservice
          predicates:
          - Path=/borrow/**
        # 继续添加新的路由配置,这里就以书籍管理服务为例
        # 注意-要对齐routes:
        - id: book-service
          uri: lb://bookservice
          predicates:
          - Path=/book/**
          filters:   # 添加过滤器
          - AddRequestHeader=Test, HelloWorld!
          # AddRequestHeader 就是添加请求头信息,其他工厂请查阅官网

接着我们在BookController中获取并输出一下,看看是不是成功添加了:


@RestController
@RequestMapping("/book")
public class BookController {

    @Resource
    private BookService bookService;

    @GetMapping("/getBookById/{bid}")
    public Book getBookById(@PathVariable("bid") Integer bid,
                            HttpServletRequest request){
        System.out.println(request.getHeader("Test"));
        return bookService.getBookById(bid);
    }
}

现在我们通过Gateway访问我们的图书管理服务:

 

 

可以看到这里成功获取到由网关添加的请求头信息了。

除了针对于某一个路由配置过滤器之外,我们也可以自定义全局过滤器,它能够作用于全局。但是我们需要通过代码的方式进行编写,比如我们要实现拦截没有携带指定请求参数的请求:

@Component   //需要注册为Bean
public class TestFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {   //只需要实现此方法
        return null;
    }
}

接着我们编写判断:

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    //先获取ServerHttpRequest对象,注意不是HttpServletRequest
    ServerHttpRequest request = exchange.getRequest();
    //打印一下所有的请求参数
    System.out.println(request.getQueryParams());
    //判断是否包含test参数,且参数值为1
    List<String> value = request.getQueryParams().get("test");
    if(value != null && value.contains("1")) {
        //将ServerWebExchange向过滤链的下一级传递(跟JavaWeb中介绍的过滤器其实是差不多的)
        return chain.filter(exchange);
    }else {
        //直接在这里不再向下传递,然后返回响应
        return exchange.getResponse().setComplete();
    }
}

可以看到结果:

 

成功实现规则判断和拦截操作。

当然,过滤器肯定是可以存在很多个的,所以我们可以手动指定过滤器之间的顺序:

@Component
public class TestFilter implements GlobalFilter, Ordered {   //实现Ordered接口
  
    @Override
    public int getOrder() {
        return 0;
    }

 注意Order的值越小优先级越高,并且无论是在配置文件中编写的单个路由过滤器还是全局路由过滤器,都会受到Order值影响(单个路由的过滤器Order值按从上往下的顺序从1开始递增),最终是按照Order值决定哪个过滤器优先执行,当Order值一样时 全局路由过滤器执行 优于 单独的路由过滤器执行。

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

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

相关文章

Linux 的远程唤醒

Linux (Ubuntu、Debian、Centos …) 的远程唤醒 环境说明&#xff1a; 两台局域网内的 linux 主机&#xff0c;本环境的系统为 loongnix 目的主机为&#xff1a;IP 192.168.12.11 MAC 86:d8:60:47:28:22远程主机为&#xff1a;IP 192.168.12.15 一、唤醒准备工作 (目的机上操…

Sentinel限流--流控模式与限流效果

文章目录 1、簇点链路2、流控入门案例3、流控模式&#xff1a;关联模式4、流控模式&#xff1a;链路模式5、流控效果&#xff1a;warm up6、限流效果&#xff1a;排队等待7、热点参数限流 1、簇点链路 簇点链路就是项目内的调用链路&#xff08;controller -> servcie ->…

python-在transformers的问答模型中使用中文

先安装transformers在huggingface下载模型 模型bert-multi-cased-finetuned-xquadv1可以从huggingface中下载&#xff0c;具体操作方法可以参照文章https://blog.csdn.net/zhaomengsen/article/details/130616837下载 git clone就可以了然后使用pipline加载模型 from transfor…

【卫朋】华为 IFS 集成财经服务流程(限制版)

目录 简介 集成财经服务 专栏列表 CSDN学院 简介 今天主要来谈谈华为流程体系中的财经流程。 大家可以看下面这张图。 深蓝色标注的就是 IFS 流程的在企业整体流程架构中的位置。 财经部门其实也是直接或间接跟客户打交道的。 这就意味着&#xff0c;财经也是需要做端到…

Unity源码分享-大量鱼类模型Underwater Animals Pack

Unity源码分享-大量鱼类模型Underwater Animals Pack 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88061483

FPGA XDMA 中断模式实现 PCIE3.0 HDMI视频采集卡 提供2套工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串…

中国芯片发出怒吼,要求回购700台光刻机,ASML承受不起

多家媒体报道指国内知名存储芯片企业长江存储的董事长指出已买回的光刻机因维护和零件问题可能无法使用&#xff0c;因此提出基于公平原则&#xff0c;ASML理应回购这些光刻机&#xff0c;凸显出中国芯片企业的愤怒。 由于美国的阻挠&#xff0c;ASML不仅不会继续对中国出售先进…

工厂方法模式(java)

目录 结构 案例 类图 代码实现 抽象咖啡工厂 美式咖啡工厂 拿铁咖啡工厂 咖啡类&#xff08;抽象产品类&#xff09; 美式咖啡 拿铁咖啡 咖啡店类 测试类 优缺点 优点 缺点 结构 工厂方法模式的主要角色&#xff1a; 抽象工厂&#xff08;Abstract Factory&…

MySQL常用语句

目录 连接MySQL 数据库操作 表的操作 数据操作 进阶查询 源码等资料获取方法 连接MySQL -- 语法&#xff1a;mysql -u用户名 -p密码 注&#xff1a;--空格 起到注释的作用 mysql -uroot -p123456 数据库操作 -- 显示当前时间、用户名、数据库版本&#xff08;可以单独…

NodeJS实现支付宝沙箱支付②③

文章目录 前言版权声明Alipay SDK 沙箱环境简介Node环境要求沙箱环境配置下载所需模块准备前端静态页面以及Node服务器文件夹规范AlipaySdk 配置准备AlipaySdk 代码演示 Alipay实例化 ~ alipay.sdk 文件 AlipayForm ~ alipayForm文件 AlipayFormStatus ~ alipayForm文件 …

MQTT协议在物联网环境中的应用及代码实现解析(四)

四、使用单片机环境编程接收MQTT服务器上特定主题的信息 以下是使用STM32F103单片机链接W5500芯片链接到网络上&#xff0c;利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息&#xff0c;并发送给串口的C语言代码示例&#xff0c;包括完…

C语言——指针详解(进阶)

轻松学会C语言指针 一、字符指针二、数组指针2.1 数组指针的定义2.2 &数组名VS数组名2.3 数组指针的使用 三、指针数组四、数组参数和指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 五、函数指针六、函数指针数组七、指向函数指针数组的指针八…

计算机网络微课堂学习笔记(详细图解讲解)-长期更新

前言&#xff1a; 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施&#xff0c;计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 一、因特网概述 &#xff08;1&#xff09;网络、…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序&#xff0c;ChatGPT通过大量来自互联网的文本进行训练&#xff0c;并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且&#xff0c;ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…

ngsoc使用指南

和威胁告警差不多。 ngsoc是以资产为核心&#xff0c;以安全事件为管理的关键流程&#xff0c;建立一套威胁检测&#xff0c;相应&#xff0c;预测&#xff0c;和持续监控分析&#xff0c;一体化的监控与相应平台。 和天眼的区别&#xff1a;会把天眼的告警&#xff0c;其他安…

【041】从零开始:逐步学习使用C++ STL中的stack容器

从零开始&#xff1a;逐步学习使用C STL中的stack容器 引言一、stack容器概述二、stack容器常用API2.1、构造函数2.2、赋值操作2.3、数据存取操作2.4、大小操作 三、使用stack容器实现一个高效的算法总结 引言 &#x1f4a1; 作者简介&#xff1a;一个热爱分享高性能服务器后台…

安达发|如何选择更适合我们的APS高级排程软件

如何选择aps高级排程公司更适合我们?在选购aps高级排程的时候&#xff0c;一些朋友由于不清楚其中的选购技巧&#xff0c;许多时候会掉入些许选择误区&#xff0c;导致我们买不了合适我们选择的aps高级排程。因此选择适合我们的aps高级排程就变得十分重要&#xff0c;唯有明白…

23.JavaWeb-集群+Nginx+JMeter

1.集群概念 平时用的服务是的并发量是有限的&#xff0c;像tomcat只有不到500的并发量&#xff0c;不能满足高并发的需求&#xff0c;因此就采用了集群的方法&#xff0c;用多个服务器 当用户请求集群系统时&#xff0c;集群给用户的感觉就是一个单一独立的服务器&#xff0c;而…

项目中使用拆分数据库的优势

为什么要拆分数据库&#xff1f; 取决于数据库的负载和数据量。 单体项目在构建之初&#xff0c;数据库的负载和数据量都不大&#xff0c;所以不需要对数据库做拆分&#xff0c;小型财务系统、文书系统、ERP系统、OA系统&#xff0c;用一个MySQL数据库实例基本就够用了。 就…

重绘 ( Repaint) 和回流 ( Reflow)

重绘 ( Repaint) 和回流 ( Reflow) 首先了解 重绘 ( Repaint) 和回流 ( Reflow)其实是关乎到浏览器性能的问题 重绘和回流是渲染步骤中的⼀⼩节&#xff0c;但是这两个步骤对于性能影响很大 重绘和回流的过程都需要浏览器耗费大量的计算资源&#xff0c;过多的使用会导致网页性…