Spring Gateway的入门概述及主要功能

 更新时间:2024年04月29日 14:26:46   作者:易秋之  
Spring Gateway是Spring Cloud微服务生态下的网关组件,网络层使用了基于非阻塞的 Netty使用异步IO增加了系统的性能,Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,这篇文章主要介绍了Spring Gateway的入门概述简介,需要的朋友可以参考下

1. 为什么要有网关

在微服务中,一般都会把相对独立的业务或者功能划分成一个独立的服务,做到业务或者功能之间的隔离,分开部署。但是在请求到这些正式的服务的时候一般会有一些预前的处理,比如:权限校验,流量控制,灰度发布等。如果这些都在各自的服务中去做,势必会增加这些基础功能的维护成本。总之就是需要有一种前置的组件去做公共的功能逻辑。

2. Spring Gateway

Spring Gateway 是 Spring Cloud 微服务生态下的网关组件,网络层使用了基于非阻塞的 Netty使用异步IO增加了系统的性能。Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,本质上是一个 Spring Boot 应用。

主要功能

  • 请求路由-最主要的功能

根据请求本身的属性把请求转发到不同的微服务,使网关能够根据请求的 header、路径、参数、协议等属性将其转发到对应的服务。

  • 服务发现-基础功能

网关是微服务环境的请求入口。支持服务发现能使网关在转发请求到目标服务时充分利用服务注册中心动态管理服务实例的优势,在配置路由转发的目标地址时也会更加方便

  • 修改请求响应

网关在收到外部请求,将其转发到目标服务之前,可以根据需求对请求进行修改,比如果更改请求 header、参数等。类似地,也可以在获取到业务服务响应之后,返回给用户前对响应进行修改。

  • 前置业务处理-权限校验

某些业务场景在处理用户请求时需要先对用户进行权限校验,这部分逻辑也可以由网关来负责。请求在到达网关时,由网关根据请求要访问的业务接口先对用户鉴权,只有校验通过的请求才会转发到对应的服务,而校验不通过的请求会被网关直接拒绝。这样做能够把拒绝无效请求这一步提前到网关这一层,减少无效的流量进入到业务服务。

  • 限流熔断

网关可以通过添加限流、熔断等机制来对业务服务起保护作用,提升系统整体的可用性。根据业务服务的吞吐量,网关可以限制转发到该服务的请求数量,超出限制的请求直接拒绝或降级,这样可以避免因为过多的请求导致业务服务负载过高的情况。当业务服务异常时,还可以通过熔断的方式到达快速失败的效果。

  • 请求重试

对于一些幂等的请求,当网关转发目标服务失败时,可以在网关层做自动重试。对于一些多实例部署服务,重试时还可以考虑把请求转发到不同的实例,以提高请求成功的概率。

  • 响应缓存

当用户请求获取的是一些静态的或更新不频繁的数据时,一段时间内多次请求获取到的数据很可能是一样的。对于这种情况可以将响应缓存起来。这样用户请求可以直接在网关层得到响应数据,无需再去访问业务服务,减轻业务服务的负担。

  • 响应聚合

某些情况下用户请求要获取的响应内容可能会来自于多个业务服务。网关作为业务服务的调用方,可以把多个服务的响应整合起来,再一并返回给用户。

  • 监控统计

因为网关是请求入口,所以在网关这一层可以方便地对外部的访问请求做监控和统计,同时还可以对业务服务的响应做监控,方便发现异常情况。

  • 灰度发布

网关可以用来做服务流量的灰度切换。比如某个业务服务上线了新版本,那可以在网关这一层按照灰度策略,把一部分请求流量切换到新版本服务上,以达到验证新版本业务服务的功能和性能的效果。

  • 异常响应处理

对于业务服务返回的异常响应,可以在网关层在返回给用户之前做转换处理。这样可以把一些业务侧返回的异常细节隐藏,转换成用户友好的错误提示返回。

3. 路由配置

路由是 Gateway 的核心构件,不同的路由根据匹配条件可以处理不同类型的请求,并转发到对应的目标服务。一个路由由以下几个属性组成
Id: 路由 ID。
Uri: 转发请求的目标地址。
Order: 顺序(优先级)。
Predicate: 匹配条件。
Metadata: 额外的元数据。

多个 Predicates 会合并成一个聚合的条件。Filters: 路由过滤器。这些过滤器最终会和全局过滤器一起排序处理匹配成功的请求。

Spring Cloud Gateway 本身提供了很多 Predicate 和 Filter 的实现,一些基本的功能可以通过这些现成的 Predicate 和 Filter 配置实现。
4. 实操

代码配置:

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
  return builder.routes()
  //第一个配置
    .route(r -> r.host("**.abc.org").and().path("/image/png")
        .filters(f ->
            f.addResponseHeader("X-TestHeader", "foobar"))
        .uri("http://foo.org:80")
    )
   // 第二个配置
    .route(r -> r.path("/image/webp")
        .filters(f -> f
            .addRequestHeader("X-TestHeader", "baz")
            .addRequestParameter("test-param", "value"))
        .uri("http://bar.org:80")
        .metadata("key", "value")
    )
    .build();
}

配置文件配置

spring:
  cloud:  
        gateway:
            discovery:
                locator:
                enabled: true
            routes:
            - id: activity-route
             uri: lb://activity
             predicates:
                - Path=/activity/**
                filters:
                - StripPrefix=1

注意: Gateway默认转发是全路径的,设置StripPrefix=1表示从二级url路径转发,即http://localhost:port/activity/test将会转发到http://{activity}/test

4. 总结

Spring Cloud Gateway 是 Spring Cloud 微服务生态中的 Gateway 组件。作为 Spring Cloud Zuul 的替代,Gateway 采用了性能的更高的 Netty 作为网络层服务器。Gateway 本身提供了很多常用的 Predicates 和 Filters 实现,能满足大部分常见需求。同时 Gateway 也支持 Spring Cloud 生态下其他组件如 Eureka 等的交互,使用起来非常方便。

参考资料:

https://blog.csdn.net/Extraordinarylife/article/details/115168526

到此这篇关于Spring Gateway的入门概述简介的文章就介绍到这了,更多相关Spring Gateway入门内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java搜索与图论之DFS和BFS算法详解

    Java搜索与图论之DFS和BFS算法详解

    DFS指在进行算法运算时,优先将该路径的当前路径执行完毕,执行完毕或失败后向上回溯尝试其他途径。BFS指在进行算法运算时,优先将当前路径点的所有情况罗列出来,然后根据罗列出来的情况罗列下一层。本文介绍了二者的实现与应用,需要的可以参考一下
    2022-11-11
  • autoMapping和autoMappingBehavior的区别及说明

    autoMapping和autoMappingBehavior的区别及说明

    这篇文章主要介绍了autoMapping和autoMappingBehavior的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现统计在线人数功能的方法详解

    Java实现统计在线人数功能的方法详解

    很多人在笔试或者面试中问到:现在要你实现一个统计在线人数的功能,你该怎么设计?不知道的朋友,这篇文章就来告诉你具体实现方法
    2022-08-08
  • java开发非公平锁不可打断源码示例解析

    java开发非公平锁不可打断源码示例解析

    这篇文章主要为大家介绍了java开发非公平锁不可打断源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • spring拓展之如何定义自己的namespace

    spring拓展之如何定义自己的namespace

    这篇文章主要介绍了spring拓展之如何定义自己的namespace方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java Web开发防止多用户重复登录的完美解决方案

    Java Web开发防止多用户重复登录的完美解决方案

    在web项目开发中,很多情况下都可以让同一个账号信息在不同的登录入口登录很多次,这样子做的不是很完善。一般解决这种情况有两种解决方案,小编呢主要以第二种方式给大家介绍具体的实现方法,对java web 防止多用户重复登录的解决方案感兴趣的朋友一起看看吧
    2016-11-11
  • Spring常用注解汇总

    Spring常用注解汇总

    这篇文章主要介绍了Spring常用注解汇总,需要的朋友可以参考下
    2014-08-08
  • 浅谈String类型等值比较引起的“==”、“equals()”和“hashCode”思考

    浅谈String类型等值比较引起的“==”、“equals()”和“hashCode”思考

    这篇文章主要介绍了浅谈String类型等值比较引起的“==”、“equals()”和“hashCode”思考。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot使用国产加密算法方式,sm2和sm3加解密demo

    springboot使用国产加密算法方式,sm2和sm3加解密demo

    这篇文章主要介绍了springboot使用国产加密算法方式,sm2和sm3加解密demo,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 关于SpringBoot集成Lettuce连接Redis的方法和案例

    关于SpringBoot集成Lettuce连接Redis的方法和案例

    这篇文章主要介绍了关于SpringBoot集成Lettuce连接Redis的方法和案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论