Spring Cloud Gateway可扩展的微服务网关使用教程

开发 架构
Spring Cloud Gateway 专注于提供 API 网关所需的核心功能,如路由、断路器、限流等,同时支持自定义扩展点,以便用户能够根据自身需求进行定制。

Spring Cloud Gateway 是一个基于 Spring Boot 2.x 的可扩展的微服务网关,它提供了一种简单且灵活的方式来构建微服务架构中的 API 网关。Spring Cloud Gateway 专注于提供 API 网关所需的核心功能,如路由、断路器、限流等,同时支持自定义扩展点,以便用户能够根据自身需求进行定制。

下面我们将通过一个简单的示例来详细介绍 Spring Cloud Gateway 的使用。

添加依赖

首先,在我们的项目中添加 Spring Cloud Gateway 的依赖。在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>3.1.3</version>
</dependency>

这里我们使用的是 Spring Cloud Gateway 的 3.1.3 版本。

配置路由规则

在 src/main/resources 目录下创建一个 application.yml 文件,用于配置路由规则。例如,我们定义两个服务 service-a  service-b,并设置相应的路由规则:

spring:
  cloud:
    gateway:
      routes:
        - id: route_a
          uri: http://service-a/api
          predicates:
            - Path=/api/a/**
        - id: route_b
          uri: http://service-b/api
          predicates:
            - Path=/api/b/**

在这个例子中,我们定义了两个路由规则。route_a 规则将 /api/a/** 路径的请求转发到 http://service-a/apiroute_b 规则将 /api/b/** 路径的请求转发到 http://service-b/api

自定义扩展点

Spring Cloud Gateway 提供了许多内置的扩展点,允许用户根据需要进行定制。例如,我们可以实现org.springframework.cloud.gateway.handler.predicate.PredicateFactory 接口来定义新的路由规则条件。

这里我们创建一个自定义的路由规则条件 MyCustomPredicate,用于判断请求是否满足某些特定的条件:

package com.example.myservice.gateway;

import org.springframework.cloud.gateway.handler.predicate.PredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicate;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.cloud.gateway.route.builder.routes.RouteLocator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Configuration
public class MyGatewayConfig {
    @Bean
    public RoutePredicate myCustomPredicate(PredicateFactory predicateFactory) {
        return predicateFactory.fromState(ServerWebExchange::getRequest, ServerHttpRequest::getURI)
                ::equals(ServerHttpRequest::getURI) // 这里简单判断请求的 URI 是否与目标 URI 相等
                .then(Mono::just); // 如果相等,返回 Mono<Boolean> 类型的 true
    }
}

在这个例子中,我们定义了一个 MyCustomPredicate 类,实现了 RoutePredicate 接口。在 myCustomPredicate 方法中,我们通过ServerWebExchange::getRequest  ServerHttpRequest::getURI 方法获取请求的信息,并进行简单的判断。如果请求的 URI 与目标 URI 相等,返回 Mono<Boolean> 类型的 true。这样,我们就可以将这个条件应用于路由规则中。

启动网关

在完成上述配置后,我们可以启动 Spring Cloud Gateway 网关。启动方法与普通的 Spring Boot 应用类似,只需运行 mvn spring-boot:run 命令即可。

Spring Cloud Gateway 启动后,会监听默认的端口 8080。如果需要修改端口号,可以在 application.yml 文件中设置 server.port 属性。

路由测试

我们可以通过发送 HTTP 请求来测试路由规则是否生效。例如,可以借助 Postman 或curl命令来进行测试。

对于上述示例中的路由规则,我们可以分别发送以下请求:

  • 请求 route_a 路由规则:
curl -X GET http://localhost:8080/api/a/hello
  • 请求 route_b 路由规则:
curl -X GET http://localhost:8080/api/b/hello

如果一切正常,你应该能够分别获得来自 service-a  service-b 的响应结果。

自定义扩展点使用

在上述示例中,我们创建了一个自定义的路由规则条件 MyCustomPredicate。要使用这个条件,我们需要在 application.yml 文件中添加以下配置:

spring:
  cloud:
    gateway:
      routes:
        - id: route_with_custom_predicate
          uri: http://service-a/api
          predicates:
            - MyCustomPredicate=true

在这个例子中,我们创建了一个新的路由规则route_with_custom_predicate,并添加了 MyCustomPredicate=true 条件。这意味着只有当请求满足 MyCustomPredicate 条件时,才会转发请求到目标服务。

日志与监控

Spring Cloud Gateway 还提供了丰富的日志和监控功能。你可以通过配置 logging.level.*  management.endpoint.* 等属性来启用并定制日志和监控行为。例如,在 application.yml 文件中添加以下配置:

logging:
  level:
    root: INFO
management:
  endpoint:
    health:
      show-details: always

这样,你就能在日志中看到更详细的路由、断路器、限流等信息,并可以通过 /health 接口查看网关的健康状态。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-09-12 07:19:06

微服务网关架构

2024-08-05 10:03:53

2022-09-01 08:17:15

Gateway微服务网关

2017-09-04 16:15:44

服务网关架构

2018-12-19 15:05:55

Spring Clou网关 Gateway

2017-09-09 23:15:20

Spring Clou微服务架构路由

2017-09-15 23:29:53

Spring Clou微服务架构过滤器

2022-05-12 08:21:13

项目网关模块

2022-05-16 08:22:11

网关过滤器路由

2024-10-29 08:44:18

2020-04-29 14:33:49

微服务网关Kong

2024-02-06 18:05:54

微服务SpringCloud

2024-07-29 08:24:43

2021-11-04 10:11:02

Sentinel网关限流

2023-09-15 08:18:49

cookie网关代理

2023-04-03 08:51:06

2024-07-10 10:51:39

SpringEureka数据中心

2018-06-01 23:08:01

Spring Clou微服务服务器

2020-10-10 10:37:54

微服务架构技术API

2017-09-05 14:05:11

微服务spring clou路由
点赞
收藏

51CTO技术栈公众号