微服务--Gateway网关

news2024/11/14 3:56:38

在微服务架构中,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.coloradmin.cn/o/2158005.html

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

相关文章

DNF Decouple and Feedback Network for Seeing in the Dark

DNF: Decouple and Feedback Network for Seeing in the Dark 在深度学习领域&#xff0c;尤其是在低光照图像增强的应用中&#xff0c;RAW数据的独特属性展现出了巨大的潜力。然而&#xff0c;现有架构在单阶段和多阶段方法中都存在性能瓶颈。单阶段方法由于域歧义&#xff0c…

计算机网络 --- Socket 编程

序言 在上一篇文章中&#xff0c;我们介绍了 协议&#xff0c;协议就是一种约定&#xff0c;规范了双方通信需要遵循的规则、格式和流程&#xff0c;以确保信息能够被准确地传递、接收和理解。  在这篇文章中我们将介绍怎么进行跨网络数据传输&#xff0c;在这一过程中相信大家…

常⻅中间件漏洞(WebLogic)靶场

1.后台弱⼝令GetShell 启动环境 默认账号密码&#xff1a;weblogic/Oracle123 weblogic常⽤弱⼝令&#xff1a;https://cirt.net/passwords?criteriaweblogic 这⾥注意&#xff0c; 单个账号错误密码5次之后就会⾃动锁定。 172.16.1.51:7001/console/login/LoginForm.jsp …

视频剪辑软件排行榜前十名推荐!从入门到专业领域都有!

随着短视频的流行&#xff0c;视频剪辑已成为表达创意、分享故事、获取流量的重要工具。无论是专业视频制作人还是业余爱好者&#xff0c;选择一款合适的视频剪辑软件都至关重要。今天&#xff0c;我们就来盘点一下视频剪辑软件排行榜前十名&#xff0c;帮助你找到最适合自己的…

JavaScript是如何来的~~

文章目录 前言一、网络的诞生 ( The birth of the Web )二、Mosaic 浏览器三、Netscape 浏览器四、JavaScript的诞生 ~ 千呼万唤始出来总结 前言 例如&#xff1a;想要了解一门语言的发展历程&#xff0c;首先你得知道它是怎么来的&#xff0c;所以本文开篇介绍了网络的基本发…

【行为树】01-第一棵树

如何创建一个行为树 行为树,类似于状态机,无非是在正确的时间在正确的条件下调用回调的一种机制。 此外,我们将会交替使用__“callback"和"tick”__这两个词。 这些回调函数里发生的事情取决于你。 在这个教程系列中,大部分时间,Actions 只会在控制台上打印一…

中国土地利用覆盖和变化数据集(1980-2021)

该数据集通过融合森林资源清查数据和20种遥感土地利用产品&#xff0c;重建生成了1980-2015年中国森林覆盖数据集&#xff0c;空间分辨率为11公里。并且在此基础上进一步获得高精度森林覆被信息和土地利用覆盖数据集相融合&#xff0c;生成了中国1980-2021年土地利用覆盖和变化…

Minio上传url资源文件,文件内容不全的问题

遇到问题 使用minio-client时候上传文件为url链接时候&#xff0c;上传inputstream流出现了文件上传成功&#xff0c;但是文件内容缺失&#xff0c;无法正常打开&#xff01; 先看看基本的依赖和配置代码&#xff1a; pom.xml依赖 <!-- tika MIME检测机制 --><depen…

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言 此场景为 NestedScrollView 嵌套多个布局 &#xff0c;大致结构为 NestedScrollViewTabLayoutViewPagerfragment 其它View,如下图 &#xff0c; 一、ViewPager 设置高度才会显示内容问题 原因&#xff1a;NestedScrollView 计算高度先于 ViewPager 渲染前&#xff0c;所…

电商跨境电商商城系统/网上商城接口/电商数据接口详情

电商API接口背景&#xff1a;电商运营中&#xff0c;数据分析这项工作越来越重要&#xff0c;许多品牌方也越来越热衷去做电商数据分析。不过&#xff0c;全面的数据该如何获取呢&#xff0c;此时&#xff0c;电商数据接口的重要性便凸显出来了。 电商API数据接口主要有以下特…

go 读取excel

一、安装依赖 go get github.com/tealeg/xlsx二、main.go package mainimport "fmt" import "github.com/tealeg/xlsx"type Student struct {Name stringSex string }func (student Student) show() {fmt.Printf("Name:%s Sex:%s\r\n", stude…

OneNet平台替换腾讯云IOT平台(2024年6月)

文章目录 一、前言二、OneNet替换腾讯云IOT三、修改说明&#xff1a;STM32代码3.1 替换MQTT三元组&#xff08;常规操作&#xff09;3.2 修改上传的数据格式。 四、修改说明&#xff1a;服务器配置 一、前言 从2024年06月20日起&#xff0c; 新注册腾讯云物联网开发平台的用户…

浅谈人工智能技术,对社会经济变革的思考

原创 冰锋血骨 芯原创 2024年09月23日 15:44 北京 英国DeepMind公司研发的AlphaGo在2016年3月第一次战胜了围棋世界冠军韩国棋手李世石,人工智能(AI,Artificial Intelligence)第一次映入公众的视野。人工智能是什么?人工智能会想人一样思考吗?人工智能可以应用在哪些领域…

如何用AI论文生成工具撰写一篇高质量的成人教育毕业论文

撰写一篇高质量的成人教育毕业论文并不简单&#xff0c;它有一定的步骤和策略。锐智AI今天就总结了一些关键的步骤&#xff0c;希望对即将毕业的你顺利完成论文写作&#xff1a; 介绍之前简单说下锐智AI&#xff0c;它是一款集论文大纲生成、内容填充、文献引用、查重修改于一…

猎板PCB揭秘厚铜板技术的最新进展

在电子设备不断追求更高性能与更小尺寸的今天&#xff0c;PCB厚铜板技术因其卓越的导电性和散热性能&#xff0c;成为提升电子产品性能的关键材料。猎板PCB今天针对厚铜板的最新技术进展、应用领域及制造流程&#xff0c;为您提供全面的技术资料。 一、PCB厚铜板技术概览 PCB厚…

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离&#xff0c;例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤&#xff1a; 1.在Nacos控制…

007——递归(树的前置知识点)

目录 创建副本 递归 直接调用 间接调用 递归的具体流程又是什么样子的&#xff1f; 递归函数的组成&#xff1a; 递归可以用来解决什么问题&#xff1f; 例子1&#xff1a;求和问题 例子2&#xff1a;斐波那契数列 补充&#xff1a; 说到递归&#xff0c;我们可以简单…

Spring Boot实用小技巧5 - 第527篇

《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 SpringBoot …

10KV并网分布式光伏电力监控解决方案

一、分布式光伏并网要求 Q/GDW1480-2015 《分布式电源接入电网技术规定》&#xff1a;分布式电源并网电压等级可根据各并网点装机容量进行初步选择&#xff0c;推荐如下&#xff1a; 8kW 及以下可接入220V&#xff1b; 8kW~400kW可接入380V&#xff1b; 400kW~6MW可接入10k…

MySQL篇(锁机制 基本介绍、全局锁\表级锁\行锁、悲观锁\乐观锁)

目录 讲解一&#xff1a;基本介绍 一、简介 二、MySQL中的锁 1. 锁粒度分类&#xff08;三类&#xff09; 讲解二&#xff1a;全局锁\表级锁\行锁 一、全局锁 1. 简介 2. 不加全局锁的问题 3. 加全局锁的好处 4. 操作 加全局锁 数据备份 释放锁 5. 特点 二、表级…