首页 > 其他分享 >Spring cloud 微服务 Gateway 项目中使用

Spring cloud 微服务 Gateway 项目中使用

时间:2025-01-06 09:01:15浏览次数:3  
标签:Spring springframework cloud org 过滤器 import Gateway 路由

文章目录


在这里插入图片描述

概述

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个关键组件,用于实现 API 网关功能。它基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.x 构建,旨在提供一种简单且有效的方式来路由到 API 微服务,并为它们提供横切关注点(如:安全性、监控/指标、限流等)。以下是对 Spring Cloud Gateway 的详细解析。

项目引入

pom 文件
<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-gateway</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-loadbalancer</artifactId>
	</dependency>
</dependencies>
  • spring-cloud-starter-gateway
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
    • 描述: 这个 Starter 提供了 Spring Cloud Gateway 的核心功能,包括路由管理、断言(Predicates)、过滤器(Filters)等。
    • 用途: 用于定义和管理 API 网关,处理请求路由到不同的后端微服务,并提供诸如限流、安全性和日志记录等功能。
  • spring-cloud-starter-alibaba-nacos-discovery
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    • 描述: 这是阿里巴巴开源的 Nacos 客户端,它集成了 Spring Cloud 生态系统,提供了服务发现和配置管理的功能。
    • 用途:
      服务注册与发现: 微服务可以自动向 Nacos 注册自己,并从 Nacos 获取其他服务的位置信息。
      动态配置管理: 支持从 Nacos 动态加载和更新应用程序配置,而无需重启服务。
  • spring-cloud-starter-loadbalancer
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
    • 描述: 这是一个轻量级的负载均衡器实现,它取代了早期版本中的 Ribbon,默认使用 Reactor Netty 实现非阻塞 HTTP 请求。
    • 用途:
      客户端负载均衡: 在调用远程服务时,LoadBalancerClient 可以根据一定的策略选择最合适的服务实例。
      与 Nacos 集成: 结合 Nacos Discovery 使用时,可以自动获取服务实例列表,并进行智能路由。

当这三个依赖一起使用时,你可以构建一个具备以下特性的微服务网关:
自动服务发现: 微服务通过 Nacos 自动注册和服务发现,使得网关能够动态地了解所有可用的服务实例。
智能路由: 基于路径、主机名或其他条件将流量路由到适当的服务实例。
负载均衡: 利用 spring-cloud-starter-loadbalancer 提供的负载均衡能力,确保请求均匀分布到各个服务实例上。

yaml 文件
spring:
  application:
    name: hm-gateway
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: item-service
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**,/addresses/**
        - id: cart-service
          uri: lb://cart-service
          predicates:
            - Path=/carts/**
      default-filters:
        - AddRequestHeader=truth, anyone long-press like button will be rich
        - PrintAny=1,2,3
  • 服务配置

    spring:
      application:
    	 name: hm-gateway
    

    定义 该网关微服务名称信息

  • nacos配置

    cloud:
       nacos:
       	server-addr: 127.0.0.1:8848
    

    指定了 Nacos 服务器的地址,用于服务注册与发现。确保你的 Nacos 服务器正在运行,并且可以从网关服务访问。

  • 网关配置

    gateway:
      routes:
    	- id: item-service
    	  uri: lb://item-service
    	  predicates:
    		- Path=/items/**,/search/**
    	- id: user-service
    	  uri: lb://user-service
    	  predicates:
    		- Path=/users/**,/addresses/**
    	- id: cart-service
    	  uri: lb://cart-service
    	  predicates:
    		- Path=/carts/**
    

    在这里插入图片描述

    • id: 路由的唯一标识符。
    • uri: 目标服务的 URI,使用 lb:// 表示通过负载均衡器访问的服务名。
    • predicates: 匹配条件,这里使用的是路径匹配(Path),指定了哪些 URL 模式应该被路由到相应服务。
  • 全局过滤器配置

    default-filters:
    	- AddRequestHeader=truth, anyone long-press like button will be rich
    	- PrintAny=1,2,3
    

    AddRequestHeader: 在所有匹配的请求中添加一个名为 truth 的请求头,其值为 anyone long-press like button will be rich。
    PrintAny: 这个过滤器看起来不是标准的 Spring Cloud Gateway 过滤器,可能是一个自定义实现或笔误。如果你想要打印某些信息,可以考虑使用 AddResponseHeader 或者创建一个自定义的全局过滤器。

配置全局过滤器跟局部自定义过滤器

全局过滤器

全局过滤器(Global Filters)在 Spring Cloud Gateway 中是一个非常重要的概念,它们允许你对所有路由请求应用通用的行为。与特定于某个路由的过滤器不同,全局过滤器会在每个请求通过网关时自动执行,无论请求匹配哪个路由规则。
全局过滤器的特点

  • 自动应用: 无需为每个路由单独配置,自动应用于所有路由。
  • 灵活控制: 可以根据需要添加、移除或调整全局过滤器的行为。
  • 集中管理: 提供了一个集中的地方来处理横切关注点,如日志记录、安全检查、性能监控等。

实现自定义全局过滤器
要创建一个自定义的全局过滤器,你需要实现 GlobalFilter 接口,并将其注册为 Spring Bean。下面是一个简单的例子,展示了如何创建和配置一个全局过滤器。

package com.hmall.gateway.filters;

import com.hmall.common.exception.UnauthorizedException;
import com.hmall.gateway.config.AuthProperties;
import com.hmall.gateway.utils.JwtTool;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 放行
         return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
局部自定义过滤器

局部自定义过滤器(Local Custom Filters),也称为 GatewayFilter,是 Spring Cloud Gateway 中用于针对特定路由规则应用过滤逻辑的组件。与全局过滤器不同,局部过滤器只会影响配置了它的那些路由,并且可以在每个路由的基础上进行定制化配置。这使得局部过滤器非常适合处理特定服务或 API 端点的需求,比如添加请求头、修改路径、记录响应时间等。
局部过滤器的特点

  • 针对性:仅应用于指定的路由,允许开发者为不同的服务或端点设置独特的过滤行为。
  • 灵活性:可以根据业务需求自由定制过滤器的行为,支持复杂的业务逻辑实现。
  • 组合使用:多个局部过滤器可以按需组合在一起,形成更复杂的处理链。

创建自定义局部过滤器
要创建一个自定义的局部过滤器,你需要实现 GatewayFilter 接口,并重写其 filter 方法。为了简化开发过程,通常会继承 AbstractGatewayFilterFactory 或者 AbstractNameValueGatewayFilterFactory 抽象类之一。下面是一个具体的例子,展示了如何创建局部过滤器:

@Component
public class PrintAnyGatewayFilterFactory  extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {
    @Override
    public GatewayFilter apply(Config config) {
        // 使用内部装饰类,定义启动顺序
        return new OrderedGatewayFilter(new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                String a = config.getA();
                String b = config.getB();
                String c = config.getC();
                System.out.println(a + b + c);
                System.out.println("PrintAnyGateway 执行了");
                return chain.filter(exchange);
            }
        }, 1);
    }

    @Data
    public static class Config{
        private String a;
        private String b;
        private String c;
    }

    public PrintAnyGatewayFilterFactory(){
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return List.of("a", "b", "c");
    }
}

标签:Spring,springframework,cloud,org,过滤器,import,Gateway,路由
From: https://blog.csdn.net/ling_zhi_xin/article/details/144955399

相关文章

  • 基于SpringBoot+Vue+Uniapp外卖点餐小程序(可用作毕业设计/课程设计)
    介绍本项目是专门为校园食堂和校园商家所定制的一款软件产品,包括系统管理后台和移动端的两个部分,其中系统管理后台主要提供给校园食堂,校园商家内部人员以及系统管理来使用,普通商家可以对店铺的外卖单品,外卖订单,外卖分类进行管理与维护,系统管理员具有更高权限可以对商家,用户......
  • Spring Boot 中的虚拟线程
    什么是虚拟线程?虚拟线程(VirtualThreads)是Java19引入的一项新特性,它属于ProjectLoom项目的一部分。与传统的线程(平台线程)不同,虚拟线程并不是由操作系统直接管理,而是由Java虚拟机(JVM)控制。虚拟线程在操作系统层面非常轻量,可以支持大量并发线程,而不会导致过高的内存占用......
  • 【SpringBoot】当 @PathVariable 遇到 /,如何处理
    1.问题复现在解析一个URL时,我们经常会使用@PathVariable这个注解。例如我们会经常见到如下风格的代码:@RestController@Slf4jpublicclassHelloWorldController{@RequestMapping(path="/hi1/{name}",method=RequestMethod.GET)publicStringhell......
  • springboot没加@ResponseBody注解导致的循环调用
    一、问题背景为了自定义后端返回异常,在代码中使用了全局异常处理器如下:@ControllerAdvicepublicclassGlobalExceptionHandler{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value=BusinessExcep......
  • Spring Boot 集成 Easysearch 完整指南
    Easysearch的很多用户都有这样的需要,之前是用的ES,现在要迁移到Easysearch,但是业务方使用的是SpringBoot集成的客户端,问是否能平滑迁移。Easysearch是完全兼容SpringBoot的,完全不用修改,本指南将探讨如何将SpringBoot和ES的high-level客户端与Easysearch进行集......
  • 基于java的SpringBoot/SSM+Vue+uniapp的德云社票务系统的详细设计和实现(源码+lw+部署
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • SpringBoot进阶教程(八十四)spring-retry
    在日常的一些场景中,很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,某些场景需要对一些异常情况下的方法进行重试就会用到spring-retry。spring-retry可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释......
  • Spring Boot注解大揭秘:掌握Spring Boot精髓
    首先,想象一下你正在搭建一个超级英雄团队,每个注解就像是团队里不同的角色,他们都有各自的任务。1.@SpringBootApplication:这是团队的队长,也就是“启动者”。当你把这个注解放在一个类上时,它就像是告诉SpringBoot:“嘿,从这里开始,准备启动我的超级英雄团队啦!”然后,它会去找到团......
  • 为了解决服务启动慢的问题,我为什么要给Apollo和Spring提交PR?
    最近在整理之前记录的工作笔记时,看到之前给团队内一组服务优化启动耗时记录的笔记,简单整理了一下分享出来。问题原因并不复杂,主要是如何精准测量和分析,优化后如何定量测量优化效果,说人话就是用实际数据证明优化效果。背景团队内有一组服务启动明显较其它服务要慢(线上启动超过2分......
  • 快速构建企业级Java应用的利器——SpringBoot脚手架
     GitHub: 项目地址_GitHub(推荐github访问)Gitee: 项目地址_国内访问你是否在开发企业级Java应用时,被繁琐的配置和集成所困扰?是否希望有一个功能齐全、开箱即用的框架来加速你的项目开发?一款集成了主流技术组件的企业级SpringBoot脚手架项目。这个项目已经在GitHub和Gitee上......