SpringCloud之网关组件Gateway学习

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

SpringCloud之网关组件Gateway学习

GateWay简介

Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官方测试,Gateway是Zuul的1.6倍,旨在为微服务架构提供种简单有效的统⼀的API路由管理方式。Spring Cloud Gateway不仅提供统的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的式提供了网关基本的功能,例如:鉴权、
流量控制、熔断、路径重写、日志监控等。

Gateway相关概念

Gateway使用

在项目中引入Gateway的依赖,这里要注意的是Gateway不支持Spring boot web包,所以需要排除掉spring-boot-starter-web

        <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>

在微服务系统中,如果没有引入网关组件,用户的请求是直接请求到具体的服务的,而引入网关后,用户的请求会被网关组件处理,然后由网关组件将请求转发给具体的服务实例进行处理。网关组件也是一种服务,也需要被注册到Nacos等注册中心中。引入网关后的架构图如下所示:

SpringCloud之网关组件Gateway学习,JavaEE,spring cloud,gateway,学习,java,spring boot,spring

Gateway服务配置,这一部分配置和其它的服务没有区别,是和Nacos注册中心集成的配置

server:
  port: 10010 #网关端口
spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ

GateWay本身的配置如下:

spring:
  cloud:
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到,P需要大写,不然会报错
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**

然后在浏览器输入 http://localhost:10010/consumer/1,就可以访问到consumerservice服务了,这时因为GateWay服务将我们的请求根据配置的路由规则路由到了consumerservice。

路由断言工厂

路由断言工厂的作用是读取用户定义的断言条件,对请求作出判断。
我们上面的配置中的断言规则 Path=/user/** 只是字符串, 这些字符串会被Spring中的org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory处理的,类似的PredicateFactory在GateWay中还有很多。

名称 说明
After 某个时间之后的请求
Before 某个时间之前的请求
Between 某两个时间之间的请求
Cookie 请求必须包含某些cookie
Header 请求必须包含某些Header
Host 请求必须是访问某个host(域名)
Method 请求必须是指定方式
Path 请求路径必须符合指定规则
Query 请求参数必须包含指定参数
RemoteAddr 请求的ip必须是指定范围
Weight 权重处理

上面这些路由断言工厂的具体使用,可以参考官方的路由断言工厂示例

过滤器

GateWay Filter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
SpringCloud之网关组件Gateway学习,JavaEE,spring cloud,gateway,学习,java,spring boot,spring
Spring提供了31种不同的路由过滤器工厂,具体的使用可以参考官方的:

过滤器工厂官方示例

使用过滤器给请求添加一个请求头:

  cloud:
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:  #局部过滤器,只对某个服务起作用
          - AddRequestHeader=truth,This is a headr  #添加请求头

通过@RequestHeader注解来获取请求头的值
SpringCloud之网关组件Gateway学习,JavaEE,spring cloud,gateway,学习,java,spring boot,spring
在控制台输出了获取到的请求头
SpringCloud之网关组件Gateway学习,JavaEE,spring cloud,gateway,学习,java,spring boot,spring

如果想要过滤器对所有的路由都生效,可以把过滤器工厂写到default下

server:
  port: 10010 #网关端口
spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:
          - AddRequestHeader=truth,This is a headr  #添加请求头
      default-filters:
        - AddRequestHeader=truth,This is a headr1

前面提到的两种过滤器的过滤规则都是固定的,是框架给我们提供的;如果想要自定义过滤规则,则需要用到全局过滤器Global Filter。GateWay提供了GlobalFilter接口,只要我们实现这个接口就可以实现自定义的过滤器。重点是如何让过滤器链继续向下执行或者阻止过滤器链向下执行。下面是一个简单的全局过滤器示例:

/**
 * @author DELL
 * @version 1.0
 * @description
 * @date 2024/3/13 22:38:05
 */
@Order(value = 1)  #指定过滤器的执行顺序,值越小越先执行
public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();

        //获取
        String authorization = params.getFirst("authorization");

        //校验
        if ("admin".equals(authorization)) {
            //放行
            return chain.filter(exchange);
        }

        //拦截
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        
        return exchange.getResponse().setComplete();
    }

}

上面提到了三种过滤器,某个服务的过滤器(filters)、默认的过滤器(default-filters)、全局过滤器(GlobalFilter),如果三种过滤器都进行了配置,那么它们的执行顺序如下:

SpringCloud之网关组件Gateway学习,JavaEE,spring cloud,gateway,学习,java,spring boot,spring

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

CROS配置

Gateway中进行跨域的配置如下:文章来源地址https://www.toymoban.com/news/detail-842995.html

spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:
          - AddRequestHeader=truth,This is a headr  #添加请求头
      default-filters:
        - AddRequestHeader=truth,This is a headr1
        
      globalcors:  #跨域配置
        cors-configurations:
          '[/**]':
            allowedOrigins: "http://localhost:8090"  #允许哪些请求跨域
            allowedMethods:  #允许的跨域的请求方式
              - GET
            allowedHeaders: "*"   允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 36000 #跨域检测有效期

参考

  1. Gateway官方文档

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

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

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

相关文章

  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

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

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

    2023年04月08日
    浏览(50)
  • SpringGateway网关(Spring Gateway是Spring自己编写的,也是SpringCloud中的组件)

    目录 SpringGateway网关 奈非框架简介 什么是网关 网关的主要功能有 Spring Gateway简介 网关路由配置 动态路由 早期(2020年前)奈非提供的微服务组件和框架受到了很多开发者的欢迎 这些框架和SpringCloud Alibaba的对应关系我们要了解 现在还有很多旧项目维护是使用奈非框架完成的微

    2024年02月09日
    浏览(49)
  • 【Spring Cloud 八】Spring Cloud Gateway网关

    【Spring Cloud一】微服务基本知识 【Spring Cloud 三】Eureka服务注册与服务发现 【Spring Cloud 四】Ribbon负载均衡 【Spring Cloud 五】OpenFeign服务调用 【Spring Cloud 六】Hystrix熔断 【Spring Cloud 七】Sleuth+Zipkin 链路追踪 在项目中是使用了Gateway做统一的请求的入口,以及统一的跨域处理以及

    2024年02月12日
    浏览(48)
  • spring cloud gateway网关(一)之网关路由

    1、gateway相关介绍 在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。这种客户

    2024年02月08日
    浏览(41)
  • Spring Cloud 之 Gateway 网关

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

    2024年02月16日
    浏览(38)
  • 【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

    为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道,这就是我们需要服务网关的原因。 我们

    2024年02月11日
    浏览(47)
  • Spring cloud教程Gateway服务网关

    写在前面的话: 本笔记在参考网上视频以及博客的基础上,只做个人学习笔记,如有侵权,请联系删除,谢谢! Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提

    2024年02月08日
    浏览(45)
  • 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之API网关(Gateway)

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

    2024年02月08日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包