微服务--Gateway网关

在微服务架构中,Gateway(网关)是一个至关重要的组件,它扮演着多种关键角色,包括路由、负载均衡、安全控制、监控和日志记录等。

Gateway网关的作用

  1. 统一访问入口
    • Gateway作为微服务的统一入口,所有外部请求都先经过Gateway,再由Gateway根据路由规则转发到相应的微服务。这降低了服务受攻击面,提高了系统的安全性。
  2. 路由和负载均衡
    • Gateway负责将请求路由到正确的微服务。这可以基于请求的路径、主机头、HTTP方法等条件进行路由。
    • 同时,Gateway还可以执行负载均衡,将请求分发到多个相同或不同的微服务实例,确保各个实例都能够处理相应的负载,提高系统的性能和可用性。
  3. 安全性
    • Gateway通常用于处理安全性方面的任务,如身份验证、授权和加密。它可以拦截请求并验证用户的身份,确保只有经过身份验证的用户才能访问受保护的微服务。
  4. 监控和日志
    • Gateway可以收集有关请求和响应的信息,用于监控和日志记录。这些信息可以用于分析性能问题、跟踪请求流程,以及生成有关系统行为的报告。
  5. 协议转换
    • Gateway可以执行协议转换,将外部请求从一个协议转换为另一个协议。例如,将HTTP请求转换为WebSocket请求,或者将请求从HTTP/1.1转换为HTTP/2。
  6. 缓存
    • Gateway可以实现请求和响应的缓存,以降低对微服务的负载,提高响应速度。这对于处理频繁请求相同资源的情况非常有用。
  7. 限流
    • 通过在Gateway上实现限流策略,可以控制对微服务的请求流量,防止过多的请求导致系统过载。
  8. 断路器模式
    • Gateway可以实现断路器模式,用于在微服务发生故障或不可用时防止请求继续传递,从而提高系统的稳定性。
  9. API管理
    • Gateway可以用于集中管理和监控微服务的API。这包括API版本控制、文档生成、请求转换等。

两种不同的网关实现方式

在SpringCloud中,存在两种不同的网关实现方式:Zuul和Gateway。这两种网关各有其特点和应用场景,下面将分别进行介绍。

Zuul

简介

Zuul是Spring Cloud早期版本中广泛使用的网关组件,它基于Netflix Zuul构建。Zuul提供了路由、负载均衡、容错、安全性等多种功能,是微服务架构中API网关的常用选择之一。然而,需要注意的是,随着Spring Cloud的发展,Zuul逐渐进入维护模式,Spring Cloud官方推荐使用Spring Cloud Gateway作为替代方案。

特点

  • 同步阻塞模型:Zuul采用同步阻塞模型处理请求,这在处理大量并发请求时可能会成为性能瓶颈。
  • 功能丰富:提供了路由、负载均衡、容错、安全性等多种功能,满足微服务架构中网关的多种需求。
  • 集成方便:与Spring Cloud的其他组件集成方便,如Eureka、Hystrix等。

应用场景

  • 适用于较小规模的微服务架构。
  • 如果项目中已经大量使用了Netflix的生态系统组件,并且对性能要求不是特别高,可以考虑使用Zuul。

Gateway

简介

Spring Cloud Gateway是Spring Cloud官方推荐的API网关解决方案。它基于Spring Framework 5和Project Reactor构建,采用异步非阻塞模型,具有更高的性能和吞吐量。Gateway提供了动态路由、过滤器链、集成服务发现、断路器等功能特性,支持Java和函数式编程的API,具有更高级的定制和扩展能力。

特点

  • 异步非阻塞模型:Gateway采用异步非阻塞模型,能够处理大量并发请求,提高系统性能。
  • 动态路由:支持动态路由配置,可以轻松地添加、修改或删除路由规则。
  • 丰富的过滤器:提供了丰富的内置过滤器,如请求头过滤器、请求参数过滤器等,同时也支持自定义过滤器。
  • 集成服务发现:可以轻松地与Eureka、Consul等服务发现组件集成,实现服务的自动发现和路由。

应用场景

  • 适用于需要高性能、高吞吐量的微服务架构。
  • 如果项目需要与Spring Cloud的其他组件紧密集成,并且希望获得更好的性能和扩展能力,那么Gateway是更好的选择。

搭建网关服务

1. 准备工作

  • 环境准备:确保你的开发环境已经安装了Java、Maven或Gradle等必要的开发工具。
  • Spring Cloud版本选择:根据你的项目需求选择合适的Spring Cloud版本。

2. 创建项目并添加依赖

  • 创建Spring Boot项目:可以使用Spring Initializr(https://start.spring.io/) 快速生成一个SpringBoot项目。

  • 添加Spring Cloud Gateway依赖:在项目的pom.xml(Maven)或build.gradle(Gradle)文件中添加Spring Cloud Gateway的依赖。例如,对于Maven项目,可以添加如下依赖:

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

3. 配置网关路由

  • 编写配置文件:在application.ymlapplication.properties文件中配置网关的路由信息。例如,在application.yml中配置如下路由:

spring:  cloud:  gateway:  routes:  - id: example_route  uri: https://example.com  predicates:  - Path=/example/**

4. 启用网关服务

  • 配置启动类:确保你的Spring Boot启动类上添加了@SpringBootApplication注解,并且(如果需要)添加了@EnableEurekaClient(如果你的项目集成了Eureka服务发现)或其他相关注解。
  • 启动服务:运行Spring Boot启动类,启动网关服务。

5. 验证和测试

  • 发送请求:通过浏览器、Postman或其他HTTP客户端工具向网关发送请求,验证路由是否按预期工作。
  • 查看日志:查看网关服务的日志输出,以获取有关请求处理过程的详细信息。

6. 高级配置(可选)

  • 添加过滤器:Spring Cloud Gateway支持通过过滤器对请求和响应进行拦截和处理。你可以根据需要添加自定义过滤器或使用内置的过滤器。
  • 配置安全性:配置HTTPS支持、OAuth2认证、IP黑白名单、请求限流等安全功能。
  • 动态路由:配置动态路由,以便根据服务发现的结果自动更新路由信息。

注意事项

  • 版本兼容性:确保你使用的Spring Cloud Gateway版本与你的Spring Boot版本兼容。
  • 性能优化:根据项目的实际需求,对网关进行性能优化,如调整线程池大小、启用缓存等。
  • 安全性:始终关注网关的安全性,确保它不会成为系统的安全漏洞。

路由断言工厂(RoutePredicateFactory)

路由ID(Route ID)

路由ID是网关配置中用于唯一标识每个路由的标识符。这个ID在配置文件中被指定,并且当需要引用或管理特定路由时,会使用到这个ID。通过路由ID,管理员或开发人员可以轻松地定位、修改或删除特定的路由规则。

URI(Uniform Resource Identifier)

URI指定了路由的目的地,即当请求满足所有配置的predicates条件时,该请求应该被转发到的位置。这个URI可以是任何有效的HTTP服务地址,也可以是一个负载均衡器的地址,用于将请求分发到多个服务实例之间。URI的配置使得网关能够根据路由规则,将请求智能地转发到后端服务。

Predicates(断言)

Predicates是一组条件语句,用于确定传入的HTTP请求是否应该被转发到配置的URI。这些条件可以基于请求的不同属性,如请求路径、头信息、查询参数、请求方法等。只有当请求满足所有配置的predicates条件时,网关才会将该请求转发到指定的URI。Predicates提供了灵活的方式来定义路由规则,使得网关能够根据复杂的业务逻辑来转发请求。

Filters(过滤器)

Filters是处理请求和响应的组件,它们在请求被转发到后端服务之前或响应被返回给客户端之后执行。Filters可以用于多种目的,如修改请求头、添加认证信息、记录日志、修改响应数据等。通过配置Filters,可以对通过网关的请求和响应进行精细控制,以满足特定的业务需求或安全要求。

网关过滤器可以分为两大类:局部过滤器(GatewayFilter)全局过滤器(GlobalFilter)

局部过滤器(GatewayFilter)

局部过滤器只会应用到单个路由或者一个分组的路由上。Spring Cloud Gateway默认提供了许多局部过滤器供我们使用,这些过滤器可以在配置文件中针对特定的路由进行配置。局部过滤器的作用范围相对局限,但能够针对特定路由实现精细化的控制。

局部过滤器包括但不限于以下几种类型:

  • 路径过滤器(Path Filters):如RewritePath、PrefixPath、StripPrefix等,用于修改请求的URL路径。
  • 参数过滤器(Parameter Filters):如AddRequestParameter,用于向下游服务添加请求参数。
  • 头部过滤器(Header Filters):如AddRequestHeader、AddResponseHeader,用于向请求或响应中添加、修改或删除头部信息。
  • 状态码过滤器(Status Filters):如SetStatus,用于设置响应的状态码。
  • 重试过滤器(Retry Filters):如Retry,用于在请求失败时进行重试。
  • 限流过滤器(RateLimiter Filters):用于对请求进行限流,防止系统过载。

全局过滤器(GlobalFilter)

全局过滤器是应用于所有进入服务网关或代理的请求和响应的过滤器。它们可以执行跨服务的通用功能,如鉴权、请求日志记录、性能监控等。全局过滤器对整个微服务架构起到了全局影响,因此需要谨慎使用。

全局过滤器通过实现GlobalFilter接口来定义,可以在请求被路由之前、请求被路由到目标服务之后或响应返回给客户端之前执行特定的逻辑。

import org.springframework.cloud.gateway.filter.GatewayFilterChain;  
import org.springframework.cloud.gateway.filter.GlobalFilter;  
import org.springframework.core.Ordered;  
import org.springframework.stereotype.Component;  
import org.springframework.web.server.ServerWebExchange;  
import reactor.core.publisher.Mono;  @Component // 注意这里使用了@Component而不是@Configuration,因为我们通常将自定义的Bean用@Component注解  
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {  @Override  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  // 提取请求路径  String path = exchange.getRequest().getPath().pathWithinApplication().value();  System.out.println("Incoming request to path: " + path);  // 继续执行过滤器链  return chain.filter(exchange).then(Mono.fromRunnable(() -> {  // 提取响应状态码  int statusCode = exchange.getResponse().getRawStatusCode();  System.out.println("Outgoing response with status code: " + statusCode + " for path: " + path);  // 这里可以添加更多的逻辑,比如日志记录、监控指标上报等  }));  }  @Override  public int getOrder() {  // 设置过滤器的执行顺序  return -1; // 数值越小,优先级越高  }  
}  // 注意:在这个例子中,我们没有使用静态内部类,而是将MyCustomGlobalFilter定义为一个独立的类。  
// 同时,我们使用了@Component注解来让Spring自动发现和注册这个Bean。  
// 如果你希望将配置和过滤器分开到不同的类中,你可以将@Bean方法放回到一个用@Configuration注解的类中,  
// 但在这个简单的例子中,我们直接将@Component注解添加到了过滤器类上。

当前路由的过滤器:这些过滤器与特定的路由规则相关联,只对匹配该路由的请求生效。它们通常用于实现一些针对特定服务的逻辑处理,如请求参数的校验、数据的转换等。

DefaultFilter:默认过滤器,是网关中预定义的一组过滤器。它们对所有的请求都生效,执行一些通用的处理逻辑,如日志记录、安全验证等。

GlobalFilter:全局过滤器,顾名思义,就是作用于所有请求的过滤器。无论请求匹配哪个路由,都会经过这些全局过滤器。它们通常用于实现一些跨服务的通用功能,如请求转发、响应处理、异常捕获等。

过滤器链的执行顺序

当请求到达网关时,网关会根据请求的信息(如URL、请求头等)匹配到相应的路由规则。然后,网关会将当前路由的过滤器、DefaultFilter和GlobalFilter合并成一个有序的过滤器链。这个过滤器链会按照一定的顺序依次执行每个过滤器中的逻辑。

具体来说,过滤器链的执行顺序通常是先执行GlobalFilter,然后执行当前路由的过滤器(如果有的话),最后执行DefaultFilter。但是,这个顺序并不是绝对的,它可以通过配置来调整。

 

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

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

相关文章

HTTP协议1.1请求头和keep-alive

请求头分类 End-to-end&#xff08;端对端&#xff09; 必须全部带给目标服务器&#xff0c;不会被中途变化或去掉 Hop-by-hop&#xff08;逐跳头&#xff09; 比如客户端发请求&#xff0c;要路过代理(例如Nginx)&#xff0c;头可以被自动删掉&#xff0c;来到真正服务器上…

IAR创建工程与工程配置

第一步&#xff1a;先创建一个新的工作区间 第二步&#xff1a;创建一个新的工程&#xff08;工程名与文件夹名字要一致&#xff09; 第三步&#xff1a;添加组 第四步&#xff1a;往各个组里添加文件 第五步&#xff1a;配置工程 因为我的程序下载是通过ST-link的SWD&#xf…

正向科技|格雷母线定位系统的设备接线安装示范

格雷母线安装规范又来了&#xff0c;这次是设备接线步骤 格雷母线是格雷母线定位系统的核心部件&#xff0c;沿着移动机车轨道方向上铺设&#xff0c;格雷母线以相互靠近的扁平状电缆与天线箱电磁偶合来进行信号传递&#xff0c;从而检测得到天线箱在格雷母线长度方向上的位置。…

C++ | Leetcode C++题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class AllOne {list<pair<unordered_set<string>, int>> lst;unordered_map<string, list<pair<unordered_set<string>, int>>::iterator> nodes;public:AllOne() {}void inc(string key) {if (…

安卓13删除下拉栏中的设置按钮 android13删除设置按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。也就是下面这个按钮。 2.问题分析…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第九集:制作小骑士基本的攻击行为Attack以及为敌人制作生命系统和受伤系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作小骑士基本的攻击行为Attack 1.制作动画以及使用UNITY编辑器编辑2.使用代码实现扩展新的落地行为和重落地行为3.使用状态机实现击中敌人造成伤害机制二…

前端vue-3种生命周期,只能在各自的领域使用

上面的表格可以简化为下面的两句话&#xff1a; setup是语法糖&#xff0c;下面的两个import导入是vue3和vue2的区别&#xff0c;现在的vue3直接导入&#xff0c;比之前vue2简单 还可以是导入两个生命周期函数

kafka负载均衡迁移(通过kafka eagle)

在grafana监控中发现kafka的各个节点磁盘不均匀 出现这样的情况是因为kafka默认是以文件数作为平衡的条件的。换句话说&#xff0c;kafka不会管一个副本有多大&#xff0c;只会看磁盘中有多少个副本文件。 解决方式&#xff1a; 1、修改策略&#xff0c;改为按照磁盘大小平衡…

闯关leetcode——69. Sqrt(x)

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/sqrtx/description/ 内容 Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well. You mu…

《动手学深度学习》笔记1.10——激活函数←模型初始化←数值稳定性

目录 1. 数值稳定性 1.1 神经网络的梯度 1.2 数值稳定性的常见两个问题 1.3 梯度爆炸 1.3.1 MLP的例子 1.3.2 使用ReLU激活函数 1.3.3 产生的问题 1.4 梯度消失 1.4.1 使用sigmoid激活函数 1.4.2 梯度消失的问题 1.5 总结 2. 让训练更稳定 2.1 目标 (ResNet, LSTM…

深入探究PR:那些被忽视却超实用的视频剪辑工具

如果想要了解视频剪辑的工具&#xff0c;那一定听说过pr视频剪辑吧。如果你是新手其实我更推荐你从简单的视频剪辑工具入手&#xff0c;这次我就介绍一些简单好操作的视频剪辑工具来入门吧。 1.福晰视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这款工具操…

论文阅读 | 一种基于潜在向量优化的可证明安全的图像隐写方法(TMM 2023)

TMM 2023 中国科学技术大学 针对现有的可证明安全的图像隐写不能抵抗有损图像操作&#xff0c;而现有的生成图像隐写不能证明安全问题&#xff0c;提出一种基于潜在向量优化的可证明安全的图像隐写方法&#xff08;名为PARIS&#xff09;&#xff0c;该方法受到逆采样器和噪声…

Unity 热更新(HybridCLR+Addressable)-创建Addressable资源

三、创建Addressable资源 创建三个文件夹&#xff0c;放Addressable资源&#xff0c;里面对应放程序集&#xff0c;预制体以及场景 拖拽到Addressable Groups对应组中 其中文件名太长&#xff0c;带着路径&#xff0c;可以简化名字 创建一个脚本&#xff0c;对于这个脚本进行一…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…

量子计算Quantum Computing

引子&#xff1a;朋友闲谈&#xff0c;问及工作&#xff0c;一个朋友说&#xff0c;他在一家做量子通信的公司上班&#xff0c;具体岗位是做结构设计&#xff0c;他抱怨说&#xff0c;直到现在他都搞不懂量子计算是什么&#xff1f; 一、量子计算是什么&#xff1f; 什么是量子…

LCD屏JD9853各个接口最大支持速率

概述 电子产品开发时常会遇到有带LCD屏的产品&#xff0c;是怎么计算出来的呢&#xff1f;接下来以JD9853这颗驱动IC举例说明&#xff0c;改驱动IC分别支持&#xff1a;8080、(3-line SPI&#xff09;、 (4-line SPI)、QSPI、RGB 1、8080 通过“时钟周期为传输速率的倒数”&a…

k8s上安装prometheus

一、下载对应的kube-prometheus源码 github地址&#xff1a;GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes 1&#xff09;进入目录 [rootk8s-master ~]# cd kube-prometheus [rootk8s-master…

Spring Boot 学习之路 -- 配置项目

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精通&…

周家庄智慧旅游小程序

项目概述 周家庄智慧旅游小程序将通过数字化手段提升游客的旅游体验&#xff0c;依托周家庄的自然与文化资源&#xff0c;打造智慧旅游新模式。该小程序将结合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能等技术&#xff0c;提供丰富的…

国际化适配对照

中文 zh 葡萄牙语 pt 荷兰语 nl 泰文 th 匈牙利语 hu 波兰 pl 土耳其 tr 乌克兰 uk 希腊 el 印度尼西亚 in 越南语 vi 阿拉伯语 ar 希波来语 iw 英语 en 日语 ja 德语 de 法语 fr 意大利语 it 西班牙语 es 俄罗斯语 ru