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.hqwc.cn/news/457715.html

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

相关文章

Spring框架入门指南

文章目录 Spring特点IoCAOPSpring事务事务隔离级别Spring注解Spring生命周期Spring创建完毕想要初始化一些操作注解的使用与开发Spring配置类加载XML配置文件静态工厂方法和实例工厂方法循环依赖&#xff08;循环引用&#xff09;三级缓存解决循环依赖问题SpringAOP延申动态代理…

Stable Diffusion 模型下载:Schematics(原理图)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 “Schematics”是一个非常个性化的LORA&#xff0c;我的目标是创建一个整体风格&#xff0c;但主要面向某些风格美学&#xff0c;因此它可以用于人物、物体、风景等…

如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0

通过使用社区版&#xff0c;您有能力在您自己的服务器上部署 ONLYOFFICE 文档&#xff0c;从而使在线编辑器与 ​​ONLYOFFICE 协作平台​​​或​​其他热门系统​​进行无缝集成。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档…

视频无损放大修复工具Topaz Video AI 新手入门教程

想要自学Topaz Video AI &#xff1f;Topaz Video AI 如何使用&#xff1f;这里给大家带来了视频无损放大修复工具Topaz Video AI 新手入门教程&#xff0c;快来看看吧&#xff01; 下载&#xff1a;Topaz Video AI for mac 导入您的文件 有两种方法可以将文件导入 Topaz Vid…

用于制作耳机壳的倒模专用UV树脂有什么特点?

制作耳机壳的UV树脂耳机壳UV胶具有以下特点&#xff1a; 快速固化&#xff1a;UV树脂可以在紫外线的照射下迅速固化&#xff0c;大大缩短了制作时间。高硬度与高耐磨性&#xff1a;UV树脂具有较高的硬度和耐磨性&#xff0c;能够提供良好的保护效果。透明度高&#xff1a;UV树…

Stata学习(1)

一、五大窗口 Command窗口&#xff1a;实现人机交互 来导入一个自带数据&#xff1a; sysuse是导入系统自带的数据&#xff0c;auto导入该数据的名称&#xff0c;后面的clear是清除之前的数据 结果窗口&#xff1a;展示计算结果、查找功能 在Edit的find可以实现查找功能&#…

go modules使用

创建项目 在使用GoLand创建项目的时候&#xff0c;会自动创建对应的go.mod文件。 创建完后 创建文件 创建一个main.go的文件&#xff0c;里面print一个hello world。 在运行时可以设置是否采取先生成文件再运行。 为空的话则不输出。 下面的Environment为设置运行的环境…

显示器校准软件:BetterDisplay Pro for Mac v2.0.11激活版下载

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a; BetterDisplay Pro for Mac v2.0.11激活版下载 以下是BetterDisplay Pro的主要…

Multisim14.0仿真(五十五)汽车转向灯设计

一、功能描述&#xff1a; 左转向&#xff1a;左侧指示灯循环依次闪亮&#xff1b; 右转向&#xff1a;右侧指示灯循环依次闪亮&#xff1b; 刹车&#xff1a; 所有灯常亮&#xff1b; 正常&#xff1a; 所有灯熄灭。 二、主要芯片&#xff1a; 74LS161D 74LS04D 74…

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法&#xff0c;这不是一个标准的 API 方法&#xff0c;这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用&#xff0c;它可以执行一段 SQL 脚本。 例如&#xff0c;如下程序使用 executescr…

【Spring Boot】第一篇 创建简单的Spring Boot项目

导航 一. 简介二. 创建简单的Spring Boot项目1. 工具选择和版本确定2. 创建步骤 三. 部署项目四. 测试验证 一. 简介 Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和配置过程&#xff0c;同时提供了很多开箱即用的功能&am…

DAY5.

握手&#xff1a; 第一次握手&#xff1a;客户端发送SYN包给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。 第二次握手&#xff1a;服务器接收到SYN包&#xff0c;确认客户端的SYN&#xff0c;发送ACK包&#xff0c;同时发送一个SYN包&#xff0c;…