微服务网关:Spring Cloud Gateway 入门指南

举报
不惑 发表于 2024/11/05 09:10:30 2024/11/05
【摘要】 2020.0.0 版本的 Spring Cloud 中,Zuul 网关被移除,改为采用性能更高的 Spring Cloud Gateway。相较于基于 Servlet 的 Zuul,Spring Cloud Gateway 基于 Spring WebFlux 的响应式框架,拥有更优的性能表现,适合高并发场景。

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

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

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 作为路由转发的微服务。

启动的实例如下图所示:
image.png

测试

访问http://localhost:9000/provider/provider/hello

会将请求路由至 nacos-provider 的微服务,且请求接口地址为 /provider/hello,浏览器输出:

hello
image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。