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配置类型。

	@Beanpublic 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: 9003spring:application:name: njh-gateway-app  cloud:loadbalancer:ribbon:enabled: falsecache:enabled: truecaffeine: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: Retryargs:retries: 1 				#重试次数- id: njh-biz-appuri: lb://njh-biz-apppredicates:- Path=/api/bizapp/**filters:- name: Retryargs: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_routeuri: lb://USER-SERVICEpredicates:- 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;@Overridepublic 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());}@Overridepublic 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: truegateway:routes:- id: service_routeuri: lb://SERVICE_IDfilters:- AddRequestHeader=X-Request-Redirected, By-Gateway
  1. 自定义Ribbon规则:通过实现IRule接口来创建自定义的Ribbon规则,然后在配置文件中指定这个规则。例如,创建一个自定义的轮询规则:
@Configuration
public class RibbonConfiguration {@Beanpublic 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: falsegateway:routes:- id: service_routeuri: lb://SERVICE_IDfilters:- AddRequestHeader=X-Request-Redirected, By-Gateway

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

  1. 实现LoadBalancerClientFactory接口
public class CustomLoadBalancerClientFactory implements LoadBalancerClientFactory {@Overridepublic LoadBalancerClient create(String serviceId) {// 实现创建自定义LoadBalancerClient的逻辑// 返回自定义的LoadBalancerClient实例return new CustomLoadBalancerClient();}
}
  1. 创建自定义LoadBalancerClient
public class CustomLoadBalancerClient implements LoadBalancerClient {@Overridepublic Mono<ServerWebExchange> execute(Request request, ServerWebExchange exchange) {// 实现自定义的负载均衡逻辑// 返回处理后的ServerWebExchangereturn Mono.just(exchange);}
}
  1. 配置Spring Cloud Gateway使用自定义的负载均衡器
spring:cloud:loadbalancer:client:factory: com.yourpackage.CustomLoadBalancerClientFactory
  1. 使用自定义负载均衡器
@Configuration
public class GatewayConfig {@Beanpublic RouteLocators customRouteLocations(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/customPath/**").uri("lb://CUSTOM_SERVICE")).build();}
}

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

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

相关文章

【VS2022】运行cmake项目

在这里插入代码片https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!This will download and install the official compiler for the Rust programming langua…

go语言每日一练——链表篇(六)

传送门 牛客面试必刷101题—— 判断链表中是否有环 牛客面试必刷101题—— 链表中环的入口结点 题目及解析 题目一 代码 package mainimport . "nc_tools"/** type ListNode struct{* Val int* Next *ListNode* }*//**** param head ListNode类* return bool…

vue3-内置组件-TransitionGroup

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 与 <Transition> 的区别 <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器&…

代驾应用系统(ssm)

登录首页 管理员界面 代驾司机界面 普通用户界面 前台页面 1、系统说明 &#xff08;1&#xff09; 框架&#xff1a;spring、springmvc、mybatis、mysql、jsp &#xff08;2&#xff09; 系统分为前台系统、后端管理系统 2、欢迎留言联系交流学习讨论&#xff1a;qq 97820625…

wsl 安装minikube

Minikube是一种轻量化的Kubernetes集群&#xff0c;专为开发者和学习者设计&#xff0c;以便他们能够更好地学习和体验Kubernetes的功能。它利用个人PC的虚拟化环境&#xff0c;实现了Kubernetes的快速构建和启动。目前&#xff0c;Minikube已经支持在macOS、Linux和Windows平台…

部署 Spring 项目到 Linux 云服务器上

关于 Linux 服务器安装 JDK ,Mysql&#xff0c;配置安全组&#xff08;这些都是必要的&#xff09; 推荐看在 Linux 上搭建 Java Web 项目环境&#xff08;最简单的进行搭建&#xff09; 流程 1.上传Jar包到服务器 要想部署 Spring 项目&#xff0c;先要将 Spring 项目打成 J…

Linux--文件

文件的基本信息 文件是计算机系统中存储数据的一种单位。 它可以是文本、图像、音频、视频等信息的载体。文件通常以特定的格式和拓展名来表示其内容和类型。 在计算机系统中&#xff0c;文件使用文件名来唯一标识和访问。文件可以被创建、读取、写入、复制、移动、删除等操作…

相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Python程序员面试题精选(1)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点。 题目…

嵌入式中IPv5去哪了?

只要使用过电脑的人&#xff0c;99%应该都知道IP地址&#xff0c;前几个月有一个重大的新闻“全球IPv4地址耗尽”相信大家都听说了。 然后IPv6就成了当下发展的趋势&#xff0c;包括有些手机APP会重点标注“兼容IPv6”等信息。那么问题来了&#xff1a;IPv4之后直接是IPv6&…

高灵敏比色法IgG2a (mouse) ELISA kit

用于检测IgG2a&#xff08;小鼠&#xff09;的高灵敏度ELISA试剂盒&#xff0c;仅需90分钟即可得到实验结果 免疫球蛋白G&#xff08;IgG&#xff09;是一种免疫球蛋白单体&#xff0c;由两条&#xff08;γ&#xff09;重链和两条轻链组成。每个IgG分子包含两个抗原结合域和一…

修改JDK文件路径或名称(以及修改后jJRE文件变红的解决)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Vue中对虚拟DOM的理解

作为现代前端开发中的主流框架之一&#xff0c;Vue.js是一个非常流行的JavaScript框架&#xff0c;其核心概念之一就是虚拟DOM&#xff08;Virtual DOM&#xff09;。在本篇文章中&#xff0c;我们将深入探讨Vue中虚拟DOM的概念&#xff0c;并讨论为什么它在前端开发中如此重要…

mfc110.dll是什么?解决mfc110.dll丢失windows系统常见问题

今天我在打开电脑软件时候&#xff0c;突然报错出现找不到mfc110.dll丢失&#xff0c;无法打开软件&#xff0c;我不知道是什么原因&#xff0c;后面找了很久才找到解决方法&#xff0c;那么mfc110.dll是什么&#xff1f;为什么会丢失和mfc110.dll解决方法是什么&#xff0c;今…

vue3项目中使用mapv

vue3项目中使用mapv mapv是百度地图官方提供的地图数据可视化开源项目&#xff0c;提供了很多效果酷炫的绘图api mapv地址在这里&#xff0c;示例图在这里 先解释为什么要用mapv echarts画的地图&#xff0c;都是行政区划&#xff0c;就算是geo地图&#xff0c;也只能在行政…

【计算机网络】17、http request header Origin 属性、跨域 CORS、同源、nginx 反向代理、预检请求

文章目录 一、Origin 含义二、跨源资源共享&#xff1a;**Cross-Origin Resource Sharing** CORS2.1 跨域的定义2.2 功能概述2.3 场景示例2.3.1 简单请求2.3.2 Preflighted requests&#xff1a;预检请求 2.4 header2.4.1 http request header2.4.1.1 Origin2.4.1.2 Access-Con…

python 动态数据 展示 ,数据是由51单片机发送过来的,温度传感器。

import tkinter as tk import randomimport seriallis[] for i in range(50):lis.append(i1) # 打开串行端口 ser serial.Serial(COM3, 9600) # 9600为波特率&#xff0c;根据实际情况进行调整# 初始化数据 lis [random.randint(15, 35) for _ in range(50)]def update_data…

时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型 LSTM(长短期记忆)是一种递归神经网络(RNN)的变体,它在序列数据建模方面表现出色。电力负荷预测是一项重要的任务,可以利用LSTM神经网络…

Damn Small Linux 停更16年后,2024 回归更新

Damn Small Linux(DSL) 发行版释出了最新的 2024 版本&#xff0c;并重新定义了什么叫“Damn Small”。 DSL 诞生于 2005 年&#xff0c;原本是尝试提供一个 50MB 大小的 LiveCD&#xff0c;2008 年开发停滞。 2024 年原作者 John Andrews 宣布 DSL 复活&#xff0c;在几乎所…

再这么烂下去,离糊就不远了。别让才华被埋没。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 近日&#xff0c;胡歌凭借电视剧《繁花》荣登《环球银幕》二月…