微服务架构已经成为现代软件开发的主流范式之一。它允许开发团队将复杂的应用程序拆分成小的、自治的服务单元,以便更容易进行开发、部署和维护。然而,随着微服务数量的增加,管理和维护这些服务变得越来越复杂。这时候,微服务网关就成了一个不可或缺的组件,用于提高可维护性、安全性和性能。
微服务网关是位于微服务架构和外部客户端之间的中间层。它充当了微服务体系结构的入口点,负责处理所有与客户端之间的通信。微服务网关有多个职责,包括路由请求、负载均衡、认证、授权、日志记录和安全性。它可以被看作是微服务架构的门卫,用于保护和管理微服务集群。
先看大家看一张图,展示一下我们的网关在我们项目中的位置,可以看到,网关处于我们整个项目中的核心位置,我们前端访问后端的所有请求都要通过gateway进行转发。
如果没有网关,在微服务的架构下,我们前端访问后端的所有微服务要通过不同的端口或者ip,以下图示为user、product、shop、order四个微服务部署在了一台虚拟机上,分别占用了不同的端口,如果前端要想访问后端所有的微服务的话,需要通过四个不同的端口进行访问。
如果我们使用了网关,同样是四个微服务,我们只需要通过访问gateway就可以访问所有的微服务了,这下是不是一下子就清楚了gateway在微服务架构下的重要性了。
Spring Cloud Gateway 是一个用于构建微服务架构的反向代理和路由工具。
路由(Routing):Spring Cloud Gateway 允许您定义路由规则,将传入的请求映射到不同的微服务实例上。路由规则通常基于请求的 URL 路径、请求头、HTTP 方法等条件进行定义。这使得您可以根据不同的请求,将它们定向到不同的后端微服务,实现动态的请求路由。
请求过滤(Request Filtering):Gateway 提供了请求过滤器,允许您在请求到达后端微服务之前修改请求或执行特定操作。您可以使用这些过滤器来添加请求头、修改请求体、进行认证、请求限流、响应转换等。
负载均衡(Load Balancing):Spring Cloud Gateway 集成了负载均衡功能,可以分发请求到多个后端微服务实例,以确保高可用性和性能。它支持多种负载均衡算法,如轮询、权重等,您可以根据需要进行配置。
断路器(Circuit Breaker):Gateway 具有断路器模式,用于处理后端微服务的故障。当后端微服务不可用时,Gateway 可以快速切换到备用服务或返回友好的错误响应,而不是长时间等待超时。
动态路由(Dynamic Routing):Gateway 支持动态路由,这意味着您可以在运行时添加、修改或删除路由规则,而不需要重新启动服务。这使得应对流量变化更加灵活。
请求重试(Request Retry):Gateway 允许您配置请求重试机制,以应对后端微服务的瞬时故障。您可以定义重试的次数、间隔和条件,确保请求最终成功。
限流(Rate Limiting):通过使用限流过滤器,Gateway 可以限制每个客户端或每个 IP 地址的请求速率。这有助于保护后端微服务免受过多的请求压力。
集成安全性(Integration with Security):Gateway 可以与认证和授权系统集成,以确保只有授权的用户可以访问受保护的微服务。您可以使用 Spring Security 或其他安全框架来实现此功能。
日志记录(Logging):Gateway 具有强大的请求和响应日志记录功能,这对于故障排除和监控非常有用。您可以配置日志级别和输出格式,以满足您的需求。
监控和度量(Monitoring and Metrics):Gateway 可以集成监控和度量系统,例如 Spring Cloud Sleuth 和 Micrometer,以便实时监控流量和性能,并进行分析。
WebSocket 支持:Gateway 支持 WebSocket 协议,允许您处理实时的双向通信。
自定义路由规则(Custom Routing Rules):Gateway 提供了丰富的扩展机制,允许您编写自定义的路由规则和过滤器,以满足特定需求。
引入相关依赖:SpringBoot、SpringCloud、SpringCloud gateway
先来看一下我的项目结构:
这里我们在父pom中引入SpringBoot和Spring Cloud的相关依赖
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.12.RELEASEversion>
<relativePath/>
parent>
<properties>
<java.version>11java.version>
<spring-cloud.version>Hoxton.SR12spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASEspring-cloud-alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
子pom中引入gateway的相关依赖,注意:gateway中不要引入springboot的web模块,因为gateway使用的web服务器是netty不是tomcat,而springboot的web模块中默认配置的web服务器就是tomcat
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
server:
port: 9081
servlet:
context-path: /gateway-demo
spring:
application:
name: gateway-demo
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: wangmengjie
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedHeaders: "*"
allowedMethods: "*"
default-filters:
- DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
discovery:
locator:
enable: true #让gateway可以发现nacos中的微服务
routes: #路由,数组[这里可以放置多个路由]
#评分管理模块网关路由配置
- id: user-router #当前路由标识-要求唯一,默认是UUID;
uri: lb://user-demo #请求最终要被转发的地址;
order: 1 #路由的优先级——数字越小,代表路由的优先级越高
predicates: #断言:(条件判断——转发请求要满足的条件)
- Path=/user-service/** #当请求路径满族path指定的规则时,此路由信息才会正常转发;
filters: #过滤器,是在请求传递过程中对请求做一些手脚;
- StripPrefix=1 #在请求转发之前去掉一层路径
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient//开启nacos服务注册
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
通过网关的配置文件我们可以得知,user模块配置的断言为user-service/**,表明当我们访问localhost:9081/user-service/**的时候,请求就会发到我们的网关上面,然后gateway通过uri的配置,user-demo为user模块在nacos上注册的服务名称,
user模块原有的接口地址:http://localhost:9000/user/getAllUser
访问网关的接口地址:http://localhost:9081/user-service/user/getAllUser
在网关的配置文件中filters的配置在进行请求转发之前会去掉第一层路径,也就是通过user-demo获取的user模块服务信息为:localhost:9000,再加上请求转发的路径,所以最终的请求为:localhost:9000/user/getAllUser;
对于项目后台的微服务系统, 每一个微服务都不会直接暴露给用户来调用的, 如果用户知道了某一个服务的 ip:端口号:url:访问参数, 就能直接访问你,甚至是恶意访问等,因此需要一个网关作为微服务的统一入口。此篇文章先介绍网关的一些基本集成+使用,对于网关还有许多知识,跨域、过滤器、自定义过滤器、全局过滤器等,之后逐一为大家介绍。
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。