前言
在微服务架构中,每个服务通常都有自己的API接口,这些接口可能会有不同的URL路径、请求方法、认证方式等。当客户端需要访问多个服务时,需要对每个服务的接口进行管理和调用,这会增加客户端的复杂性和开发工作量。
为了简化客户端的调用和管理,引入网关是一种常见的做法。网关作为服务调用的入口,可以将客户端的请求转发到不同的后端服务,并提供统一的接口和协议。这样,客户端只需要与网关进行交互,而不需要直接与后端服务进行通信。
Gateway介绍
Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的API网关。它是Spring Cloud生态系统中的一部分,用于构建微服务架构中的边缘服务。Spring Cloud Gateway的主要作用如下:
-
路由转发:Spring Cloud Gateway可以根据请求的路径、方法、头部等信息将请求转发到不同的目标服务。它支持动态路由配置,可以根据需要动态地添加、删除或修改路由规则。
-
负载均衡:Spring Cloud Gateway可以与服务注册中心集成,自动发现并负载均衡请求到后端的多个实例。它支持多种负载均衡算法,如轮询、随机、权重等。
-
过滤器:Spring Cloud Gateway内置了许多过滤器,用于在请求被转发到目标服务之前或之后进行一些处理。这些过滤器可以用于请求鉴权、请求日志记录、请求重试、请求限流等。
-
熔断器:Spring Cloud Gateway可以集成熔断器,当目标服务出现故障或超时时,可以自动触发熔断机制,避免请求堆积和服务雪崩。
-
监控和统计:Spring Cloud Gateway提供了丰富的监控和统计功能,可以实时查看请求的流量、延迟、错误率等指标,帮助开发人员快速定位和解决问题。
Spring Cloud Gateway是一个灵活、可扩展且功能强大的API网关,可以帮助开发人员快速构建和管理微服务架构中的边缘服务。它提供了路由转发、负载均衡、过滤器、熔断器、监控和统计等功能,使得微服务架构更加稳定、可靠和易于管理。
Gateway的工作原理
-
客户端发送请求:客户端发送请求到Spring Cloud Gateway。
-
路由匹配:Gateway根据请求的URL路径、请求方法、头部等信息,匹配对应的路由规则。
-
路由转发:根据匹配到的路由规则,Gateway将请求转发到相应的后端服务。它可以与服务注册中心集成,自动发现并负载均衡请求到后端的多个实例。
-
过滤器处理:Gateway可以在请求被转发到后端服务之前或之后,通过过滤器对请求进行处理。过滤器可以用于请求鉴权、请求日志记录、请求重试、请求限流等。
-
返回响应:后端服务处理完请求后,将响应返回给Gateway。Gateway可以对响应进行处理,例如添加头部、修改响应内容等。
-
返回给客户端:Gateway将经过处理的响应返回给客户端。
Gateway的使用
添加依赖
<!-- 引入gateway网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
路由配置
spring:
cloud:
gateway:
# 路由数组:指当请求满足什么样的断言时,转发到哪个服务上
routes:
# 路由标识,要求唯一,名称任意
- id: gateway-provider_1
# 请求最终被转发到的目标地址
uri: http://localhost:9024
# 设置断言
predicates:
# Path Route Predicate Factory 断言,满足 /gateway/provider/** 路径的请求都会被路由到 http://localhost:9024 这个uri中
- Path=/gateway/provider/**
# Weight Route Predicate Factory 断言,同一分组按照权重进行分配流量,这里分配了80%
# 第一个group1是分组名,第二个参数是权重
- Weight=group1, 8
# 配置过滤器(局部)
filters:
# StripPrefix:去除原始请求路径中的前1级路径,即/gateway
- StripPrefix=1
- id: gateway-provider_2
uri: http://localhost:9025
# 设置断言
predicates:
- Path=/gateway/provider/**
# Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了20%
- Weight=group1, 2
# 配置过滤器(局部)
filters:
# StripPrefix:去除原始请求路径中的前1级路径,即/gateway
- StripPrefix=1
Spring Cloud Gateway 中的断言命名都是有规范的,格式:“xxx + RoutePredicateFactory”,比如权重断言 WeightRoutePredicateFactory,那么配置时直接取前面的 “Weight”。
如果路由转发匹配到了两个或以上,则是的按照配置先后顺序转发,上面都配置了路径:“ Path=/gateway/provider/** ”,如果没有配置权重,则肯定是先转发到 “http://localhost:9024”,但是既然配置配置了权重并且相同的分组,则按照权重比例进行分配流量。