SpringCloud--Gateway解析

一、Gateway简介

Gateway是Spring Cloud官方推出的第二代微服务网关,它旨在提供统一的路由方式以及为微服务应用提供强大的负载均衡能力。与第一代Spring Cloud Netflix Zuul相比,Spring Cloud Gateway在性能、可扩展性、易用性等方面都有了显著的提升。其主要特性有以下几点:

  1. 基于Spring Boot 和Spring Cloud 开发,支持RESTful和WebSocket;
  2. 支持通过Feign或RestTemplate进行服务调用;
  3. 支持负载均衡、熔断、限流等操作;
  4. 支持动态路由、灵活的路由策略;
  5. 支持多种协议,如HTTP、WebSocket等。

二、Gateway工作流程

在这里插入图片描述
Spring Cloud Gateway的工作流程主要包括以下几个步骤:

  1. 客户端请求到达Gateway。
  2. 再由Gateway Handler Mapping根据请求路径匹配路由表,找到对应的路由规则。路由规则中包含断言,再根据断言规则对请求进行匹配,只有当请求符合断言规则时才会继续转发到Gateway Web Handler进行处理。
  3. Gateway Web Handler会根据路由规则将该请求转发到目标服务实例。
  4. 在将请求转发到目标服务实例前会经过过滤器的处理。
  5. 通过过滤器对该请求的处理后,最后到达目标服务进行该请求的处理。
  6. 目标服务处理完成后,将响应结果再根据路由规则并应用过滤器对响应进行处理,最后将响应返回给客户端。

三、Gateway使用

  1. 在项目中创建一个Gateway模块,在其中pom文件中引入gataway、nacos、以及loadbalancer的依赖。
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		 <!-- gateway -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-gateway</artifactId>
		</dependency>
		 <!-- SpringCloud 负载均衡 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-loadbalancer</artifactId>
		</dependency>
	</dependencies>

在这里插入图片描述
3. 路由配置,可以在YML中配置,也可以通过配置类@Configuration,这两种方式的功能一样,建议使用在YML中配置。
(1)配置类方式:通过@Bean注入一个RouteLocator配置类型。

	@Bean
	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		return builder.routes()
			.route("path_route", r -> r.path("/get")
				.uri("http://httpbin.org"))
			.route("host_route", r -> r.host("*.myhost.org")
				.uri("http://httpbin.org"))
			.route("hystrix_route", r -> r.host("*.hystrix.org")
				.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
				.uri("http://httpbin.org"))
			.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
				.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
				.uri("http://httpbin.org"))
			.build();
	}

(2)YML文件配置方式:

# 服务配置
server:
  port: 9003

spring:
  application:
    name: njh-gateway-app  
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
      cache:
        enabled: true
        caffeine:
          spec: initialCapacity=500,expireAfterWrite=5s
    # nacos配置
    nacos:
      discovery:
        server-addr: ${spring.cloud.nacos.config.server-addr}
        namespace: ${spring.cloud.nacos.config.namespace}
        group: ${spring.cloud.nacos.config.group}
        username: ${spring.cloud.nacos.config.username}
        password: ${spring.cloud.nacos.config.password}
    # gateway配置
    gateway:
      routes:
        - id: njh-web-app				#路由id,保证唯一,这里配置成服务名
          uri: lb://njh-web-app			#匹配成功后路由的服务,lb表示启用负载均衡
          predicates:
            - Path=/api/webapp/**		#断言,根据路径进行匹配
          filters:
            - name: Retry
              args:
                retries: 1 				#重试次数
        - id: njh-biz-app
          uri: lb://njh-biz-app
          predicates:
            - Path=/api/bizapp/**
          filters:
            - name: Retry
              args:
                retries: 1 #重试次数

这样配置完后,当请求到达gateway后就会根据请求的路径进行匹配,然后将其转发到指定的服务去进行处理。例如:上面yml文件中配置的,请求中所有包含/api/webapp/路径的请求都会转发到njh-web-app服务上进行处理,所有包含/api/bizapp/路径的请求都会转发到njh-biz-app服务上进行处理。

四、Gateway三大核心组件

Gateway的三大组件通常指的是路由(Routing)、断言(Assertions)和过滤器(Filters)。通过这三大组件共同协作,使得Spring Cloud Gateway可以灵活地处理各种网络请求,并提供强大的API网关功能。

  1. 路由(Routing):路由是Spring Cloud Gateway中的基本组成,它由ID、目标URL、断言和过滤器组成。路由定义了如何将请求路由到特定的微服务。下面是routes属性的一些关键组成部分:
spring:
  cloud:
    gateway:
      routes:
        - id: user_service_route
          uri: lb://USER-SERVICE
          predicates:
            - Path=/users/**
          filters:
            - RewritePath=/users/(?<remaining>.*), /$\{remaining}
id:路由的唯一标识符。上面设置为user_service_route。
uri:请求被转发到的目标服务的URI。上面使用服务发现(lb://USER-SERVICE)来找到并转发请求到用户服务。
predicates:一组断言(条件),用于匹配请求。如果断言条件满足,请求将被路由到相应的URI。上面配置中的Path=/users/**断言匹配所有以/users/开头的路径。
filters:一组过滤器,用于在请求到达目标服务之前或响应返回客户端之后对请求和响应进行操作。上面配置中的RewritePath过滤器用于重写路径,移除/users/前缀。
  1. 断言(Assertions):断言主要用于匹配请求,只有当断言为true时,请求才会被路由到相应的URI。Spring Cloud Gateway提供了多种方式来定义断言,例如路径匹配、参数匹配等。Spring Cloud Gateway提供了多种内置的断言工厂,例如:
    • Path:根据请求路径匹配断言。例如,Path=/api/**会匹配任何以/api/开头的路径。
    • Query:根据请求查询参数匹配断言。例如,Query=name,aaa会匹配查询参数中包含name=aaa的请求。
    • Header:根据请求头匹配断言。例如,Header=X-Requested-By,myapp会匹配请求头中包含X-Requested-By: myapp的请求。
    • Method:根据HTTP请求方法匹配断言。例如,Method=GET仅匹配GET请求。
    • Cookie:根据请求中的Cookie值匹配断言。例如,Cookie=session,mySessionId会匹配cookie中包含session=mySessionId的请求。
    • Host=:根据请求的主机头匹配。例如,Host=**.example.com会匹配任何以example.com结尾的主机头。
  2. 过滤器(Filters):过滤器是Spring Cloud Gateway的核心组件之一,它可以在请求转发到相应微服务之前或之后执行一些操作,例如请求转发、响应修改、限流、认证等。Spring Cloud Gateway提供了许多默认的过滤器,同时也允许开发者自定义过滤器以满足特定的需求。过滤器可以链式执行,即一个请求可以经过多个过滤器的处理。每个过滤器都能够访问到请求和响应对象,并对它们进行修改。以下是一些常用的内置GatewayFilter类型:
    • AddRequestHeader:向请求添加一个新的头部信息。
    • AddResponseHeader:向响应添加一个新的头部信息。
    • RewritePath:重写请求的路径。
    • RemoveRequestHeader:从请求中移除一个头部信息。
    • Hystrix:为网关提供断路器功能,防止服务故障导致网关崩溃。
    • StripPrefix=2:去掉Path中前两个节点。

五、实现自定义过滤器

在Spring Cloud Gateway中实现自定义Filter主要分为以下几个步骤:

  1. 创建一个类实现GlobalFilter接口或者GatewayFilter接口。GlobalFilter允许你创建全局过滤器,而GatewayFilter通常用于创建特定路由的过滤器。
  2. 在该类中,实现filter方法,该方法接收ServerWebExchange对象和GatewayFilterChain对象作为参数。
  3. 通过ServerWebExchange对象,你可以访问和修改请求和响应的信息。
  4. 调用GatewayFilterChain对象的filter方法来继续执行后续的过滤器链。
  5. 如果需要,可以通过实现Ordered接口来指定过滤器的执行顺序。
  6. 要使Spring Cloud Gateway识别并使用这个自定义过滤器,需要在启动类上添加@EnableGatewayWebFlux注解,并确保自定义过滤器组件被Spring容器扫描到。
@Component
public class CustomRequestHeaderFilter implements GatewayFilter, Ordered {

    private static final int DEFAULT_ORDER = 0;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 添加自定义请求头
        ServerHttpRequest request = exchange.getRequest().mutate()
                .header("X-Custom-Header", "MyCustomValue")
                .build();
        
        // 将修改后的请求传递给下一个过滤器
        return chain.filter(exchange.mutate().request(request).build());
    }

    @Override
    public int getOrder() {
        // 返回过滤器的执行顺序,值越小,优先级越高。
        return DEFAULT_ORDER;
    }
}

六、实现负载均衡

在Spring Cloud Gateway中实现负载均衡主要依赖于内置的负载均衡器或者集成的服务发现组件。以下是实现负载均衡的几种方式:
(1)使用Ribbon实现负载均衡:
默认使用Netflix Ribbon作为负载均衡器。要启用Ribbon负载均衡,需要在application.yml配置文件中添加相关配置。

  1. 添加依赖,在pom.xml文件中添加以下依赖:
<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!-- Spring Cloud Ribbon -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    <!-- Eureka (如果使用服务发现) -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
  1. 在application.yml中配置Ribbon,启用服务发现功能:
spring:
  cloud:
    nacos:
      discovery:
        enabled: true
    gateway:
      routes:
        - id: service_route
          uri: lb://SERVICE_ID
          filters:
            - AddRequestHeader=X-Request-Redirected, By-Gateway
  1. 自定义Ribbon规则:通过实现IRule接口来创建自定义的Ribbon规则,然后在配置文件中指定这个规则。例如,创建一个自定义的轮询规则:
@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule() {
        return new RoundRobinRule();
    }
}

# 在application.yml中引用这个规则:
spring:
  ribbon:
    NFLoadBalancerRuleClassName: com.yourpackage.RibbonConfiguration$YourCustomRule

(2)基于Spring Cloud LoadBalancer的负载均衡:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 在application.yml文件中配置路由
# 禁用ribbon
spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
     
     gateway:
       routes:
        - id: service_route
          uri: lb://SERVICE_ID
          filters:
            - AddRequestHeader=X-Request-Redirected, By-Gateway

(3)自定义负载均衡器:
在Spring Cloud Gateway中,自定义负载均衡器可以通过实现LoadBalancerClientFactory接口来完成。

  1. 实现LoadBalancerClientFactory接口
public class CustomLoadBalancerClientFactory implements LoadBalancerClientFactory {

    @Override
    public LoadBalancerClient create(String serviceId) {
        // 实现创建自定义LoadBalancerClient的逻辑
        // 返回自定义的LoadBalancerClient实例
        return new CustomLoadBalancerClient();
    }
}
  1. 创建自定义LoadBalancerClient
public class CustomLoadBalancerClient implements LoadBalancerClient {

    @Override
    public Mono<ServerWebExchange> execute(Request request, ServerWebExchange exchange) {
        // 实现自定义的负载均衡逻辑
        // 返回处理后的ServerWebExchange
        return Mono.just(exchange);
    }
}
  1. 配置Spring Cloud Gateway使用自定义的负载均衡器
spring:
  cloud:
    loadbalancer:
      client:
        factory: com.yourpackage.CustomLoadBalancerClientFactory
  1. 使用自定义负载均衡器
@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocators customRouteLocations(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("path_route", r -> r.path("/customPath/**")
                .uri("lb://CUSTOM_SERVICE"))
            .build();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式&#xff0c;把程序或者项目分为三个主要组成部分&#xff0c;Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…

使用Launch4j将jar包转成.exe可执行文件

Launch4j官网:Launch4j - Cross-platform Java executable wrapper 然后点击上面按钮 随便写个文件名

分享66个相册特效,总有一款适合您

分享66个相册特效&#xff0c;总有一款适合您 66个相册特效下载链接&#xff1a;https://pan.baidu.com/s/1jqctaho4sL_iGSNExhWB6A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

FastDFS安装并整合Openresty

FastDFS安装并整合Openresty 一、安装环境准备【CentOS7.9】二、FastDFS--tracker安装2.1.下载fastdfs2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.安装之后文件目录介绍2.8.错误处理2.9.配…

Android SystemConfig相关

SystemConfig在哪里初始化 它声明在PackageManagerService类的静态方法main()中。在该方法中间定义Injector类对象时&#xff0c;作为它的构造参数。它是调用的SystemConfig.getInstance()实现初始化&#xff0c;之后能通过Injector类对象的getSystemConfig()得到SystemConfig类…

Python贝尔多项式

文章目录 Bell数和Bell多项式第二类Bell多项式 Bell数和Bell多项式 Bell&#xff0c;即所有包含 n n n个对象的有限集合的子集数之和&#xff0c;可通过递推式进行定义 B n ∑ k 0 n − 1 ( n − 1 k ) B k , B 0 1 B_n\sum^{n-1}_{k0}\begin{pmatrix} n-1\\k \end{pmatrix…

Select 选择器 el-option 回显错误 value

离谱 回显的内容不是 label 而是 value 的值 返回官方看说明&#xff1a; v-model的值为当前被选中的el-option的 value 属性值 value / v-model 绑定值有3种类型 boolean / string / number 根据自身代码猜测是&#xff1a;tableData.bookId 与 item.id 类型不一致导致 &…

LabVIEW伺服阀性能参数测试

LabVIEW伺服阀性能参数测试 伺服阀作为电液伺服系统中的核心元件&#xff0c;其性能参数的准确测试对保证系统整体性能至关重要。开发了一种基于LabVIEW软件开发的伺服阀性能参数测试系统&#xff0c;提高测试的自动化程度和精确性&#xff0c;同时降低操作复杂度和成本。 传…

python + numpy test

1. 2. What is the correct syntax to output the type of a variable or object in Python? Syntax of the Python type() functionThe type() function 3. upper() 全大写 lower() 全小写 4. 接下来是Numpy部分 1. What is a correct syntax to check the number of di…

一条 SQL 查询语句是如何执行的

MySQL 的基本架构示意图 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

VitePress-12-markdown中使用vue的语法

前言 VitePress 中&#xff0c;markdown文档最终都会转换成为 html文件&#xff0c;我们在访问的时候&#xff0c;也是直接访问的 xxx.html 文件。而且&#xff0c;markdown文档会被作为 [vue单文件] 进行处理&#xff0c;因此&#xff0c;我们我们可以在文档中使用 vue 语法&…

C#,雷卡曼数(Recamán Number)的算法与源代码

1 雷卡曼数&#xff08;Recamn Number&#xff09; 雷卡曼数&#xff08;Recamn Number&#xff09;&#xff0c;即Recaman序列被定义如下&#xff1a; (1) a[0]0; (2) 如果a[m-1]-m>0并且这个值在序列中不存在&#xff0c;则a[m]a[m-1]-m; (3) 否则a[m]a[m-1]m; 雷卡曼序…

c#安全-nativeAOT

文章目录 前记AOT测试反序列化Emit 前记 JIT\AOT JIT编译器&#xff08;Just-in-Time Complier&#xff09;,AOT编译器&#xff08;Ahead-of-Time Complier&#xff09;。 AOT测试 首先编译一段普通代码 using System; using System.Runtime.InteropServices; namespace co…

【Linux系统学习】5.Linux实用操作 下

7.虚拟机配置固定IP 7.1 为什么需要固定IP 当前我们虚拟机的Linux操作系统&#xff0c;其IP地址是通过DHCP服务获取的。 DHCP&#xff1a;动态获取IP地址&#xff0c;即每次重启设备后都会获取一次&#xff0c;可能导致IP地址频繁变更 原因1&#xff1a;办公电脑IP地址变化无所…

嵌入式学习之Linux入门篇笔记——12,Linux文件系统概念

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是文件系统&#xff1f; 操作系统中负责管理和存储文件系统…

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_ID-41dsdde…

|Python新手小白低级教程|第十九章:函数(1)

文章目录 前言一、概说二、方法def简介1.示例&#xff1a;使用def关键字制作功能函数——找最大最小2.代码剖析示例代码Part 1示例代码Part 2示例代码Part 3练习1.1制作函数 三、灵活使用函数1.制作一种函数&#xff0c;函数名和格式为even_num(a,b)&#xff0c;输入a&#xff…

VSTO打包Word插件WPS也支持

启动AdvancedInstallerPortable.exe打包软件 选择“加载项” 选择“office加载项”之后点“创建项目” 四、输入自已的插件名和公司名 任选一种包类型 五、选择包的保存位置 勾选“vsto office加载项” 六、选择要打包的项目debug文件夹 选择相应版本 配置相应环境 选择语言 添…

《雾锁王国》服务器怎么搭建,阿里云一键部署雾锁王国新手教程

上次讲了怎么搭建幻兽帕鲁服务器&#xff0c;今天讲讲如何搭建雾锁王国服务器&#xff0c;其实方法也非常简单&#xff0c;跟幻兽帕鲁一样&#xff0c;都是可以通过一键部署的方式来搭建的。 下面将会讲两种搭建《雾锁王国》服务器的方式&#xff0c;一种是你没有买过服务器&a…