首页 > 其他分享 >Spring Cloud 学习笔记四:服务网关(Gateway)

Spring Cloud 学习笔记四:服务网关(Gateway)

时间:2024-08-05 13:52:28浏览次数:15  
标签:网关 Spring springframework org 过滤器 import Gateway 路由

在微服务架构中,随着服务数量的增加,客户端直接与服务进行通信的方式会变得越来越复杂。为了简化客户端与服务之间的交互,同时实现一些跨服务的通用功能(如认证、限流、监控等),Spring Cloud 引入了服务网关(Gateway)的概念。本篇文章将详细介绍Spring Cloud Gateway的基本概念、使用场景、核心组件以及如何配置和使用它。

一、Spring Cloud Gateway 概述

Spring Cloud Gateway 是基于 Spring Framework 5, Project Reactor 和 Spring WebFlux 的 API 网关,它为微服务架构提供了一种简单而有效的方式来路由和过滤请求。Spring Cloud Gateway 不仅具备传统网关的功能,如路由转发、负载均衡等,还通过提供丰富的路由匹配和过滤功能,使得开发者可以轻松地实现复杂的路由逻辑和请求处理流程。

二、核心组件

1. Route(路由)

路由是 Gateway 的基本构建块,它定义了请求应该如何被转发到哪个服务。路由包含了一系列属性,如 ID、目标 URI、断言(Predicate)和过滤器(Filter)。

断言(Predicate):用于匹配来自客户端的请求。如果请求与断言相匹配,则路由到目标 URI。
过滤器(Filter):对请求和响应进行处理的逻辑,可以在请求被转发到目标服务之前或之后执行。

2. Predicate(断言)

Spring Cloud Gateway 提供了多种内置断言,用于匹配 HTTP 请求的不同属性,如路径、头信息、请求方法等。开发者也可以根据需要自定义断言。

3. Filter(过滤器)

过滤器可以在请求被路由前后对请求和响应进行加工处理。Spring Cloud Gateway 的过滤器分为 GatewayFilter 和 GlobalFilter 两种。GatewayFilter 是应用于单个路由的过滤器,而 GlobalFilter 则是应用于所有路由的过滤器。

三、使用场景

路由转发:将外部请求转发到内部微服务。
负载均衡:配合负载均衡器(如 Ribbon)实现请求的负载均衡。
认证授权:在请求到达目标服务之前进行身份验证和授权。
限流熔断:对请求进行限流,防止服务过载;在目标服务不可用时,提供熔断逻辑。
日志记录:记录请求和响应的详细信息,便于监控和故障排查。
四、配置示例

1. 添加依赖

在 Maven 的 pom.xml 文件中添加 Spring Cloud Gateway 的依赖:

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

2. 配置路由

在 application.yml 或 application.properties 中配置路由规则:

spring:  
  cloud:  
    gateway:  
      routes:  
      - id: myroute  
        uri: http://example.com  
        predicates:  
        - Path=/mypath/**  
        filters:  
        - StripPrefix=1

上述配置定义了一个名为 myroute 的路由,它将所有以 /mypath/ 开头的请求转发到 http://example.com,并移除请求路径中的第一个路径段。

3. 自定义过滤器

可以通过实现 GlobalFilter 或 GatewayFilter 接口来创建自定义过滤器。

实现GlobalFilter

如果你想要创建一个全局过滤器,可以这样做:

java
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  
public class MyGlobalFilter implements GlobalFilter, Ordered {  
  
    @Override  
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
        // 在请求被处理之前执行  
        System.out.println("Before request is sent through the filter chain");  
  
        // 继续执行其他过滤器直到服务  
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {  
            // 在响应返回给客户端之后执行  
            System.out.println("After response is returned from the filter chain");  
        }));  
    }  
  
    @Override  
    public int getOrder() {  
        // 设置过滤器的执行顺序,数字越小,优先级越高  
        return -1;  
    }  
}

实现GatewayFilter

如果你想要为特定的路由创建过滤器,可以这样做:

java
import org.springframework.cloud.gateway.filter.GatewayFilter;  
import org.springframework.cloud.gateway.filter.GatewayFilterChain;  
import org.springframework.core.Ordered;  
import org.springframework.web.server.ServerWebExchange;  
import reactor.core.publisher.Mono;  
  
public class MyGatewayFilter implements GatewayFilter, Ordered {  
  
    @Override  
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
        // 在请求被处理之前执行  
        System.out.println("Before request is processed by MyGatewayFilter");  
  
        // 继续执行其他过滤器或服务  
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {  
            // 在响应返回给客户端之后执行  
            System.out.println("After response is processed by MyGatewayFilter");  
        }));  
    }  
  
    @Override  
    public int getOrder() {  
        // 设置过滤器的执行顺序  
        return 0;  
    }  
}

但是,对于GatewayFilter,你通常需要在路由配置中显式地引用它,而Spring Cloud Gateway并不直接支持将自定义的GatewayFilter实现作为Bean注入到路由配置中(至少在不使用额外代码或配置的情况下)。相反,你可以通过实现GatewayFilterFactory来创建可配置的过滤器工厂,然后在YAML或properties文件中配置这些过滤器。

实现GatewayFilterFactory

java
import org.springframework.cloud.gateway.filter.GatewayFilter;  
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;  
import org.springframework.stereotype.Component;  
  
import java.util.function.Predicate;  
  
@Component  
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {  
  
    public MyGatewayFilterFactory() {  
        super(Config.class);  
    }  
  
    public static class Config {  
        // 可以添加配置属性  
    }  
  
    @Override  
    public GatewayFilter apply(Config config) {  
        return (exchange, chain) -> {  
            // 过滤器逻辑  
            System.out.println("Applying MyGatewayFilterFactory with config: " + config);  
            return chain.filter(exchange);  
        };  
    }  
}

五、总结
Spring Cloud Gateway 提供了强大的路由和过滤功能,是微服务架构中不可或缺的一部分。通过合理使用 Spring Cloud Gateway,可以极大地简化客户端与微服务之间的交互,提高系统的可扩展性和可维护性。

标签:网关,Spring,springframework,org,过滤器,import,Gateway,路由
From: https://blog.csdn.net/RHeng/article/details/140925074

相关文章

  • 免费【2024】springboot 大学校园旧物捐赠网站的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 大学生家教管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • springboot+vue酒店信息管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和消费者需求的日益多元化,酒店行业正面临着前所未有的挑战与机遇。传统的酒店管理模式已难以满足现代酒店高效运营、精准服务及客户体验优化的需求。在此背景下,酒店信息管理系统(HotelInformationManagementSys......
  • springboot+vue酒店信息管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,酒店业作为旅游产业链中的重要一环,面临着日益增长的客户需求与激烈的市场竞争。传统的手工管理模式已难以满足现代酒店对高效、精准、个性化服务的需求。在此背景下,开发一套集用户管理、房间类别划分、客房信息展......
  • springboot+vue酒店客房预订系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,酒店行业作为旅游业的重要支柱,面临着日益增长的客户需求和激烈的市场竞争。传统的酒店预订方式,如电话预订或到店预订,已难以满足现代消费者对于便捷性、实时性和个性化服务的高要求。在此背景下,开发一套高效、智能......
  • springboot+vue酒店客房管理系统的设计与实现【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,酒店业作为其核心组成部分,面临着日益增长的客户需求与管理复杂性的双重挑战。传统的手工酒店客房管理方式已难以满足现代酒店高效、精准、便捷的管理需求。宾客对住宿体验的要求不断提高,期望通过数字化手段实现快......
  • SpringBoot-书店信息管理系统+93494(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    基于springboot书店信息管理系统摘 要书店信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图、公告栏、资源管理(图书资讯、资讯分类)交流管理(留言板、留言板分类)系统用户(管理员、顾客用户......
  • springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 系统......
  • springboot宠物在线领养系统-计算机毕业设计源码51181
    摘要随着社会对宠物领养服务的关注不断增加,宠物在线领养系统应运而生。这一系统的设计旨在满足用户对宠物领养的需求,同时借助电子商务行业的快速发展和技术进步,为用户和宠物领养机构提供便捷、安全的在线领养平台。通过充分利用Java的跨平台特性、SpringBoot框架的快速开发......
  • spring bean生命周期中BeanNameAware、BeanFactoryAware或ApplicationContextAwar
    BeanNameAware、BeanFactoryAware和ApplicationContextAware是Spring框架中提供的三个Aware接口,它们允许Bean在生命周期的特定阶段获取关于自身或容器的信息。以下是关于这三个Aware接口的详细解释:1.BeanNameAware定义与功能:BeanNameAware接口允许Bean获取自己在Spring......