微服务--Gateway网关

server/2024/9/24 15:16:21/

微服务架构中,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.ppmy.cn/server/121396.html

相关文章

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…

【C++掌中宝】深入理解函数重载:概念、规则与应用

文章目录 引言1. 什么是函数重载&#xff1f;2. 为什么需要函数重载&#xff1f;3. 编译器如何解决命名冲突&#xff1f;4. 为什么返回类型不参与重载&#xff1f;5. 重载函数的调用匹配规则6. 编译器如何解析重载函数的调用&#xff1f;7. 重载的限制与注意事项8. 总结结语 引…

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %&#xff08;模除&#xff09;&#xff1a; % 符号用作模除&#xff08;或取模&#xff09;运算符。模除运算是一种数学运算&#xff0c;它返回两个数相除的余数。 具体来说&#xff0c;如果 a 和 b 是…

锐尔15注册机 锐尔文档扫描影像处理系统15功能介绍

锐尔文档扫描影像处理系统是一款全中文操作界面的文件、档案扫描及影像优化处理软件&#xff0c;是目前国内档案数字化行业里专业且优秀的影像优化处理软件。 无论是从纸质文件制作高质量的影像文件&#xff0c;或是检查已经制作好的影像文件&#xff0c;锐尔文档扫描影像处理…

计算机毕业设计 基于Python内蒙古旅游景点数据分析系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

微服务项目部署

将微服务部署到云服务器是微服务架构中的常见操作&#xff0c;以下是三种常见的部署方式&#xff1a;使用 Spring Boot 内嵌 Tomcat、Docker 容器化、和 外部 Tomcat 部署。 1. 使用 Spring Boot 内嵌 Tomcat 部署 这是 Spring Boot 微服务最常用、也是最简单的部署方式。Spr…

哈希表与离散化

一、字符串哈希 1. 什么是哈希 哈希算法是&#xff1a;通过哈希函数将字符串、较大的数等转换为能够用变量表示的或者是直接作为数组下标的数&#xff0c;通过哈希算法转换到的值&#xff0c;称之为哈希值。哈希值可以实现快速查找和匹配。 比如&#xff1a;用数组下标计数法&…

Thinkphp5实现mysql主从复制

在使用ThinkPHP5&#xff08;TP5&#xff09;框架的项目中实现MySQL主从复制&#xff0c;主要步骤包括以下几个方面&#xff1a; 配置MySQL主从复制环境&#xff1a; 主库&#xff08;Master&#xff09;&#xff1a;负责处理写操作&#xff0c;如插入、更新和删除等。从库&…