Spring Cloud 之 Gateway 网关

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

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,springSpring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

一、Gateway简介

Gateway官网:https://spring.io/projects/spring-cloud-gateway
Spirng Cloud 中网关的实现包括两种:

  1. gateway
  2. zuul

zuul是基于Servlet的实现,属于阻塞式编程,而Spring Cloud Gateway 则是基于Spring 5 中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:身份验证,权限效验,服务路由,负载均衡,请求限流。

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

二、Spring Cloud Gateway入门案例

本篇文章将介绍Spring Cloud Alibaba体系下Spring Cloud Gateway的搭建,服务注册中心和分布式配置中心使用Nacos

2.1 父工程依赖


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/>
    </parent>
    
	 <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
     </properties>

    <dependencyManagement>
        <!-- springCloud -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba是阿里巴巴集团针对服务开发所提供的一套解决方案 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.2 gateway网关搭建

2.2.1 pom依赖

    <dependencies>
        <!-- nacos作为注册中心的依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

2.2.2 yml配置

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: consumer-server # 路由id,自定义,只要唯一即可
#          uri: http://127.0.0.1:20087 # 路由的目标地址 http就是固定地址
          uri: lb://consumer-server # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/consumer/** # 这个是按照路径匹配,只要以/user/开头就符合要求
            - 
        - id: provider-server
          # uri: http://127.0.0.1:8081
          uri: lb://provider-server 
          predicates: 
            - Path=/provider/** 
  • 路由id : 路由的唯一标识
  • 路由目标(uri): 路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
  • `路由断言(predicates) : 判断路由的规则
  • 路由过滤器filters() : 对请求或响应做处理

2.2.3 可能存在的问题

启动报错
***************************
APPLICATION FAILED TO START
***************************

Description:

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.

Action:

Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

Exception in thread "main" java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration$SpringMvcFoundOnClasspathConfiguration': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration$SpringMvcFoundOnClasspathConfiguration]: Constructor threw exception; nested exception is org.springframework.cloud.gateway.support.MvcFoundOnClasspathException

产生原因
gateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突。

解决方案:

  1. 去除父工程中的 spring-boot-starter-web 这个依赖
  2. 或者如下排除
<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>
         <exclusion>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-webflux</artifactId>
         </exclusion>
     </exclusions>
</dependency>

如果uri使用lb负载均衡配置,可能会报错如下:

启动正常,调用可能会出现,没有可用的服务等信息

There was an unexpected error (type=Service Unavailable, status=503).

添加如下依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2.2.4 调用测试成功

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

未使用网关
Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring
使用网关10010端口调用

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

三、网关路由流程图

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

四、Nginx网关和GateWay网关的区别

  1. Nignx是流量网关,GateWay是业务网关

  2. 流量网关相当于访问的一个总入口,前端页面的一个容器,类似于防火。主要的功能有管理日志,流量监控,黑白名单,请求的负载均衡,全局限流等。

  3. 而业务网关是针对具体的后端应用和服务,主要的功能是缓存策略、鉴权策略等

  4. 一般流量网关配置在前,业务网关配置在后

  5. Nginx是C语言写的,GateWay是java语言写的

  6. GateWay主要是路由、断言和过滤器,利用这些可以做流控

  7. Nginx主要是负载均衡,反向代理,以及做web服务器

五、路由断言工厂

官网12种示例地址 : https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring
Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

六、过滤器工厂

6.1 GatewayFilter路由过滤器

官网示例地址 : https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理.。

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

6.2 默认过滤器

要对所有的路由都生效,则可以将过滤器工厂写到defalut下

spring:
  cloud:
    gateway:
      routes: # 网关路由配置
        - id: consumer-server # 路由id,自定义,只要唯一即可
#        .....
      default-filters:
        - AddRequestHeader=X-Request-red, blue

6.3 全局过滤器

全局过滤器,对所有路由生效。通过实现GlobalFilter接口创建

全局过滤器的作用是处理一切进入网关的请求和微服务响应,与GarewayFilter的作用一样
区别在于GatewayFilter通过配置定义,处理逻辑是固定的,而GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口
示例

@Order(-1)  //值越小,优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}

6.4 过滤器执行顺序

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring

  • 全局过滤器与其他2类过滤器相比,永远是最后执行的,它的优先级只对其他全局过滤器起作用,order 值越小,优先级越高,执行顺序越靠前
  • 路由过滤器和默认过滤器会按照order的值进行排序,这个值由 Spring 指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 的顺序执行

七、跨域问题

spring:
  cloud:
    gateway:
      # 。。。
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求 
              - "http://localhost:8090"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

Spring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,springSpring Cloud 之 Gateway 网关,Spring Cloud,spring cloud,gateway,spring文章来源地址https://www.toymoban.com/news/detail-589868.html

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

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

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

相关文章

  • Spring Cloud之API网关(Gateway)

    目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) filter分类 Pre 类型 Post 类型 网关过滤器 格式

    2024年02月08日
    浏览(51)
  • spring cloud gateway网关和链路监控

    文章目录 目录 文章目录 前言 一、网关 1.1 gateway介绍 1.2 如何使用gateway  1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二、Sleuth--链路追踪 2.1 链路追踪介绍 2.2 Sleuth介绍 2.3 使用 2.4 Zipkin的集成  2.5 使用可视化zipkin来监控微服务 总结 所谓的API网关,就是指系统的 统

    2024年02月02日
    浏览(38)
  • Spring Cloud第二季--服务网关Gateway

    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的区别: Zuu

    2024年02月03日
    浏览(52)
  • 微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

    在routes路由规则中,根据path去匹配,如果匹配中,就使用对应的路由规则进行请求转发 如果无法从routes中匹配,则根据path用“/”去截取第一段作为服务名进行请求转发,转发时,默认将第一段截取调 如果截取的服务名不在注册中心中存在服务,则报错404 在routes路由规则中

    2024年02月07日
    浏览(67)
  • Spring Cloud Gateway 网关实现白名单功能

    1 摘要 对于微服务后台而言,网关层作为所有网络请求的入口。一般基于安全考虑,会在网关层做权限认证,但是对于一些例如登录、注册等接口以及一些资源数据,这些是不需要有认证信息,因此需要在网关层设计一个白名单的功能。本文将基于 Spring Cloud Gateway 2.X 实现白

    2023年04月08日
    浏览(43)
  • Spring Cloud GateWay 网关的相关面试题

    Spring Cloud GateWay如何实现限流? 1.Spring Cloud GateWay使用令牌桶算法实现限流(Nginx使用漏桶算法实现限流 ) 2.Spring Cloud GateWay默认使用Redis 的RateLimter限流算法来实现,所以需要引入Redis依赖 3.使用的过程中,主要配置 令牌桶填充的速率,令牌桶容量,指定限流的key 4.限流的Ke

    2024年02月13日
    浏览(55)
  • Spring Cloud Alibaba 系列之 Gateway(网关)

    网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul1.0。相比 Zuul 来说,Spring Cloud  Gateway 提供更优秀的性能,更强大的有功能。 Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的

    2024年02月10日
    浏览(46)
  • 【Spring Cloud Alibaba】8.路由网关(Gateway)

    接下来对服务消费者添加路由网关来实现统一访问接口,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0 , Spring Boot 2.0 和 Project Reactor 等技术开发的网关,该项目提供了一个库,用于在 Spring W

    2023年04月24日
    浏览(40)
  • Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

            Spring Cloud Gateway官网:Spring Cloud Gateway         局域网中就有网关这个概念,局域网接收数据或发送数据都要通过网关,比如使用VMware虚拟机软件搭建虚拟机集群的时候,往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升我们系统的安

    2024年02月16日
    浏览(45)
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在

    2024年02月09日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包