作者:小凯
沉淀、分享、成长,让自己和他人都能有所收获!

我发现了一个很有意思的缩写单词 gw、wg,都是网关的意思。因为 gw = gateway、wg = wangguan,所以在各个系统开发中,既有 gw 也有 wg 的存在。而网关也是各个互联网中用于统一对外的核心系统,当然使用网关的手段也不同,有中大厂自研,也有中小厂使用开源的组件。所以这个系列会陆续的分享出各个类型的网关,让大家了解以及按需选择使用。

其实只要一个公司有拆分较多的微服务,有很多的应用都要对外提供接口,就需要引入网关系统。否则就会有非常多共性功能重复在各个系统开发。比如;负载、熔断、降级、限流、切量、统一登录、地址转发等功能。这些东西要是让每个系统实现一遍,后续是非常难管理的。
那么这么多开源网关选择哪个,或者如何自研网关呢,后面陆续的分享出各个网关的介绍和使用,以及自研的教程,让大家可以积累自己的知识体系以及做技术选型。

前面已经分享了一篇 Higress (opens new window)今天分享的是 SpringCloud Gateway

官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#glossary(opens> new window)
案例:https://gitcode.net/KnowledgePlanet/road-map/xfg-dev-tech-springcloud-gateway(opens> new window)

Spring Cloud Gateway 是一套非常容易使用的网关服务,通过yml配置或者代码编程的方式实现网关功能。对于网关你可以理解在接收一个 http 请求后,通过网关的配置过滤、替换、拦截、转发等操作到指定的请求地址上去。

一、SpringCloud Gateway 介绍
Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 提供的网关解决方案。可以帮助开发者轻松地构建出具有动态路由、限流、熔断等特性的 API 网关。
在这里插入图片描述

1.基于异步非阻塞模型:Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用了异步非阻塞的 API,可以提供更高的吞吐量和更低的延迟。
2.动态路由:可以通过配置文件或者 API 动态地添加、修改或删除路由规则,不需要重启服务。
3.路由断言:可以根据 HTTP 请求的各种参数(如路径、头部、请求参数等)来匹配路由。
4.过滤器:提供了一系列内置的 GatewayFilter 工厂,可以在请求被路由前或后执行各种操作,如修改请求头、增加参数、限流等。同时也支持自定义过滤器。
5.集成与安全:可以与 Spring Cloud 的服务发现和断路器等组件无缝集成,同时也可以集成 Spring Security 实现安全控制。
6.限流与熔断:可以集成如 Resilience4J 等库来实现限流和熔断功能,保护后端服务不被过多的请求压垮。
7.监控与跟踪:可以与 Spring Cloud Sleuth 和 Zipkin 等组件集成,实现请求的跟踪和监控。
Spring Cloud Gateway 的工作原理是将进入的 HTTP 请求根据配置的路由规则转发到对应的后端服务。它在转发请求的过程中可以执行一系列的过滤器链,这些过滤器可以修改请求和响应,或者根据特定的逻辑决定是否继续处理请求。

二、环境部署

  1. 测试工程
    在这里插入图片描述
  • 注意;本机安装了 docker 或者云服务器安装了 docker + compose。
  • 在提供的案例工程中,包括;环境配置(nacos - 注册中心、redis - 限流使用)、curl 测试访问网关地址、app 是网关配置、provider-01\02 是2个测试工程,提供了2个接口,方便验转发。
  • 最后的 webflux 是使用这项技术来模拟开发网关,让大家了解到 SpringCloud Gateway 简单运行机制。
  1. 基础环境
    开发环境:JDK 17
    云服务器:2c4g 最低,我是用的 2c8g 体验的。https://yun.xfg.plus (opens new window)- 价格实惠。
    基础环境:Docker、Portainer、Git
    在这里插入图片描述
  • docker 安装 mysql 会自动根据 docker compose 脚本配置,把 nacos 需要的 sql 导入进去。
  • Phpmyadmin - MySQL 后台管理工具、redis-admin - Redis 后台管理工具。
  1. 生产接口
    xfg-dev-tech-gateway-provider-01、xfg-dev-tech-gateway-provider-02,分别提供了2个生产的 http 接口。你可以启动服务后单独访问接口测试。我们这里主要的用途是通过网关来使用这2个接口。

📢 注意以下测试,都要先启动这2个接口提供者工程。

3.1 生产者01

@RestController()
@CrossOrigin("*")
@RequestMapping("/api/user/")
public class HiGatewayController {/*** curl http://127.0.0.1:8091/api/user/hi*/@RequestMapping(value = "hi", method = RequestMethod.GET)public String hi() {return "hello gateway,provider 01";}}
3.1 生产者01
@RestController()
@CrossOrigin("*")
@RequestMapping("/api/user/")
public class HiGatewayController {/*** curl http://127.0.0.1:8092/api/user/hi*/@RequestMapping(value = "hi", method = RequestMethod.GET)public String hi() {return "hello gateway,provider 02!";}}

三、模拟网关 - webflux
基于 webflux 开发 api网关,不要引入 spring web 组件,而是引入以下组件;

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.97.Final</version>
</dependency>
  1. 简单路由
@Configuration
public class GatewayRouter {@Beanpublic RouterFunction<ServerResponse> routeToService() {return RouterFunctions.route(GET("/service1").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),request -> ServerResponse.ok().bodyValue("Response from Service 1")).andRoute(GET("/service2").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),request -> ServerResponse.ok().bodyValue("Response from Service 2"));}}
  • 这是一个请求地址和返回接口的简单路由。
  • 你可以启动服务后,访问地址:http://localhost:9091/service1 http://localhost:9091/service2
  1. 接口路由
@Configuration
public class ApiGatewayConfiguration {private final WebClient.Builder webClientBuilder;public ApiGatewayConfiguration(WebClient.Builder webClientBuilder) {this.webClientBuilder = webClientBuilder;}/*** curl http://localhost:9091/wg/service1/8091* curl http://localhost:9091/wg/service2/8092* @return*/@Beanpublic RouterFunction<ServerResponse> routerFunction() {return route(GET("/wg/service1/{id}"), this::service1Handler).andRoute(GET("/wg/service2/{id}"), this::service2Handler);}public Mono<ServerResponse> service1Handler(ServerRequest request) {String id = request.pathVariable("id");Mono<String> response = webClientBuilder.build().get().uri("http://127.0.0.1:8091/api/user/hi?" + id).retrieve().bodyToMono(String.class);return ServerResponse.ok().body(response, String.class);}public Mono<ServerResponse> service2Handler(ServerRequest request) {String id = request.pathVariable("id");Mono<String> response = webClientBuilder.build().get().uri("http://127.0.0.1:8092/api/user/hi?" + id).retrieve().bodyToMono(String.class);return ServerResponse.ok().body(response, String.class);}}

在这里插入图片描述

-通 过 routerFunction 对不同的请求地址进行转发操作。

  • 如图 curl http://localhost:9091/wg/service1/8091、curl http://localhost:9091/wg/service2/8092 可以得到不同的响应结果。

四、网关测试 - SpringCloud Gateway
在这里插入图片描述

  • 文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html(opens new window)
  • 使用:你可以右键翻译文档,根据文档的说明来配置各个场景验证网关使用。
  1. yml配置
spring:redis:host: 127.0.0.1port: 16379database: 0lettuce:pool:max-active: 10max-wait: 1000max-idle: 5min-idle: 3application:name: xfg-dev-tech-springcloud-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacoslocator:enabled: truegateway:discovery:locator:enabled: trueglobalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods: "*"alloedHeaders: "*"routes:- id: route_01uri: lb://provider-01order: 1predicates:- Path=/gw/**- Weight=group1, 1filters:- StripPrefix=1- id: route_02uri: lb://provider-02order: 1predicates:- Path=/gw/**- Weight=group1, 9filters:- StripPrefix=1- name: RequestRateLimiterargs:key-resolver: "#{@ipKeyResolver}" # 限流方式:Bean名称redis-rate-limiter.replenishRate: 1 # 生成令牌速率:个/秒redis-rate-limiter.burstCapacity: 3 # 令牌桶容量redis-rate-limiter.requestedTokens: 1 # 每次消费的Token数量
  • 配 置 Redis 是为了使用限流组件,同时要配置 RequestRateLimiter 类,配置对应的限流 bean 名称。
  • n acos 是注册中心,网关走的是 nacos 注册中心里的服务。这些服务是生产者接口配置了 nacos 注册到注册中心了。这样就可以通过 lb://provider-02 进行访问。lb = nacos,provider-02 是生产者配置的服务名称。
  • 在 yml 配置中,一组 id: route_01 下面是对应的网关配置,以这个距离,访问 Path=/gw/** 路径,filters 过滤掉 StripPrefix=1 1个路径 gw 其余的打到 provider-01 服务上,也就是可以访问具体的服务了。另外 Weight=group1, 1 是权重配置,group1 代表这一组的,1 表示权重比。如果你不用 nacos,uri 也可以配置一个具体的 http 地址测试
  • 这些内容在 SpringCloud Gateway 官网有对应的介绍,直接按照文档配置使用即可。
  1. 代码配置
    源码:cn.bugstack.xfg.dev.tech.config.RouteConfiguration
@Bean
public RouteLocator route(RouteLocatorBuilder builder, UriConfiguration uriConfiguration) {String httpUri = uriConfiguration.getHttp();return builder.routes().route(p -> p.path("/baidu").uri("https://www.baidu.com/")).route(p -> p.path("/bugstack").uri("https://bugstack.cn/md/road-map/road-map.html")).route(p -> p.path("/error").uri("forward:/fallback")).route(p -> p.path("/get").filters(f -> f.addRequestHeader("Hello", "World")).uri(httpUri)).build();
}
  • 除了 yml 中的配置,还可以使用代码配置。有代码配置是非常重要的,这样就可以根据写到数据库中的数据,以及提供一个管理后台来操作网关的配置了,在网关启动的时候从数据库读取数据来动态实例化所有的配置内容。
  1. 测试验证
    启动服务后,访问地址:curl http://localhost:8090/gw/api/user/hi、curl http://localhost:8090/error
    在这里插入图片描述
  • 访问后,分别可以看到不通的响应结果。
    五、网关学习
    除了业务开发,自己也是非常感兴趣于这样的网关技术组件的实现,所以在日常的工作中也积累了很多网关的设计。
    在这里插入图片描述

整个API网关设计核心内容分为这么五块;

  • 第一块:是关于通信的协议处理,也是网关最本质的处理内容。这里需要借助 NIO 框架 Netty 处理 HTTP 请求,并进行协议转换泛化调用到 RPC 服务返回数据信息。
  • 第二块:是关于注册中心,这里需要把网关通信系统当做一个算力,每部署一个网关服务,都需要向注册中心注册一个算力。而注册中心还需要接收 RPC 接口的注册,这部分可以是基于 SDK 自动扫描注册也可以是人工介入管理。当 RPC 注册完成后,会被注册中心经过AHP权重计算分配到一组网关算力上进行使用。
  • 第三块:是关于路由服务,每一个注册上来的Netty通信服务,都会与他对应提供的分组网关相关联,例如:wg/(a/b/c)/user/… a/b/c 需要匹配到 Nginx 路由配置上,以确保不同的接口调用请求到对应的 Netty 服务上。PS:如果对应错误或者为启动,可能会发生类似B站事故。
  • 第四块:责任链下插件模块的调用,鉴权、授信、熔断、降级、限流、切量等,这些服务虽然不算是网关的定义下的内容,但作为共性通用的服务,它们通常也是被放到网关层统一设计实现和使用的。【这块内容可以自行扩展】
  • 第五块:管理后台,作为一个网关项目少不了一个与之对应的管理后台,用户接口的注册维护、mock测试、日志查询、流量整形、网关管理等服务。

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

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

相关文章

随机地址生成器 - Cloudflare Workers

分享一个完全开源免费部署在 Cloudflare Workers 上的随机地址生成器&#xff0c;支持全球 24 个国家/地区。 &#x1f517; 工具地址: https://address.chat-tempmail.com ✨ 特性 &#x1f30d; 支持生成 24 个国家/地区的地址&#x1f4f1; 响应式设计&#xff0c;完美支持…

CNN不是一个模型?

CNN不是一个模型&#xff1f; 结论&#xff1a; CNN 是模型架构而非具体模型&#xff0c;其定位类似深度学习领域的 「设计框架」&#xff0c;而非 LSTM&#xff08;具体单元结构&#xff09;或决策树&#xff08;具体算法实体&#xff09;。CNN 的 「具体模型」 需要结合网络…

爱基百客与真迈生物达成战略合作,共推多组学科研服务升级

近日&#xff0c;武汉爱基百客生物科技有限公司&#xff08;以下简称“爱基百客”&#xff09;与真迈生物正式签署战略合作协议。此次战略合作将聚焦表观组学、单细胞时空组学等前沿科研领域&#xff0c;联合打造基于自主创新技术的多组学科研服务方案&#xff0c;为科研人员提…

吴恩达:从斯坦福到 Coursera,他的深度学习布道之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 吴恩达&#xff1a;从斯坦福到 Coursera&#xff0c;他的深度学习布道之路 在人工智能…

开疆智能CCLinkIE转ModbusTCP网关连接测联无纸记录仪配置案例

本案例是通过CCLinkIE转ModbusTCP网关将记录仪数据传送到三菱PLC&#xff0c;具体操作过程如下。 &#xff08;1&#xff09; 无纸记录仪与PT100传感器连接正确后&#xff0c;将无纸记录仪和PC通过网线连接&#xff0c;给无纸记录仪上电&#xff0c;设置无纸记录仪的IP地址及网…

【软考高级系统架构论文】# 论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

Spring Boot 3.x 项目搭建 (一)

以下是一个基础 Spring Boot 项目的创建指南&#xff0c;整合了官方推荐方式和实用配置&#xff0c;帮助您快速搭建可运行的项目骨架。 &#x1f31f; 一、项目创建方式 1. 在线工具 Spring Initializr&#xff08;推荐&#xff09; 步骤&#xff1a; 访问 Spring Initializr…

《天行数据查询系统项目介绍》

一、项目概述 天行数据查询系统是一款功能丰富的 Android 应用程序&#xff0c;旨在为用户提供便捷的信息查询服务。该系统集成了多个实用的查询功能&#xff0c;包括空气质量查询、天气预报查询、垃圾分类查询、新闻资讯浏览以及身份证信息查询等&#xff0c;方便用户一站式获…

对于服务器企业该如何进行搭建?

企业搭建服务器能够实现网络服务、数据存储和管理等功能&#xff0c;选择大家服务器不仅能够实现高效的资源管理和对数据信息进行安全保护&#xff0c;还可以满足网站运行的需求&#xff0c;下面&#xff0c;小编就主要来为大家介绍一下企业该如何进行服务器搭建&#xff1f; 搭…

重定向攻击与防御

一、重定向攻击的主要类型与技术原理 ICMP重定向攻击 原理&#xff1a;攻击者伪造网关身份发送虚假ICMP重定向报文&#xff0c;诱导主机修改路由表&#xff0c;将流量导向攻击者控制的节点。 利用工具&#xff1a;如netwox 86可构造恶意重定向包&#xff0c;源IP伪装为网关地…

SAP/S4 MM模块之主数据管理

目录 一、主要功能 1. 主数据管理 2.采购管理 3. 库存管理 二、业务价值 三、主数据常见问题 3.1. 物料主数据维护错误 3.2. 供应商数据不完整或错误 3.3. 数据录入延迟或遗漏 四、最佳实践 1. 物料主数据标准化 2. 供应商主数据优化 3.库存管控精细化 SAP MM&…

Flink Oracle CDC 总结

官方文档 https://nightlies.apache.org/flink/flink-cdc-docs-release-3.3/zh/docs/connectors/flink-sources/oracle-cdc/ 版本 Flink 1.15.3CDC 2.3.0Oracle 11G 12C &#xff08;官网说支持19&#xff0c;未测试&#xff09; Jar包 https://repo1.maven.org/maven2/co…

django request.data.get 判断有没有 某个参数

在 Django 的视图函数中&#xff0c;当你想要判断请求&#xff08;request&#xff09;中是否包含某个特定的参数&#xff0c;你可以使用 request.data.get() 方法。这种方法不仅适用于 POST 请求&#xff08;例如&#xff0c;在创建资源时&#xff09;&#xff0c;也适用于任何…

SD-WAN在可扩展性与未来发展灵活性方面的优势探讨

在企业数字化转型的浪潮中&#xff0c;网络基础设施的灵活性和扩展性成为企业关注的核心议题之一。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;作为一种新兴的网络技术&#xff0c;因其灵活、智能、高效的特性&#xff0c;逐渐取代传统WAN&#xff0c;成…

4.9. 环境和分布偏移

目录 4.9. 环境和分布偏移1&#xff09;分布偏移的类型 4.9. 环境和分布偏移 机器学习应用常被忽视数据来源和模型输出处理。许多模型在测试集上表现好&#xff0c;但数据分布改变时会部署失败&#xff0c;甚至模型决策本身可能破坏数据分布&#xff08;如贷款模型基于“穿牛津…

UI前端与数字孪生融合:打造智能工厂的可视化监控平台

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在工业 4.0 与智能制造的浪潮中&#xff0c;数字孪生技术正从概念走向大规模落地。据麦肯锡报…

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

目录 一、数据集介绍:《3D-GloBFP:全球首个三维建筑轮廓数据集》主要数据来源:模型方法:📥 二、数据下载方式方式1:Figshare方式2:下载亚洲建筑高度数据(完整版)参考🧾 数据集概述: 3D-GloBFP 是全球首个在单体建筑层面估算建筑高度的三维建筑轮廓数据集,基于 20…

python基于协同过滤的动漫推荐系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

MySQL 中 DATE、DATETIME 和 TIMESTAMP 的区别

MySQL 中 DATE、DATETIME 和 TIMESTAMP 的区别 在 MySQL 中&#xff0c;DATE、DATETIME 和 TIMESTAMP 都是用于存储日期和时间的数据类型&#xff0c;但它们在格式、范围、存储大小、时区处理和功能上存在显著差异。以下将逐步对比这些区别&#xff0c;帮助您根据实际需求选择…

面试 — 预进行 — 面试前准备

好记忆不如烂笔头&#xff0c;能记下点东西&#xff0c;就记下点&#xff0c;有时间拿出来看看&#xff0c;也会发觉不一样的感受. 书接上回&#xff0c;虽然我已经阐述过一下&#xff0c;详见面试 — 预准备 — 面试前准备攻略&#xff0c;但是我还是想再说一次&#xff0c;毕…