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,一经查实,立即删除!

相关文章

(29)数组异或操作

文章目录 每日一言题目解题思路方法一方法二 代码方法一方法二 结语 每日一言 泉涸&#xff0c;鱼相与处于陆&#xff0c;相呴以湿&#xff0c;相濡以沫&#xff0c;不如相忘于江湖。 --庄子内篇大宗师 题目 题目链接&#xff1a;数组异或操作 给你两个整数&#xff0c;n 和…

【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…

Python的属性查找机制的学习笔记

Python中属性查找机制的描述如下&#xff1a; 描述符方法&#xff1a;如果一个类的属性是由描述符定义的&#xff08;即实现了__get__()、__set__()或__delete__()方法&#xff09;&#xff0c;Python会首先调用相应的描述符方法。例如&#xff0c;如果一个属性有__get__()方法…

前端下载文件有哪些方式

前端下载文件有哪些方式 在前端&#xff0c;最常见和最常用的文件下载方式是&#xff1a; 使用 标签的 download 属性&#xff1a; 创建一个 标签&#xff0c;并设置其 href 属性为文件的 URL&#xff0c;然后使用 download 属性指定下载的文件名。 这种方式简单直接&…

作业5.......

封装strcat #include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { int i0; char arr[30]; char brr[30]; gets(arr); gets(brr); for(i0;i<strlen(brr);i) { arr[istrlen(brr)]brr[i]; printf("%d…

SpringBoot - 不加 @EnableCaching 标签也一样可以在 Redis 中存储缓存?

网上文章都是说需要在 Application 上加 EnableCaching 注解才能让缓存使用 Redis&#xff0c;但是测试发现不用 EnableCaching 也可以使用 Redis&#xff0c;是网上文章有问题吗&#xff1f; 现在 Application 上用了 EnableAsync&#xff0c;SpringBootApplication&#xff0…

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

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

curl命令忽略不受信任的https安全限制

用curl命令没有得到返回&#xff0c;还报了个提示&#xff1a; curl: (60) Issuer certificate is invalid. More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a “bundle” of Certificate Authorit…

vue3-内置组件-TransitionGroup

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

linux centos安装LibreOffice

1.下载安装包 #下载安装包 cd /opt wget https://mirror.cyberbits.eu/tdf/libreoffice/stable/24.2.0/rpm/x86_64/LibreOffice_24.2.0_Linux_x86-64_rpm.tar.gz2.解压安装包 #解压安装包 tar -zxvf LibreOffice_24.2.0_Linux_x86-64_rpm.tar.gz3.安装 #安装 cd /opt/LibreO…

Elasticsearch单个索引数据量过大的优化

当Elasticsearch&#xff08;ES&#xff09;中的单个索引&#xff08;index&#xff09;的数据量变得过大时&#xff0c;可能会遇到性能下降、查询缓慢、管理困难等问题。为了优化和应对大索引的挑战&#xff0c;可以考虑以下策略&#xff1a; 1. 使用分片和副本 分片&#xf…

aspose-words字体转换

aspose-words字体转换 简介 项目中经常遇到文档处理时,甲方要求字体需要替换,或者转出来的文档字体对不上,反反复复改非常繁琐,这时候我们就需要aspose-words来替换字体,选择合适的,项目上需要的,各种各样的字体刚好aspose-words提供了相关的方法,就是使用使用 TrueTy…

代驾应用系统(ssm)

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

链表:反转链表

反转链表 反转链表&#xff0c;常用的方法有迭代&#xff0c;栈反转&#xff0c;递归反转。 迭代 比如&#xff0c;现有链表1->2->3->4->5&#xff0c; 首先&#xff0c;从第一个节点开始&#xff0c;反转&#xff0c;将1->null&#xff0c; 接着向下一个节点…

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;文件使用文件名来唯一标识和访问。文件可以被创建、读取、写入、复制、移动、删除等操作…

django密码管理器(创建项目)

目录 创建项目 安装django 创建项目(django-admin) 创建管理员用户 创建数据库 创建项目 新建一个项目文件夹&#xff0c;如"密码管理器" 安装django 要先安装pip,pip安装地址:pypi.org、pypi.python.org、cheeseshop.python.org pip install django 创建项…

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

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

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

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