【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

Spring Cloud Gateway简介

  • Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。
  • Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了Ribbon做负载均衡,以及默认使用Hystrix对网关进行保护,当然也可以选择其他的容错组件,例如Sentinel。

SpringCloud Gateway优点

  • 性能强劲:是第一代网关Zuul的1.6倍
  • 功能强大:内置了很多实用的功能,例如转发、监控、限流等
  • 设计优雅,容易扩展

SpringCloud Gateway缺点

  • 学习复杂度:其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,有一定的学习成本
  • 部署特殊性:不能在Servlet容器下工作,也不能构建成WAR包,即不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行,不支持Spring Boot 1.x,需2.0及更高的版本

核心概念

Route(路由)

Spring Cloud Gateway的基础元素,可简单理解成一条转发规则。包含:路由ID、目标URL、Predicate集合以及Filter集合。

Gateway路由配置案例:
spring:cloud:gateway:routes:- id: server-centeruri: lb://server-centerpredicates:- Path=/sample/cloud/v1/server-center/**filters:- StripPrefix=4
复制代码
Predicate(谓词)

即java.util.function.Predicate这个接口,Gateway使用Predicate实现路由的匹配条件

Filter(过滤器)

与我们平时使用的Servlet编程模型里的过滤器概念类似,同样可以用于修改请求以及响应数据,可以利用Filter实现鉴权、访问日志记录,接口耗时记录等功能

Spring Cloud Gateway架构图

流程介绍:

Gateway Client发送请求给Spring Cloud Gateway,Gateway Handler Mapping会判断请求的路径是否匹配路由的配置,如果匹配则会进入Gateway Web Handler,Web Handler会读取路由上所配置的过滤器,然后将该请求交给过滤器去处理,最后转发到路由配置的微服务上。

  • Gateway Client:泛指外部请求,例如浏览器、app、小程序等
  • Proxied Service:指的是被网关代理的微服务
相关源码:
  • Gateway Handler Mapping:org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping
  • Gateway Web Handler:org.springframework.cloud.gateway.handler.FilteringWebHandler

实际开发案例

创建Spring Cloud Gateway项目

这里使用IDEA的Spring Initializr进行项目的创建,到选择依赖这一步勾选gateway依赖,如下图:

网关组件一般都配合服务发现组件使用,我这里使用Nacos作为服务发现组件,具体的依赖如下(2.1.x为例):

<dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-gatewayartifactId>dependency><dependency><groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-actuatorartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency>
dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>Greenwich.SR2version><type>pomtype><scope>importscope>dependency><dependency><groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-alibaba-dependenciesartifactId><version>2.1.0.RELEASEversion><type>pomtype><scope>importscope>dependency>dependencies>
dependencyManagement>
复制代码

然后编写配置文件内容如下:

server:port: 8040
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: truemanagement:endpoints:web:exposure:include: '*'endpoint:health:show-details: always
复制代码

完成以上步骤后,我们来启动这个网关服务,进行一个简单的测试,看看是否能将请求正常地转发到指定的微服务上。

此时有一个名为server-center的微服务,该微服务有一个按id获取用户信息的接口,接口路径为/users/{id}。

若通过网关服务来访问这个接口,要如何做呢?很简单,gateway配合服务发现组件使用时,会有一个默认的转发规则,如下:

${GATEWAY_URL}/{微服务名称}/{接口路径}
复制代码

按该规则得出来的具体url为:localhost:port/server-center/users/{id},gateway可以根据url上的微服务名称将访问请求转发到该微服务上。

自定义路由的注意事项:

predicates配置项必须有,且必须配置一个及以上的Predicate,但不一定非要配置Path,可以配置其他的Predicate,例如After、Before等,此时Path的默认值为/**

路由配置的两种形式

Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务。

在这两种形式中,均支持访问路径的通配及精确匹配,在之前的示例中我们只使用了通配。这里将给出具体的配置示例,以此直观的了解这两种形式及不同匹配方式在配置上的区别。

路由到指定的URL

通配,使用通配符/**进行匹配,示例:

spring:cloud:gateway:routes:- id: test_routeuri: http://www.xxx.compredicates:- Path=/**
复制代码

该配置使访问 GATEWAY_URL/** 时会转发到 www.xxx.com/

精确匹配

配置具体的接口路径即可,示例:

spring:cloud:gateway:routes:- id: test_routeuri: http://www.xxx.com/user/order/detailpredicates:- Path=/user/order/detail
复制代码

该配置使访问 GATEWAY_URL/user/order/detail 时会转发到 ttp://www.xxx.com/user/order/…

路由到指定的微服务

通配,示例:

spring:cloud:gateway:routes:- id: server-centeruri: lb://server-centerpredicates:- Path=/**
复制代码

该配置使访问 GATEWAY_URL/** 时会转发到 server-center微服务的/** 精确匹配,示例:

spring:cloud:gateway:routes:- id: server-centeruri: lb://server-center/users/infopredicates:- Path=/users/info
复制代码

该配置使访问 GATEWAY_URL/users/info 时会转发到 server-center微服务的/users/info。

路由谓词工厂

前面提到过谓词是路由的判断条件,而路由谓词工厂就是作用到指定路由上的一堆谓词判断条件。在之前的示例里,我们就已经使用过路由谓词工厂了,就是自定义转发路径时所配置的Path。

内置的路由谓词工厂

Spring Cloud Gateway内置了众多路由谓词工厂,这些路由谓词工厂为路由匹配的判断提供了有力的支持,而我们之前所使用的Path就是内置的路由谓词工厂之一,用于判断当前访问的接口路径是否与该路由所配置的路径相匹配,若匹配则进行转发。

由于Gateway内置的路由谓词工厂比较多,篇幅有限就不在本文中介绍了,可以参考另一篇文章:

自定义路由谓词工厂

Spring Cloud Gateway内置了一系列的路由谓词工厂,但如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求。

例如有某个服务限制用户只允许在 09:00 - 17:00这个时间段内才可以访问,内置的路由谓词工厂是无法满足这个需求的,所以此时我们就需要自定义能够实现该需求的路由谓词工厂。

首先定义一个配置类,用于承载时间段的配置参数:

@Data
public class TimeBetweenConfig {/*** 开始时间*/private LocalTime start;/*** 结束时间*/private LocalTime end;
}
复制代码

然后定义一个路由谓词工厂,具体代码如下:


public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {public TimeBetweenRoutePredicateFactory() {super(TimeBetweenConfig.class);}public Predicate apply(TimeBetweenConfig config) {return exchange -> {LocalTime start = config.getStart();LocalTime end = config.getEnd();LocalTime now = LocalTime.now();return now.isAfter(start) && now.isBefore(end);};}public List shortcutFieldOrder() {return Arrays.asList("start", "end");}
}
复制代码

最后需要在配置文件中启用该路由谓词工厂,并且需要禁止gateway通过服务发现组件转发请求到其他的微服务,修改Gateway相关配置如下:

spring:cloud:gateway:discovery:locator:enabled: falseroutes:- id: server-centeruri: lb://server-centerpredicates:- TimeBetween=上午9:00,下午5:00
复制代码

可以看到这里主要是配置了我们自定义的路由谓词工厂类名的前缀以及允许访问的时间段,这个时间格式不是随便配置的,而是Spring Cloud Gateway的默认时间格式,相关源码如下:

org.springframework.format.support.DefaultFormattingConversionService
复制代码

时间格式是可以注册的,关于时间格式注册的相关源码如下:

org.springframework.format.datetime.standard.DateTimeFormatterRegistrar
复制代码
  • 这里之所以要禁止gateway通过服务发现组件转发请求到其他的微服务,是因为开启该配置项的话会导致我们自定义的路由谓词工厂不生效。
  • 不生效也是有原因的,开启该配置项会令Gateway优先将请求按照该配置项进行转发,那么我们自定义的路由就不会生效。

分享资源

资源分享
获取以上资源请访问开源项目 点击跳转

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

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

相关文章

Java 微服务当中POST form 、url、json的区别

在Java微服务的Controller中&#xff0c;你可以处理来自客户端的不同类型的POST请求&#xff0c;包括POST form、POST URL参数和POST JSON数据。以下是它们的区别以及在微服务Controller中的示例说明&#xff1a; POST Form 表单数据&#xff1a; 当客户端以表单方式提交数据…

SAP ABAP基础语法-内表篇(二)

十一、使用 SPLIT 直接拆分到内表&#xff1a; DATA: BEGIN OF auth_data OCCURS 0,text(1024),END OF auth_data.STR SE39/SE39/SE01/SE10.SPLIT STR AT / INTO TABLE auth_data. 二十、CONDENSE 的用法&#xff1a; 把工作区的内的所有字段的值 赋给 字符串 DATA: BEGIN O…

【论文阅读】自动驾驶安全的研究现状与挑战

文章目录 摘要1.引言1.1.自动驾驶安全1.2.攻击面1.3.内容和路线图 2.自动驾驶技术2.1.组成2.2.技术 3.传感器安全3.1.照相机3.2.GNSS&#xff08;全球导航系统&#xff09;/IMU&#xff08;惯性测量单元&#xff09;3.3.超声波传感器3.4.毫米波雷达3.5.激光雷达3.6.多传感器交叉…

typescript基础之satisfies 与 as const

satisfies 是 TypeScript 4.9 版本中引入的一个新的运算符&#xff0c;它可以让你检查一个给定的类型是否满足一个特定的接口或条件。换句话说&#xff0c;它可以确保一个类型具有一个特定接口所要求的所有属性和方法。它是一种保证一个变量符合一个类型定义的方式。 satisfie…

【校招VIP】前端基础之post和get

考点介绍&#xff1a; get和post 是网络基础&#xff0c;也是每个前端同学绕不过去的小问题&#xff0c;但是在校招面试中很多同学在基础回答中不到位&#xff0c;或者倒在引申问题里&#xff0c;就丢分了。 『前端基础之post和get』相关题目及解析内容可点击文章末尾链接查看…

Azure Bastion的简单使用

什么是Azure Bastion Azure Bastion 是一个提供安全远程连接到 Azure 虚拟机&#xff08;VM&#xff09;的服务。传统上&#xff0c;访问 VM 需要使用公共 IP 或者设立 VPN 连接&#xff0c;这可能存在一些安全风险。Azure Bastion 提供了一种更安全的方式&#xff0c;它是一个…

JZ36 二叉搜索树与双向链表

问题描述&#xff1a; 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。 问题要求&#xff1a; 1.要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。当转化完成以后&#xff0c;树中节点的左指 针需要指向前驱&#xff0c;树中节点…

Ubuntu 22LTS 配置静态IP

可行方法&#xff0c;需界面配置 转载自&#xff1a;哔哩哔哩链接地址 命令行配置&#xff1a;待补充

数据库概述SQL基本语法

基本概念 数据库DB database简称DB: 存储数据的仓库&#xff0c;是以某种结构存储数据的文件。指长期保存在计算机的存储设备上&#xff0c;按照一定规则阻止起来&#xff0c;可以被用户或应用共享的数据集合。 数据库管理系统DBMS 用于创建&#xff0c;维护&#xff0c;使…

“深入剖析JVM内部机制:了解Java虚拟机的工作原理“

标题&#xff1a;深入剖析JVM内部机制&#xff1a;了解Java虚拟机的工作原理 摘要&#xff1a;本文将深入剖析JVM内部机制&#xff0c;详细介绍Java虚拟机的工作原理。我们将探讨JVM的组成部分、类加载过程、内存管理、垃圾回收以及即时编译等关键概念。此外&#xff0c;还将提…

selenium +Jmeter 的性能测试

通过Jmeter快速将已有的Selenium 代码以性能测试的方式组织起来&#xff0c;并使用JMeter 丰富的报表展示测试结果 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver …

08.利用Redis实现签到功能

学习目标&#xff1a; 来源&#xff1a;黑马教程 使用Redis中BitMap数据结构使用签到功能和连续签到功能 学习产出&#xff1a; 解决方案&#xff1a; 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…

push github

一、生成密钥 打开git bash执行下面指令&#xff0c;Enter下一步Enter下一步..生成ssh key 密钥&#xff1b; ssh-keygen -t rsa 二、 复制公共密钥到git hub 登录github&#xff0c;在选项setting >> SSH and GPG key >> add new ssh添加刚才的公钥地址即可 验证…

Hadoop入门机安装hadoop

0目录 1.Hadoop入门 2.linux安装hadoop 1.Hadoop入门 定义 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。 优势 高可靠性&#xff1a;Hadoop底层维护多…

机器学习中XGBoost算法调参技巧

本文将详细解释XGBoost中十个最常用超参数的介绍&#xff0c;功能和值范围&#xff0c;及如何使用Optuna进行超参数调优。 对于XGBoost来说&#xff0c;默认的超参数是可以正常运行的&#xff0c;但是如果你想获得最佳的效果&#xff0c;那么就需要自行调整一些超参数来匹配你…

docker实践作业

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

c++都补了c语言哪些坑?

目录 1.命名空间 1.1 定义 1.2 使用 2.缺省参数 2.1 概念 2.2 分类 3.函数重载 4.引用 4.1 概念 4.2 特性 4.3 常引用 4.4 引用和指针的区别 5.内联函数 1.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将…

AR地图微信小程序:数字化时代下地图应用的新突破

随着数字化时代的到来&#xff0c;地图应用成为人们日常生活中不可或缺的工具。而随着增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;AR地图微信小程序应运而生&#xff0c;为用户提供了一种全新的地图导航体验。本文将深入探讨AR地图微信小程序的专业性和思考…

Node.js 安装和配置(完整详细版)

在Windows上安装和配置Node.js&#xff1a; 下载Node.js安装程序&#xff1a; 前往Node.js官方网站&#xff08;https://nodejs.org/&#xff09;&#xff0c;在主页上找到"Downloads"&#xff08;下载&#xff09;选项。然后选择适用于Windows的"Windows Insta…

libdrm全解析十 —— 源码全解析(7)

接前一篇文章&#xff1a;libdrm全解析九 —— 源码全解析&#xff08;6&#xff09; 本文参考以下博文&#xff1a; DRM 驱动程序开发&#xff08;VKMS&#xff09; 特此致谢&#xff01; 本文继续对include/drm/drm.h中实际功能宏定义进行讲解。 11. DRM_IOCTL_GEM_FLINK …