SpringCloud网关——GateWay

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

GateWay

本专栏学习内容来自尚硅谷周阳老师的视频

有兴趣的小伙伴可以点击视频地址观看

概述

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

三大核心概念

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

  • Predicate(断言):参考的是Java8的java.util.function.Predicate

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

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

GateWay工作流程

借用官网的一张图和介绍,应该没有能比官网讲的更清楚的了

SpringCloud网关——GateWay

入门配置

先搭建服务,无需启动类,只需要注册到Eureka就行

pom文件

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

   <!--eureka-client-->
   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>
   <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
      <groupId>com.yellowstar.springcloud</groupId>
      <artifactId>cloud-api-commons</artifactId>
      <version>1.0-SNAPSHOT</version>
   </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
   </dependency>
</dependencies>

配置文件

server:
  port: 9527
  
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

主启动类

@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GateWayMain9527.class, args);
    }
}

通过配置文件配置

接下来我们想实现一个功能,平时都是通过http://localhost:8001/payment/lb来访问8001支付服务,现在我们不想把真实地址暴露,想通过9527进行代理

修改配置文件

加上关于gateway配置即可

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_route # 路由的id,没有固定规则但是要求唯一,建议配合服务名
          uri: http://localhost:8001 # 匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/** # 断言,路径匹配进行路由
        - id: payment_route2 # 路由的id,没有固定规则但是要求唯一,建议配合服务名
          uri: http://localhost:8001 # 匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/** # 断言,路径匹配进行路由

通过Bean配置

除了配置文件配置的方式以外,我们还可以通过代码中注入RouteLocator的Bean来进行配置

现在的需求是通过9527服务,代理到https://news.sina.com.cn/china

这样我们就可以通过localhost:9527/china来访问新浪新闻啦

@Configuration
public class GateWayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("news_sina_china",r -> r
                .path("/china") // 等同于predicates 访问路径localhost:9527/china
                .uri("https://news.sina.com.cn/china/")); //实际访问路径
        return routes.build();
    }
}

通过微服务名实现动态路由

无论是通过配置文件还是Bean方式配置网关转发地址时,我们都是讲地址写死的,不利于扩展,包括在微服务的架构下,往往都需要实现负载均衡,那么就需要实现动态路由。

修改配置文件

默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能,以lb为前缀可以实现负载均衡。

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 开启从服务中心动态创建路由功能,实现动态路由
      routes:
        - id: payment_route 
#          uri: http://localhost:8001 
          uri: lb://CLOUD-PAYMENT-SERVICE # 匹配后提供服务的路由地址 lb表示负载均衡
          predicates:
            - Path=/payment/get/**
        - id: payment_route2 
#          uri: http://localhost:8001 
          uri: lb://CLOUD-PAYMENT-SERVICE # 匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/** 

Predicate的使用

概念

简单通俗来讲,这就是一个断言的作用,例如之前使用的Path=/payment/get/** 作用是:只要收到路径为/payment/get/**的请求,都将他转发到http://localhost:8001 下对应的请求(这里为了方便理解,就不使用服务名称来做路由地址)

而除了通过路径匹配之外,GateWay还为我们提供了多种匹配方式,详细可见 中文文档

使用

官方例子很多,咱们挑几个来学习一下

After

After 路由谓词工厂需要一个参数,即一个日期时间(这是一个java ZonedDateTime)。这个谓词匹配发生在指定日期时间之后的请求。

例如以下配置,表示该请求必须发生在2023年4月19日9点之后才能正常访问

spring:
  cloud:
    gateway:
      routes:
        - id: payment_route2 # 路由的id,没有固定规则但是要求唯一,建议配合服务名
          uri: http://localhost:8001 # 匹配后提供服务的路由地址
          predicates:
            - After=2023-04-19T09:00:00.000+08:00[Asia/Shanghai]
Cookie

Cookie 路由谓词工厂接受两个参数,即 cookie name 和一个 regexp(这是一个Java正则表达式)。这个谓词匹配具有给定名称且其值符合正则表达式的cookie。

例如以下配置,表示该请求cookie中必须带有username=yellowstar才能正常访问

spring:
  cloud:
    gateway:
      routes:
        - id: payment_route2 # 路由的id,没有固定规则但是要求唯一,建议配合服务名
          uri: http://localhost:8001 # 匹配后提供服务的路由地址
          predicates:
            - Cookie=username, yellowstar

SpringCloud网关——GateWay

Query

Query 路由谓词工厂需要两个参数:一个必需的 param 和一个可选的 regexp(这是一个Java正则表达式)。下面的例子配置了一个 query 路由谓词。

例如以下配置,表示该请求必须带有参数id为正数才能正常访问

spring:
  cloud:
    gateway:
      routes:
        - id: payment_route2 # 路由的id,没有固定规则但是要求唯一,建议配合服务名
          uri: http://localhost:8001 # 匹配后提供服务的路由地址
          predicates:
            - Query=id,\d+

SpringCloud网关——GateWay

Filter的使用

概念

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

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

他与Predicate最大的不同在于可以修改HTTP请求和返回的HTTP响应,而Predicate只能进行匹配。

使用

官方的过滤器有很多,咱们就不一一介绍,有需要的同学可以查看 中文文档

咱们具体来讲讲自定义过滤器的使用,实际开发中也是自定义用的居多。

自定义过滤器要实现两个接口

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if (username == null) {
            log.error("用户名不存在");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

如果我们带有参数访问则可以成功,反之回报我们定的错误码

SpringCloud网关——GateWay

SpringCloud网关——GateWay文章来源地址https://www.toymoban.com/news/detail-422003.html

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

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

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

相关文章

  • springcloud-网关(gateway)

    Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为其提供跨领域的关注,如:安全、监控/指标和容错 Route(路由) : 网关的基本构件。它由一个 ID 、一个目的地 URI 、一个谓词( Predicate )集合和一个过滤器( Filter )集合定义。如果集合谓词为真,则路由被

    2024年02月21日
    浏览(38)
  • SpringCloud网关——GateWay

    本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 SpringCloud Gatewa

    2023年04月23日
    浏览(37)
  • springcloud(gateway网关)

    目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在

    2024年02月07日
    浏览(35)
  • springcloud Gateway网关

    地址:https://github.com/13thm/study_springcloud/tree/main/days9_Gateway Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等 prin

    2024年01月24日
    浏览(45)
  • 04.SpringCloud网关-gateway

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。‘ 在SpringCloud中网关的实现包括两种: gateway zuul Zuul是基于Servlet的实

    2024年02月02日
    浏览(39)
  • SpringCloud:Gateway服务网关

    网关(Gateway)是将两个使用不同协议的网络段连接在一起的设备。 网关的作用就是对两个网络段中的使用不同传输协议的数据进行互相的翻译转换。 创建服务 导入依赖 编写启动类 添加配置 Route Predicate Factories :: Spring Cloud Gateway 对所有路径都生效 全局过滤器的作用也是处理

    2024年02月01日
    浏览(59)
  • 【SpringCloud-5】gateway网关

    网关是干啥用的就不用再说了。 sringcloud中的网关,第一代是zuul,但是性能比较差(1.x是阻塞式的,2.x是基于Netty的),然后有了第二代GateWay,基于Reactor模型 异步非阻塞。  springcloud网关就是一系列的filter,在请求到达真实服务的前后,进行拦截处理。   GateWay 核⼼逻辑:路

    2024年02月09日
    浏览(37)
  • SpringCloud.03.网关Gateway

    目录  网关Gateway的概念: 准备 使用 方式一 因为配置了网关所以可以直接通过gateway发送请求 方式二 修改配置前:http://localhost:8082/provider/run 方式三(动态路由) 导入配置类 Spring Cloud Gateway 是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技术开发的网 关 旨在为微服务

    2024年02月01日
    浏览(37)
  • SpringCloud-网关 Gateway

      官方地址:SpringCloud Gateway   网关统一了服务的入口,可以方便实现对众多服务接口进行管控,对访问服务的身份认证,防报文重放与防数据篡改,功能调用的业务鉴权,响应数据的脱敏,流量与并发控制,甚至基于API调用的计量或者计费等等。更通俗理解,网关可以

    2024年02月04日
    浏览(32)
  • springcloud~gateway网关

    有时间,我们在搭建微服务时,总希望拿一个比较单纯的,没有污染其它代码的项目来从头开始做,今天我们来建设一个最简单的,gateway项目,它被注册到nacos里,路由配置也存到nacos里,动态实现更新配置功能。 版本:com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0

    2024年02月06日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包