Spring Cloud Gateway - 新一代微服务API网关

Spring Cloud Gateway - 新一代微服务API网关

文章目录

  • Spring Cloud Gateway - 新一代微服务API网关
    • 1.网关介绍
    • 2.Spring Cloud Gateway介绍
    • 3.Spring Cloud Gateway的特性
    • 4.Spring Cloud Gateway的三大核心概念
    • 5.Gateway工作流程
    • 6.Gateway核心配置
    • 7.动态路由
    • 8.Predicate
      • 自定义Predicate
    • 9.自定义Filter
    • 10.默认过滤器

1.网关介绍

如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关?

因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要重复接入。这样我们不仅代码要重复编写,而且后期也不利于维护。

由于接入网关后,网关将转发请求。所以在这一层做请求认证,天然合适。这样这需要编写一次代码,在这一层过滤完毕,再转发给下面的 API。

所以 API 网关的通常作用是完成一些通用的功能,如请求认证,请求记录,请求限流,黑白名单判断等。

API网关是一个服务器,是系统的唯一入口。

API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关提供REST/HTTP的访问API。

2.Spring Cloud Gateway介绍

Spring Cloud Gateway是Spring Cloud的新一代API网关,基于WebFlux框架实现,它旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。

Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix ZUUL,具有更好的性能、更强的扩展性、以及更丰富的功能特性,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,限流等。

3.Spring Cloud Gateway的特性

  • 基于Spring Framework 5, Project Reactor和Spring Boot 2.0
  • 动态路由:能够匹配任何请求属性
  • 可以对路由指定 Predicate 和 Filter
  • 集成Hystrix断路器
  • 集成Spring Cloud DiscoveryClient 服务发现功能
  • 易于编写的Predicate和Filter
  • 请求限流
  • 支持路径重写

4.Spring Cloud Gateway的三大核心概念

路由(Route):路由是网关最基础的部分,路由信息由一个ID,一个目标URI,一组断言和过滤器组成。路由断言Predicate用于匹配请求,过滤器Filter用于修改请求和响应。如果断言为true,则说明请求URI和配置匹配,则执行路由。

spring:cloud:gateway:# 定义多个路由routes:# 一个路由route的id- id: path_route# 该路由转发的目标URIuri: https://example.org# 路由条件集合predicates:- Path=/test/**# 过滤器集合filters:- AddRequestHeader=X-Request-Id, 1024- AddRequestParameter=color, red

断言(Predicate):参考Java8中的断言Predicate,用于实现请求匹配逻辑,例如匹配路径、请求头、请求参数等。请求与断言匹配则执行该路由。

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

5.Gateway工作流程

客户端向Spring Cloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler再通过指定的过滤器链来对请求进行过滤处理,最后发送到我们实际的服务执行业务逻辑,然后返回。

image-20230719111247758

过滤器链被虚线分隔,是因为过滤器既可以在转发请求前拦截请求,也可以在请求处理之后对响应进行拦截处理。

6.Gateway核心配置

依赖

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

启动类

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

application.yml

spring: application:name: cloud-gateway cloud:gateway:routes:# 路由的ID,没有固定规则但要求唯一,建议配合服务名- id: config_route# 匹配后提供服务的路由地址uri: http://ityouknow.com# 断言,路径相匹配的条件predicates:- Path=/routeconfig/rest/**- id: header_routeuri: http://ityouknow.compredicates:- Header=X-Request-Id, \d+

7.动态路由

网关接收外部请求,按照一定的规则,将请求转发给其他服务或者应用。如果站在服务调用的角度,网关就扮演着服务消费者的角色,此时,如果再来看看服务调用的目标URI配置,就会很自然的发现一个问题,服务提供者调用的地址是写死的,即网关没有动态的发现服务,这就涉及到了服务的自动发现问题,以及发现服务后,所涉及到的服务调用的负载均衡的问题。

可以通过Nacos或者Eureka注册中心动态发现服务,通过Ribbon进行服务调用的负载均衡。同样,Gateway也可以整合Nacos或者Eureka,Ribbon从而实现动态路由的功能。

想要使用动态路由的功能,首先要整合注册中心,这里以Nacos为例

<!--SpringCloud ailibaba nacos -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:application:name: cloud-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:routes:#路由的ID,没有固定规则但要求唯一,建议配合服务名- id: config_route#匹配后提供服务的路由地址, 这里lb之后,跟的是要调用的服务名称uri: lb://nacos-provider-8002# 断言,路径相匹配的条件predicates:- Path=/routeconfig/rest/**

此时,当id为config_route的路由规则匹配某个请求后,在调用该请求对应的服务时,就会从nacos注册中心自动发现服务,并在服务调用的时候实现负载均衡。

8.Predicate

在Gateway中,有一些的内置Predicate Factory,有了这些Pridicate Factory,在运行时,Gateway会 自动根据需要创建其对应的Pridicate对象测试路由条件。

  • Path 路由断言 Factory:根据请求路径匹配的路由条件工厂

    spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:# 如果可以匹配的PathPattern有多个,则每个路径模式以,分开- Path=/red/{segment},/blue/{segment}
    
  • After 路由断言 Factory:在指定日期时间之后发生的请求都将被匹配

    spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
    
  • Cookie 路由断言 Factory

    Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含此cookie名称且正则表达式为真的将会被匹配。

    spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p
    
  • Header 路由断言 Factory

    Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含此header名称且正则表达式为真的将会被匹配。

    spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+
    
  • Host 路由断言 Factory

    Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则, . 作为分隔符。

    spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
    
  • Method 路由断言 Factory

    Method 路由断言 Factory只包含一个参数:需要匹配的HTTP请求方式

    spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET
    

自定义Predicate

可以自定义Predicate来实现复杂的路由匹配规则:

// 实现自定义 Predicate 工厂
// 通过HostRoutePredicateFactory创建Predicate进行路由判断
@Component
public class MyHostRoutePredicateFactory extends AbstractRoutePredicateFactory<MyHostRoutePredicateFactory.Config> {public MyHostRoutePredicateFactory() {// Config 类作为 Predicate 的配置参数类super(Config.class);}public static class Config {// 路由匹配规则private String hostName;public String getHostName() {return hostName;}public void setHostName(String hostName) {this.hostName = hostName; }}// 生成一个 Predicate 实例@Overridepublic Predicate<ServerWebExchange> apply(Config config) {// 实现匹配逻辑return exchange -> {// 根据config实现匹配判断String host = exchange.getRequest().getURI().getHost();// 匹配配置中的域名return host.equals(config.getHostName());};} }// 使用
RouteLocator locator = new RouteLocatorBuilder(router).routes().route("test_route", r -> r.path("/test").filters(f -> f.filter(new MyHostRoutePredicateFactory.Config("www.test.com"))).uri("http://localhost:8080")).build();

9.自定义Filter

可以通过实现GatewayFilter和Ordered接口自定义Filter来实现请求处理逻辑:

@Component
public class TokenFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//请求处理逻辑log.info("请求路径:"+ exchange.getRequest().getPath());ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, HttpCookie> cookies = request.getCookies();List<HttpCookie> tokens = cookies.get("access_token");if (tokens == null || tokens.size() == 0) {throw new RuntimeException("少了cookie!");}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0; }}

10.默认过滤器

Spring Cloud Gateway内置了多种过滤器,例如:

  • AddRequestHeader GatewayFilter:在请求头中添加参数
  • PrefixPath GatewayFilter:请求路径前缀
  • Hystrix GatewayFilter: 断路器
  • RateLimit GatewayFilter: 限流
  • Retry GatewayFilter: 重试

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

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

相关文章

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

Rust 数据类型 之 结构体(Struct)

目录 结构体&#xff08;Struct&#xff09; 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体&#xff08;Unit Struct&#xff09; 元组结构体&#xff08;Tuple Struct&#xff09; 具名结构体&#xff08;Named Struct&#xff09; 结构体嵌套 结构体方法…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

总结946

6:40起床 7&#xff1a;15~8:00早读&#xff0c;07年tex1,2 8:10~10:12 880第二章选填&#xff0c;题目有些综合&#xff0c;错的有些多呀&#xff0c;不要紧&#xff0c;拿下它&#xff0c;就有进步了。 10:28~11:27重做强化18讲6道题 12&#xff1a;10~2:15吃饭睡觉&…

Python实现GA遗传算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

chatgpt赋能python:如何让Python暂停?

如何让Python暂停&#xff1f; Python是一种高级编程语言&#xff0c;常用于数据分析、机器学习等领域。在Python编程中&#xff0c;我们经常需要让程序执行暂停一段时间&#xff0c;等待某些操作完成。本文将介绍如何让Python暂停&#xff0c;以及如何在SEO中优化文章标题&am…

分享 7 个不错的 AI 工具

人工智能的世界继续让我们着迷&#xff0c;近期的 OpenAI ChatGPT 掀起人们对人工智能的更大的期待&#xff0c;本文收集了 7 个人工智能 (AI) 工具&#xff0c;其中大部分易于使用&#xff0c;有些更复杂……比如构建 ML 模型。 1. GFP-GAN&#xff1a;照片修复 GFP-GAN 是一…

世界杯决赛解析

新体育 2023-01-04 10:03 发表于北京 卡塔尔世界杯决赛跌宕起伏&#xff0c;精彩纷呈。双方主帅斗智斗勇&#xff0c;妙手迭出&#xff0c;奉献了一场难得一见的对攻大战。赛后回顾&#xff0c;阿根廷的斯卡洛尼和法国的德尚用兵有很多值得学习领悟之处。从战术的角度看&#x…

谈一谈我心中的世界杯

2022卡塔尔世界杯 开赛在即 不论你喜不喜欢足球 恐怕都无法脱离 世界杯带来的影响 如果不能和人随时随地 聊上几句世界杯话题 那得多尴尬 有了这份“伪球迷速成指南” 一定能帮助你 在各种尬聊场合 脱颖而出↓↓ 1. 世界杯的由来 世界杯每4年举办一次。世界杯又称生…

十分钟带你玩转人工智能——调用百度AI接口实现文字转语音

调用别人的接口&#xff0c;实现人工智能就是站在巨人的肩膀上 打开百度AI&#xff0c;点这个控制台&#xff0c;&#xff08;你要是没有注册 &#xff0c;就注册一下&#xff0c;很简单的&#xff09; 点开这个语音技术 创建一下应用 好了以后&#xff0c;按照这个图的步…

含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入)

所谓文无第一&#xff0c;武无第二&#xff0c;云原生人工智能技术目前呈现三足鼎立的态势&#xff0c;微软&#xff0c;谷歌以及亚马逊三大巨头各擅胜场&#xff0c;不分伯仲&#xff0c;但目前微软Azure平台不仅仅只是一个PaaS平台&#xff0c;相比AWS&#xff0c;以及GAE&am…

对接百度文心一言API---人工智能工作笔记0039

1.获取文心一言的api key 这个地址然后 点击 创建API key就可以了 然后先用postman测试一下 https://wenxin.baidu.com/moduleApi/portal/api/oauth/tokenclient_credentials application/x-www-form-urlencoded 注意 这里的参数grant_type这个是client_credentials是固定的…

斩获23项冠军,日均调用破万亿!百度交出年度AI成绩单:语音语言领衔技术突破,国产自研成大趋势...

乾明 雷刚 发自 凹非寺 量子位 报道 | 公众号 QbitAI 刚刚&#xff0c;百度一年AI成绩单官宣。 作为中国AI头雁&#xff0c;百度的成绩单不止代表巨头公司业绩&#xff0c;也代表了技术前沿现状和产业基本情况。 而且诸多进展&#xff0c;也是全新起跑线上全球AI发展的侧影&am…

AI百科:一个开启人工智能时代的综合性平台

无论是人工智能的快速发展还是AI技术在各个领域的广泛应用&#xff0c;都让我们对智能未来充满了期待和好奇。随着科技的进步&#xff0c;发现了一个好网站&#xff0c;一个集合了丰富AI工具和产品介绍的综合性网站—— AI百科。 在人工智能&#xff08;AI&#xff09;领域的快…

三大运营商乘风破浪,为什么离不开BAT等互联网企业?

【全球云观察 &#xff5c; 热点关注】对于中国联通从2017年开始的混改&#xff0c;业界关注挺多&#xff0c;之后确实带入了互联网企业如腾讯、京东、阿里、百度等参与&#xff0c;从而对中国联通在云计算、物联网等新兴技术领域的发展激发了业务的创新热情。 特别是2022年11…

周鸿祎:腾讯将来可能会是中国最大的运营商

近日&#xff0c;本刊记者采访了周鸿祎近一个小时&#xff0c;探讨未来互联网的变化、颠覆及未来&#xff0c;周鸿祎怎么看待互联网巨头的崛起对传统产业的影响和变化?在巨头林立的时代怎样才能颠覆式创新打败对手?如何选择你的对手和伙伴&#xff0c;周鸿祎说&#xff0c;“…

进程地址空间详解

进程地址空间 文章目录 进程地址空间验证地址空间的基本排布进程地址空间究竟是什么&#xff1f; 地址空间和物理内存之间的关系为什么要存在地址空间&#xff1f; 我们在学习C语言期间&#xff0c;经常可以提及到这些区域&#xff0c;有一个问题&#xff1a;这里的地址空间是内…

【GlobalMapper精品教程】044:空间操作(1)——交集(Intersection)

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述交集工具的使用。 文章目录 一、实验数据二、符号化设置三、交集运算四、结果展示1. 运行提示2. 空间查看3. 属性表查看五、心灵感…

PostgreSQL的表空间

PostgreSQL之表空间 1、什么是PG中的表空间&#xff08;tablespace&#xff09;&#xff1f; pg中的表空间实际上就是文件系统中的一个目录, 是pg中数据库对象&#xff08;包括表、索引等&#xff09;的容器。 Pg使用操作系统的文件系统进行对象存储&#xff0c;每个数据库对…

Oracle表空间、用户详解

目录 新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态 删除表空间查询 用户创建删除查询修改 新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c…