Spring Cloud第二季--服务网关Gateway

news2024/9/23 7:22:35

文章目录

  • 一、Gateway和Zuul的区别
  • 二、Gateway的核心概念
  • 三、小试牛刀
    • 3.1、代码测试
    • 3.2、关于Predicate
    • 3.3、关于Filter

一、Gateway和Zuul的区别

Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。Spring Cloud Gateway能干嘛呢?
在这里插入图片描述

Gateway是原zuul1.x版的替代。

Spring Cloud Gateway 与 Zuul的区别:

Zuul 1.x,是一个基于阻塞 I/ O 的 API Gateway,不支持任何长连接,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得Zuul 的性能相对较差。

Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。 Zuul 2.x的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1. 6 倍。

Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API。 支持 WebSocket, 并且与Spring紧密集成拥有更好的开发体验。

在这里插入图片描述

二、Gateway的核心概念

Route(路由)

路由是构建网关的基本模块,由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

Predicate(断言)

参考Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

Filter(过滤)

Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由之前或者之后对请求进行修改。

如图Gateway官网所示的工作流程:
在这里插入图片描述

①、客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。

②、Handler 通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

③、过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

注: 在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

三、小试牛刀

3.1、代码测试

使用SpringCloud Gateway测试之前,要开启Eureka Server,两个Eureka Client,请求调用过程如下:
在这里插入图片描述

新建model,添加pom依赖。GateWay属于SprinigCloud且有web依赖,在导入对应依赖时,要删除spring-boot-starter-web依赖

   <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--一般基础配置类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

添加application.yml文件:

server:
  port: 9527

spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      routes:
        - id: payment_route_one  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001
          uri: lb://CLOUD-PAYMENT-SERVICE  #匹配后提供服务的路由地址
          filters:                         #过滤器,在路由成功后匹配执行
            - AddRequestParameter=X_Test,777
          predicates:                   # 断言,路径相匹配的进行路由
            - Path=/payment/get/**

        - id: payment_route_two
          uri: lb://CLOUD-PAYMENT-SERVICE    #uri的协议为lb,表示启用Gateway的负载均衡功能。
          predicates:
            - Path=/payment/show/**

        - id: payment_route_three
          uri: http://localhost:8001
          predicates:
            - Path=/payment/lb/**

      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由


eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka




仔细分析一下配置中关于springcloud gateway的配置:

server:
  port: 9527

spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      routes:
        - id: payment_route_one  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://CLOUD-PAYMENT-SERVICE  #匹配后提供服务的路由地址
          filters:                         #过滤器,在路由成功后匹配执行
            - AddRequestParameter=X_Test,777
          predicates:                   # 断言,路径相匹配的进行路由
            - Path=/payment/get/**

routes 下面可以有多个路由配置,以id区分;每个路由有uri和predicates,表示当满足了predicates条件后,会成功路由到对应的uri;filters属性,增加了过滤器,表示在成功之后的路由中增加一个请求参数。

默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能uri的协议为lb,表示启用Gateway的负载均衡功能,lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri。

启动类添加@EnableEurekaClient注解,启动Eureka Server和两个Eureka Client。

在这里插入图片描述
测试调用:

在这里插入图片描述
这个请求,从网关成功调用到8001。

Spring Cloud Gateway的路由配置,还支持以Bean的方式。

@Configuration
public class GateWayConfig {

    @Bean
    public RouteLocator getRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("payment_get_route", r -> r.path("/payment/two/get/**").uri("http://localhost:8002")).build();
        return routes.build();
    }

    @Bean
    public RouteLocator showRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("payment_show_route", r -> r.path("/payment/two/show/**").uri("http://localhost:8002")).build();
        return routes.build();
    }

}

在这里插入图片描述

3.2、关于Predicate

Spring Cloud Gateway 包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。
Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway 包含许多内置的Route Predicate Factories。

在这里插入图片描述

3.3、关于Filter

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。

Filter分为全局Filter和GatewayFilter ,其中GatewayFilter有近30种,常用的GatewayFilter在yml中针对单个route配置即可。
在这里插入图片描述GlobalFilter,可以自定义类实现 GlobalFilter,Ordered 接口,

在这里插入图片描述

/**
 * @Auther: songweichao
 * @Date: 2023-04-18 17:58
 * @Description:该全局过滤器,表示在所有的路由进来后,检查是否带某个参数,若携带,则通过,否则不通过。
 */

@Configuration
public class MyGateWayFilter implements GlobalFilter,Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        System.out.println("现在时间:"+new Date()+"\t 执行了自定义的全局过滤器: "+"MyGateWayFilter");

        String uname = exchange.getRequest().getQueryParams().getFirst("cookie");

        if (uname == null) {
            System.out.println("cookie为null,拒绝请求");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder()
    {
        return 0;
    }
}

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

控制台打印

现在时间:Tue May 09 14:44:21 CST 2023	 执行了自定义的全局过滤器: MyGateWayFilter
现在时间:Tue May 09 14:44:47 CST 2023	 执行了自定义的全局过滤器: MyGateWayFilter
cookie为null,拒绝请求

这两部分可参考官网Spring Cloud Gateway,配合具体业务使用。

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

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

相关文章

ORACLE 10G版本数据库系统产生大量归档日志问题的分析

一、服务概述 近期接到用户告知数据库归档暴增&#xff0c;导致生产库归档空间满&#xff0c;手动删除后&#xff0c;归档空间很快就会满。 立即登陆数据库系统&#xff0c;查询发现归档日志异常增长&#xff0c;从以前的每小时产生300M&#xff0c;增长到每小时产生59150M。…

使用thop计算参数和FLOPs时的疑问

文章目录 使用thop计算参数时的疑问x x.view(-1, 32 * 8 * 8)和x x.view(x.size(0), -1)区别是什么input_shape (3, 224, 224)这个张量是什么意思为什么summary计算时没有批次大小input_tensor torch.randn(1, *input_shape).to(device)这句代码什么意思flops, params pro…

1AE4混合电路耳放

设计目标&#xff1a; 1&#xff09;20W以内的总功耗&#xff08;包括灯丝部分&#xff09;&#xff1b; 2&#xff09;最大输入1.2Vrms信号&#xff1b; 3&#xff09;输出至少50毫瓦的功率&#xff1b; 4&#xff09;至少5倍以上的阻尼系数。 1AE4是较后期的直热管&#xff0…

软件项目成本控制的5大关键点 不得不重视

软件项目成本一般分为运营成本和项目成本。而运营成本比较固定&#xff0c;压缩和削减的余地不大。而在项目成本中&#xff0c;最主要的成本是人工成本。那么如何提高项目开发效率&#xff0c;节约人工成本&#xff0c;对成本管理至关重要。 我们从以下几个影响项目成本的主要因…

[DeepSpeed]初代chatGPT模型部署实践

DeepSpeed Chat 部署方式 中间遇到很多坑&#xff0c;解决方法都写这里了DeepSpeed 部署中bug以及解决方法 环境 基于阿里云GPU 云服务器部署实践 操作系统版本&#xff1a; Ubuntu 18.04 GPU 驱动版本&#xff1a; 470.161.03 GPU 型号&#xff1a; A100-80G CPU &#…

投了上千简历,是Android岗位需求少?还是我的技术不行

作者&#xff1a;病鸡乱投医 作为一名Android开发人员&#xff0c;打开招聘网站是每天必做的事情。每次看到悬赏诱人的Android工程师职位&#xff0c;就想做个简历有技巧、能够吸引面试官的面面观。 然而&#xff0c;即使投了上千份简历&#xff0c;也迟迟没有找到理想的工作。…

makefile编译脚本,理解$@、$^和$<

一、理解 、 、 、^、$<的含义 Makefile中&#xff0c;格式为这样的 target : prerequisties 目标&#xff1a;需要依赖的条件 简单的工程直接这样 hello:hello.ccgcc hello.cc -o hello但如果文件多了呢&#xff1f;按部就班写会显得很长&#xff0c;所有这时候makefil…

惊现数据库误操作后,看这家银行如何打造“零盲区”运维安全

第三方运维人员数据库误操作致业务中断 堡垒机凸显短板 这家银行如何破局&#xff1f; 走在数字化转型前沿的银行业&#xff0c;不断增加的IT资产、业务系统&#xff0c;给IT运维提出了更高的挑战。银行运维的核心之一在于数据安全、系统稳定&#xff0c;面临着庞杂的运维场景…

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析 文章目录 【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析1. 准备工作2. 计算这些指标 &#xff08;5&#xff09;2.1 Accuracy&#xff08;准确率&#xff09;2.2 Recall&#xff08;召回率、查全率&#xff09;2.3 Pr…

【跟着陈七一起学C语言】今天总结:C语言的数组和指针

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

HR怎么看待PMP证书呢?

我们可以先了解一下各个公司对于PMP证书的一个观点 针对PMP证书&#xff0c;在HR看来&#xff0c;有这几个直观的感受和判断&#xff1a; 公司要求PMP优先&#xff0c;那我盯着这个看就行&#xff0c;没有就不要&#xff0c;省事儿招的多了也有一些基本了解&#xff0c;考到这…

【Linux】Linux环境下安装RocketMQ(图文解说详细版)

文章目录 一、简介二、MQ 下载三、JAVA 环境配置四、MQ 安装五、启动 MQ六、测试七、运行八、关闭 MQ 一、简介 消息队列中间件是分布式系统中的重要组件&#xff0c;主要解决应用耦合、流量削峰等问题&#xff0c;目前主流的 MQ 主要是&#xff1a;RocketMQ、kafka、RabbitMQ…

GRPC - JAVA笔记

GRPC - JAVA笔记 gRPC简介 由google开源的一个高性能的RPc框架&#xff0c;由google内部的Stubby框架演化而来。2015年正式开源。云原生时代的RPC标准&#xff0c;由Go语言开发 gRPC的核心设计思路 网络通信 ------> gRPC 自己封装了网络通信的部分&#xff0c;提供了多种…

zookeeper超详细安装集群部署

文章目录 一、zookeeper官网下载二、JDK环境安装三、zookeeper安装1.zookeeper解压2.zookeeper配置文件介绍 克隆服务器1.网络检查2.集群配置3.启动集群4.错误记录 一、zookeeper官网下载 下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/找到对应的版本下载 …

文章纠错免费软件-文字校对软件免费下载

自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;和机器学习&#xff08;Machine Learning&#xff09;技术的工具&#xff0c;可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…

如何优雅的白嫖ChatGPT

ChatGPT已经火了大半年了&#xff0c;但对于很多小伙伴来说想使用它还是有些麻烦&#xff0c;不仅需要稳定的漂亮国ip,还要冒着被封号的风险。 因此&#xff0c;本文介绍了两个白嫖ChatGPT的方式供大家使用&#xff08;亲测可用&#xff09;&#xff1a; Poe 地址(科学上网)…

入行IC|数字IC与模拟IC方向怎么选?(内附2023春招薪资对比)

很多同学想要入行IC&#xff0c;但不知道数字和模拟方向怎么选&#xff1f; 如果没有亲身体会过模拟设计&#xff0c;并有发自内心的自信或者兴趣&#xff0c;一般不看好纯小白去学模拟电路设计。 模拟设计想做好&#xff0c;没有数学功底&#xff0c;没有电路分析的功底&…

C++Primer第20章 iostream库

第20章 iostream库 C中的IO流是通过多继承和虚拟继承实现的,下面是它的关系. 我们要学习的就是三个库,这里我会把重点的拿出来 iostream: 终端操作fstream:文件操作sstream:格式化操作 20.1 输出操作符<< 输出操作符可以接受任何内置数据类型的实参,包含我们的const …

HTTP第六讲——键入网址再按下回车,后面究竟发生了什么?

使用 IP 地址访问 Web 服务器 首先我们运行 www 目录下的“start”批处理程序&#xff0c;启动本机的 OpenResty 服务器&#xff0c;启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark&#xff0c;选择“HTTP TCP port(80)”过滤器&#xff0c;再鼠标…

接口自动化测试神器:Python+Requests+Unittest让你的测试用例飞起来

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠 随着互联网的发展&#xff0c;越来越多的应用程序采用了分布式架构&#xff0c;并通过API接口进行数据交换。因此&#xff0c;接口自动化测试已经成为了保证软件质…