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

这篇具有很好参考价值的文章主要介绍了Spring Cloud第二季--服务网关Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Gateway和Zuul的区别

Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。Spring Cloud Gateway能干嘛呢?
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紧密集成拥有更好的开发体验。

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

二、Gateway的核心概念

Route(路由)

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

Predicate(断言)

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

Filter(过滤)

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

如图Gateway官网所示的工作流程:
Spring Cloud第二季--服务网关Gateway

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

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

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

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

三、小试牛刀

3.1、代码测试

使用SpringCloud Gateway测试之前,要开启Eureka Server,两个Eureka Client,请求调用过程如下:
Spring Cloud第二季--服务网关Gateway

新建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。

Spring Cloud第二季--服务网关Gateway
测试调用:

Spring Cloud第二季--服务网关Gateway
这个请求,从网关成功调用到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();
    }

}

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

3.2、关于Predicate

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

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

3.3、关于Filter

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

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

Filter分为全局Filter和GatewayFilter ,其中GatewayFilter有近30种,常用的GatewayFilter在yml中针对单个route配置即可。
Spring Cloud第二季--服务网关GatewayGlobalFilter,可以自定义类实现 GlobalFilter,Ordered 接口,

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

/**
 * @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;
    }
}

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

控制台打印

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

这两部分可参考官网Spring Cloud Gateway,配合具体业务使用。文章来源地址https://www.toymoban.com/news/detail-438006.html

到了这里,关于Spring Cloud第二季--服务网关Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Eureka上集成Spring Cloud 微服务网关 gateway

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中

    2024年02月08日
    浏览(47)
  • 【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

    目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关

    2023年04月16日
    浏览(55)
  • Spring Cloud Gateway 服务网关的部署与使用详细介绍

    1、什么是服务网关:         传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工

    2024年02月02日
    浏览(48)
  • Spring Cloud Gateway:打造可扩展的微服务网关

    🎉欢迎来到架构设计专栏~Spring Cloud Gateway:打造可扩展的微服务网关 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限

    2024年02月08日
    浏览(72)
  • Spring Cloud Gateway - 新一代微服务API网关

    如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关? 因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要

    2024年02月16日
    浏览(50)
  • Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

    主要是为了让 k8s 识别到网关项目已经就绪,但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践,因为 Gateway 的设计初衷是专注于路由和过滤,而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以下方式进行(可根据实际需求进行扩

    2024年01月17日
    浏览(49)
  • Spring Cloud Alibaba全家桶(十)——微服务网关Gateway组件

    本文小新为大家带来 微服务网关Gateway组件 相关知识,具体内容包括 微服务网关Gateway组件 (包括: Gateway核心概念 , Gateway工作原理 ), Spring Cloud Gateway环境搭建 , 路由断言工厂(Route Predicate Factories)配置 , 过滤器工厂( Gateway Filter Factories)配置 , 全局过滤器(Glob

    2023年04月08日
    浏览(49)
  • 【使用Spring Cloud Gateway构建微服务网关】—— 每天一点小知识

    ·                                                                         💧 使用 S p r i n g C l o u d G a t e w a y 构建微服务网关 color{#FF1493}{使用Spring Cloud Gateway构建微服务网关} 使用 Sp r in g Cl o u d G a t e w a y 构建微服务网关 💧        

    2024年02月10日
    浏览(63)
  • Spring Cloud Gateway:新一代微服务 API 网关,用起来真优雅!

    如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关? 因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要

    2024年02月09日
    浏览(51)
  • Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月06日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包