SpringCloud入门实战(八)- Gateway服务网关集成

news2024/12/23 8:06:10

📝 学技术、更要掌握学习的方法,一起学习,让进步发生
👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。
💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。
💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。
❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。

👉🏻 👉🏻 👉🏻 SpringCloud 入门实战系列不迷路 👈🏻 👈🏻👈🏻:

  • SpringCloud 入门实战(一)什么是SpringCloud?
  • SpringCloud 入门实战(二)-SpringCloud项目搭建
  • SpringCloud 入门实战(三)-Eureka注册中心集成
  • SpringCloud入门 实战(四)-Zookeeper、Consul注册中心集成
  • SpringCloud入门实战(五)-Ribbon负载均衡集成
  • SpringCloud入门实战(六)-OpenFeign服务调用集成
  • SpringCloud入门实战(七)-Hystrix入门简介
  • SpringCloud入门实战(七)-Hystrix服务降级
  • SpringCloud入门实战(七)-Hystrix服务熔断
  • SpringCloud入门实战(七)-Hystrix服务限流
  • SpringCloud入门实战(七)-Hystrix Dashboard图形化监控
  • SpringCloud入门实战(八)-Gateway服务网关集成

文章目录

  • 一、Gateway是什么?
  • 二、Spring Cloud Gateway 与 Zuul的区别(选型问题)
  • 三、Spring Cloud Gateway特性
  • 四、Gateway三大概念与工作流程
    • 1、重要概念(路由、断言、过滤)
    • 2、工作流程(核心:路由转发+执行过滤链)
  • 五、Gateway项目集成与配置
  • 六、Gateway动态路由
  • 七、Gateway的Predicate
  • 八、Gateway的Filter

一、Gateway是什么?

Gateway关键特性:路由、断言、过滤。

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

Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代Zuul。

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关,在SpringCloud Finchley 正版之前,Spring Cloud 推荐的网关是 Netflix 提供的Zuul,但在2.x版本中,SpringCloud最后自己研发了一个网关Gateway替代Zuul。

在Spring Cloud 2.0以上版本中,没有对新版本Zuul2.0以最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud gateway,其于WebFlux框架实现的,而WebFlux框架底层,则使用了高性能的Reactor模式通讯框架Nettey。

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

Spring WebFlux 是 Spring 5.0 引入的新的响应式框架,区别于 Spring MVC,它不需要依赖Servlet API,它是完全异步非阻塞的,并且基于 Reactor 来实现响应式流规范。
Spring WebFlux官网信息

二、Spring Cloud Gateway 与 Zuul的区别(选型问题)

1、Zuul 1.x,是个其于阻塞I /O的API Gateway

2、Zuul 1.x 基于Sevlet 2.5使用阻塞架构。它不支持任何长连接(如 WebSocket) Zuul 的设计模式和Nginx较像,每次 I /O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx 用C++ 实现,Zuul 用Java 实现,而 JVM 本身会有第一次加载较慢的情况,便得Zuul 的性能相对较差。

3、Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,SpringCloud目前还没有整合。Zuul 2.x的性能较 Zuul 1.x 有较大提在性能方面,根据官方提供的基准测试,Spring Cloud Gateway 的 RPS (每秒请求数) 是Zuul的1.6倍。

4、Spring Cloud Gateway 建立在 Spring Framework 6、 Project Reactor 和 Spring Boot 3之上,使用非阻塞API。Gateway是基于异步非阻塞模型上进行开发的,所以性能好,虽然Netflex发布了最新的Zuul2,但SpringCloud没有整合的计划。

5、Spring Cloud Gateway还支持 WebSocket,并目与Spring紧密集成拥有更好的开发体验。

6、通过官网可知:Zuul1.0已经进入了维护阶段,而Gateway是SpringCloud团队研发的,值得信赖。

Netflex 公司的zuul,官网地址:zuul官网

Spring社区的Gateway,官网地址:Gateway官网。
在这里插入图片描述

两者都是网关。Netflex 的zuul本来要升级,核心人员跳槽了,另一方面zuul升级到zuul2分歧大,导致zuul不维护了,zuul2研发中,于是等不及了,Spring社区出现了新一代网关技术Gateway,所以我们接下来主要学习Gateway。

三、Spring Cloud Gateway特性

通过官网可知,Spring Cloud Gateway有如下特性:

  • (3.x版本以下)基于Spring Framework5,Project Reactor和 Spring Boot 2.0进行构建;
    (目前最高版本4.x版本)基于Spring Framework6,Project Reactor和 Spring Boot 3.0进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 可以对路由指定Predicate(断言)和Filter(过滤器);
  • 集成Hystrix的断路器功能;
  • 集成Spring Cloud服务发现功能;
  • 易于编写的Predicate(断言)和Filter(过滤器);
  • 请求限流功能;
  • 支持路径重写;

四、Gateway三大概念与工作流程

1、重要概念(路由、断言、过滤)

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

2)Predicate(断言):
参考java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头、请求参数),如果请求与断言相匹配则进行路由。

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

web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前和后,通过Filter进行一些精细化控制和管理,predicate就是我们的匹配条件,有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

2、工作流程(核心:路由转发+执行过滤链)

从官网工作流程图可知:客户向 Spring Cloud Gateway 发出请求,然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。

Handler 再通过指定的过滤器链来将请求发这到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前 (“pre”) 或之后(“post”) 执行业务逻辑。

Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等。在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重更的作用。

五、Gateway项目集成与配置

具体项目集成可查看:SpringCloud Gateway网关集成与配置

六、Gateway动态路由

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

1、配置文件增加开启路由的配置

 discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由

2、将之前写死的uri换成微服务名称(注册中心上显示的服务名)

 uri: lb://cloud-payment #匹配后提供服务的路由地址

需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud​gateway在微服务中自动为我们创建的负载均衡uri

在这里插入图片描述

完整配置:

server:
  port: 9527

spring:
  application:
    name: cloud-gateway #微服务应用的名字
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://cloud-payment #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/timeout/**        # 断言,路径相匹配的进行路由
        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://cloud-payment #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由
eureka:
  client:
    register-with-eureka: true #向注册中心注册自己
    fetch-registry: true #从EurekaServer抓取已有的注册信息,集群必须设置成true,才能配合ribbon负载均衡
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: gateway9527 #主机名称修改
    prefer-ip-address: true #访问路径可以显示ip
    hostname: cloud-gateway-service

测试负载均衡效果, 8001/8002两个端口切换:

七、Gateway的Predicate

1、网关项目启动时,控制台可以看到有很多种类型的断言。我们上边演示的是Path类型。
在这里插入图片描述

Spring Cloud Gateway包括许多内置的Route Predicate工厂。
所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合。
Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。

2、 具体各种断言配置参考官网示例:
在这里插入图片描述

3、演示一种,以After为例:

//官网上美国时间,我们获取当前时间:
 public static void main(String[] args) {
        ZonedDateTime obj=ZonedDateTime.now();
        System.out.println(obj);
  }
输出:2023-06-06T15:36:36.892+08:00[Asia/Shanghai]
spring:
  application:
    name: cloud-gateway #微服务应用的名字
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://cloud-payment #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/timeout/**        # 断言,路径相匹配的进行路由
            - After=2023-06-06T15:36:36.892+08:00[Asia/Shanghai] #
        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: lb://cloud-payment #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由

After断言表示:在这个时间后,请求才有效果,在这个时间前,请求会404

八、Gateway的Filter

1、过滤器查看官网,37种之多(不常用)

在这里插入图片描述

参照官网添加相应的filters标签配置即可:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

2、查看官网,自定义过滤器10种之多(比较常用)


自定义全局GlobalFilter主要用于全局日志记录、统一网关鉴权等。
实现两个重要接口 GlobalFilter,Ordered,容器注入,即可。

代码示例:

package com.qytest.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;
@Component
@Slf4j
public class LogFilter implements GlobalFilter, Ordered {

    @Bean
    public GlobalFilter customFilter() {
        return new LogFilter();
    }
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("start global filter" + new Date());
        //假设请求参数没有username认为非法用户,打印在日志中
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if (username == null) {
            System.out.println("username 为空,非法用户!");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}


测试访问(不带username):http://localhost:9527/payment/ok/1
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS Sonoma 14.0 (23A5257q) Beta1 带 OC 引导双分区黑苹果镜像

6月6日&#xff0c;在WWDC2023开发者大会上&#xff0c;苹果带来了全新Mac系统&#xff0c;命名为macOS Sonoma。该系统最大的亮点是带来了小组件&#xff0c;macOS Sonoma可以添加手机上的所有小组件&#xff0c;包括车辆小组件。 镜像下载&#xff1a; 微信公众号&#xff1…

聚观早报 | 苹果发XR头显Vision Pro;英特尔将出售部分Mobileye股票

今日要闻&#xff1a;苹果发XR头显Vision Pro&#xff1b;英特尔将出售部分Mobileye股票&#xff1b;华为已申请注册两枚NETGPT&#xff1b;瑞幸咖啡全国门店数量突破1万家&#xff1b;iPhone15系列本月将在郑州富士康量产 苹果发XR头显Vision Pro 6 月 6 日&#xff0c;苹果 …

从零手写操作系统之RVOS环境搭建-01

从零手写操作系统之RVOS环境搭建-01 背景介绍操作系统的定义操作系统的分类典型的 RTOS 介绍课程系统RVOS简介 Hello WorldQEMU介绍QEMU-virt 地址映射 系统引导引导程序要做哪些事情如何判断当前hart是不是第一个hart?如何初始化栈? 如何在屏幕输出Hello World通过串口输出U…

基于java SpringBoot框架和Vue的智能停车场管理系统

近年来&#xff0c;中国不仅综合国力大幅提升&#xff0c;国民经济也快速增长&#xff0c;推动了中国汽车工业的发展。技术的飞速发展逐渐降低了汽车的制造成本&#xff0c;越来越受欢迎。今天&#xff0c;大多数家庭都有能力购买汽车&#xff0c;因此&#xff0c;中国城市的汽…

R语言手动绘制连续线条的校准曲线(Calibration curve)(4)

校准曲线图表示的是预测值和实际值的差距&#xff0c;作为预测模型的重要部分&#xff0c;目前很多函数能绘制校准曲线。 一般分为两种&#xff0c;一种是通过Hosmer-Lemeshow检验&#xff0c;把P值分为10等分&#xff0c;求出每等分的预测值和实际值的差距。 我们既往已经通…

基于组件化开发思想的微信小程序开发框架

跨端框架的出现为小程序应用的开发带来了巨大的便利性和灵活性。它们提供了统一的开发方式、代码复用的能力&#xff0c;并且与小程序容器技术紧密结合&#xff0c;实现了一次编码、多端运行的目标。开发者可以根据项目需求和团队技术栈选择合适的跨端框架&#xff0c;从而在不…

【大数据工具】Spark 伪分布式、分布式集群搭建

Spark 集群搭建 Spark 安装包下载地址&#xff1a;https://archive.apache.org/dist/spark/ 1. Spark 伪分布式安装 安装前提&#xff1a;安装 Spark 前需要先安装好 JDK 1. 上传并解压 Spark 安装包 使用 fileZilla 或其他文件传输工具上传 Spark 安装包&#xff1a;spar…

简单易懂的 nvm 和 Node.js 版本控制指南

NVM是Node.js的版本管理工具&#xff0c;可以方便地在不同版本的Node.js之间切换。它可以通过命令行或者脚本来管理Node.js的版本&#xff0c;支持在同一台机器上安装多个版本的Node.js&#xff0c;并能够方便地切换它们。 NVM的主要功能包括&#xff1a; 安装和卸载Node.js的不…

2022年国赛高教杯数学建模A题波浪能最大输出功率设计解题全过程文档及程序

2022年国赛高教杯数学建模 A题 波浪能最大输出功率设计 原题再现 随着经济和社会的发展&#xff0c;人类面临能源需求和环境污染的双重挑战&#xff0c;发展可再生能源产业已成为世界各国的共识。波浪能作为一种重要的海洋可再生能源&#xff0c;分布广泛&#xff0c;储量丰富…

DevExpress WinForms v23.1新功能抢先看——支持系统强调色更改

DevExpress WinForm 下一个主要版本&#xff08;v23.1&#xff09;将在6月份左右发布&#xff0c;本文将为大家介绍在早期访问预览版&#xff08;EAP&#xff09;中包含的新功能。 PS&#xff1a;DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具…

5月琐碎但值得的事情

转眼间时间就来到了6月份&#xff0c;又该写5月的思考总结了&#xff0c;依然记录一些5月份发生的小事或者收获&#xff0c; 这些内容本意给我记录生活的&#xff0c;如果对你有一些帮助就更好了。 往期&#xff1a; 1月的碎碎念&#xff0c;但是很有必要 二月的一些琐事&#…

chatgpt赋能python:Python如何阻止弹窗

Python如何阻止弹窗 Python是一种高级编程语言&#xff0c;它具有广泛的应用和丰富的库。它还可以被用于开发自动化程序&#xff0c;包括阻止弹窗。在本文中&#xff0c;我们将介绍如何使用Python阻止弹出窗口&#xff0c;并探讨防止弹窗的原因。 为什么要防止弹窗&#xff1…

Librosa库——语音识别,语音音色识别训练及应用

很多同学以为语音识别是非常难的&#xff0c;其实并不然&#xff0c;起初我也是这么认为&#xff0c;但后来发现语音识别是最简单的&#xff0c;因为同学们可能不知道Python有一个音频处理库Librosa&#xff0c;这个库非常的强大&#xff0c;可以进行音频处理、频谱表示、幅度转…

精彩回顾 | 来看 QTF 量化科技嘉年华上的 DolphinDB

6月2日至6月3日&#xff0c;2023“量变质变”量化科技嘉年华在上海世博中心圆满举办。 DolphinDB 作为联合主办方&#xff0c;在6月3日上午的“因子挖掘与机器学习”分论坛中&#xff0c;为广大量化粉丝们奉上了一场干货满满的主题分享与圆桌讨论&#xff0c;现场座无虚席&…

直击CACLP:新冠红利退潮,谁在裸泳,谁在冲刺?

5月可谓是很多医疗人马不停蹄的一个月&#xff0c;上海的第87届CMEF刚结束&#xff0c;28至30日&#xff0c;体外诊断&#xff08;IVD&#xff09;旗帜性行业盛会——第20届CACLP也在南昌绿地国际博览中心顺利落幕了。 纷享销客已经连续五年参与这两大行业盛会了&#xff0c;…

助力工业物联网,工业大数据之其他维度:组织机构【十五】

文章目录 01&#xff1a;其他维度&#xff1a;组织机构02&#xff1a;其他维度&#xff1a;仓库、物流附录一&#xff1a;常见问题1.错误&#xff1a;没有开启Cross Join2.错误&#xff1a;Unable to move source 01&#xff1a;其他维度&#xff1a;组织机构 目标&#xff1a;…

ChatGPT使用进阶,你一定要知道的应用技巧

鉴于ChatGPT的巨大能力&#xff0c;深入学习ChatGPT使用技巧势在必行。作为伴随着ChatGPT等大语言模型&#xff08;LLM&#xff09;出现的还有一个新的工程领域&#xff1a;提示工程&#xff08;Prompt Engineering&#xff09;。 提示工程&#xff08;Prompt Engineering&…

前端053_单点登录SSO_刷新令牌获取新令牌

刷新令牌获取新令牌 1、创建刷新令牌组件2、添加刷新组件路由配置3、EasyMock 添加刷新令牌接口4、定义 Api 调用刷新令牌接口5、Vuex 发送请求与重置状态6、重构刷新令牌组件7、测试当应用系统请求后台资源接口时,要在请求头带上 accessToken 去请求接口,如果 accessToken 有…

【Python】Python系列教程-- Python3 OS 文件/目录方法(二十七)

文章目录 前言语法错误异常异常处理try/excepttry/except...elsetry-finally 语句 抛出异常用户自定义异常定义清理行为预定义的清理行为 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&…

前端数据传输失败

1 问题 通过postman可用传输数据到java但页面数据传输不成功 postman结果&#xff1a; 页面传输结果&#xff1a; 2 方法 在使用页面传输数据时不能直接使用send(username,password)&#xff0c;我们需要使用FromData属性&#xff0c;将username和password添加到FromData里&…