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日
    浏览(64)
  • Spring Cloud Alibaba全家桶(十)——微服务网关Gateway组件

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

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

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

    2024年02月09日
    浏览(46)
  • 【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日
    浏览(46)
  • spring cloud gateway网关(一)之网关路由

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

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

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

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

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

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

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

    2024年02月08日
    浏览(42)
  • 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日
    浏览(48)
  • 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)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包