微服务网关:Spring Cloud Gateway 入门指南
Spring Cloud Gateway 是 Spring Cloud 微服务生态系统中的一部分,旨在提供高效的 API 网关解决方案。在 2020.0.0 版本的 Spring Cloud 中,Zuul 网关被移除,改为采用性能更高的 Spring Cloud Gateway。相较于基于 Servlet 的 Zuul,Spring Cloud Gateway 基于 Spring WebFlux 的响应式框架,拥有更优的性能表现,适合高并发场景。
为什么选择 Spring Cloud Gateway?
Spring Cloud Gateway 能够满足各种场景需求,以下是一些常见的应用场景:
微服务架构的集中入口:在微服务架构中,网关是多个微服务的统一入口。它能够管理路由、分发流量,并处理跨服务的请求和事务。
集中管理认证与安全:对于高安全性需求的应用,网关可以统一管理认证和授权,保护敏感数据和用户隐私。
负载均衡与高可用:网关提供内置的负载均衡支持,能够智能分发流量,并在某个服务失效时自动转移请求。
监控与日志管理:网关可以记录和监控请求与响应,提供丰富的日志信息,有助于故障诊断和性能分析。
本文将介绍如何在 Spring Cloud 环境下,结合 Nacos 注册中心和 Spring Cloud Gateway,实现一个简单的 API 路由功能。
微服务网关 Spring Cloud Gateway
Spring Cloud 在版本 2020.0.0 开始,去除了 Zuul 网关的使用,改用 Spring Cloud Gateway 作为网关。
Spring Cloud Gateway 基于 Spring WebFlux 框架实现,相对于 Zuul 来说,性能更高。
Spring Cloud Gateway 适用于许多不同的使用场景,包括但不限于:
- 微服务架构:在微服务架构中,API 网关是连接多个微服务的关键组件,它提供了统一的入口点,并可以处理跨服务的事务。
- 安全性要求高:当项目对安全性有高要求时,API 网关可以集中管理认证和授权,确保敏感数据受到保护。
- 负载均衡与高可用:需要负载均衡和高可用性的情况下,API 网关可以自动分发流量并处理服务的故障。
- 监控和日志:当需要监控和记录请求和响应时,API 网关提供了方便的工具来进行监控和故障排除。
本文讲述如何在 Spring Cloud 中使用 Nacos 作为注册中心,通过 Spring Cloud Gateway 实现 API 路由的功能。
启动 Nacos
由于需要使用 Nacos 作为注册中心,网关和微服务都注册到 Nacos服务上,因此,需要先启动 Nacos服务。
见上一篇:
启动 Gateway
添加POM
在 Spring Cloud 项目 GoboyCloud 基础上创建一个 Spring Boot 子项目,添加pom.xml 依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>goboy-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-gateway</name>
<description>Spring Cloud Gateway</description>
<packaging>jar</packaging>
<dependencies>
<!-- 引入nacos 注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--API网关Gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
- spring-cloud-starter-alibaba-nacos-discovery:使用 Nacos 作为注册中心,需要连接上 Nacos。
- spring-cloud-starter-gateway:使用 Spring Cloud Gateway 作为网关。
添加YML
server:
port: 9090
spring:
application:
name: goboy-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:9001
gateway:
routes:
- id: nacos-provider
uri: lb://nacos-provider
predicates:
- Path=/provider/**
filters:
- StripPrefix=1
网关端口设置为 9090。由于需要连接 Nacos 注册中心,需要提供服务名称 goboy-gateway
,以及配置 Nacos 注册中心地址 127.0.0.1:9001。
接下来是网关的重要配置 spring.cloud.gateway.routes:
- id: 这是路由规则的开始,指定了这个路由规则的唯一标识符(id)。在这里,路由的id是 “nacos-provider”。
- uri: 请求应该转发到的目标 URI,lb: 表示负载均衡,将请求转发到名为 “nacos-provider” 的服务。
- predicates: 路由条件,这是一个断言(predicate)的列表,用于匹配请求的条件。
- Path=/provider/**
:这个断言指定了请求的路径必须以 “/provider/” 开头,且可以有任意后缀。只有满足这个条件的请求才会被应用这个路由规则。 - filters: 这是一个路由过滤器(filter)的列表,用于对请求进行一些处理或转换。
- StripPrefix=1
:这个过滤器指定了要去掉请求路径的前缀。在这里,它去掉了一个路径段,因此如果请求是 “/provider/example”,则经过这个过滤器后,会变成 “/example”。
添加启动类
package com.cloud.goboy.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class GoboyGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GoboyGatewayApplication.class, args);
}
}
启动服务
复用文章《Spring Cloud 使用 Nacos 注册中心》服务提供者 nacos-provider 作为路由转发的微服务。
启动的实例如下图所示:
测试
访问http://localhost:9000/provider/provider/hello
会将请求路由至 nacos-provider 的微服务,且请求接口地址为 /provider/hello,浏览器输出:
hello
- 点赞
- 收藏
- 关注作者
评论(0)