Spring Cloud Gateway 入门

工程 | Ben Wilcock | 2019 年 6 月 18 日 | ...

微服务架构很棒,但随着应用程序编程接口 (API) 的增长,与其维护相关的挑战也随之增加。

例如,当现有 API 成熟并添加新功能时,它需要带领其客户端一同前进。当 API 的细节发生变化时,客户端需要进行调整以适应这些变化。这个过程需要时间,并且会大大减缓 API 的发展速度,并影响您快速迭代的能力。

提供多个 API 会带来一系列挑战。您如何将请求和响应路由到正确的 API?您如何管理任何消息差异?当您的端点可以移动时,您如何支持客户端?

然后是如何与遗留系统集成的问题。并非所有人都如此幸运,能够在全新的生态系统中构建应用程序和服务,而是需要与预先存在的系统(例如用于身份验证和其他支持服务的系统)和谐共处。

API 网关可帮助您解决这些问题及更多问题。它是一个强大的架构工具,可用于在微服务架构中管理消息路由、过滤和代理。许多 API 管理网关可以追溯到 SOA,这些网关通常以集中式服务器的形式实现。但随着微服务变得越来越流行,现代轻量级、独立和去中心化的微网关应用程序应运而生——例如 Spring Cloud Gateway

在本系列关于 Spring Cloud Gateway 的第一篇文章中,我们将从一个非常简单的操作开始——重新路由进入网关的请求,并将它们转发到其他地方的另一个服务。我们还将向请求中插入一个简单的 HTTP 标头,以展示网关可能实现的一个更多示例。

您需要的工具

  • HTTPie – 用于 http 调用的命令行客户端
  • 您最喜欢的 Java IDE(如果没有,请查看 Spring Tools
  • 您最喜欢的命令行(例如 zsh、bash、DOS 命令或 PowerShell)
  • Httpbin.org – 一个将 Http GET 请求数据转换为 JSON 响应的网站和诊断工具

步骤 1:创建项目

在一个新文件夹中,使用 start.spring.io(和 HTTPie)下载并解压一个新的 Spring Cloud Gateway 项目,如下所示...

http https://start.spring.io/starter.zip dependencies==cloud-gateway,actuator baseDir==spring-cloud-gateway-demo | tar -xzvf -

我们可以通过构建并运行代码并检查 Spring Boot Actuator 健康端点来立即断言该项目正在工作,如下所示...

./mvnw package spring-boot:run

现在您的 Spring Boot 应用程序已启动并运行,将浏览器指向 https://:8080/actuator/health。您应该会收到一条 JSON 格式的消息,显示 {"status":"UP"},这表示一切正常。现在停止您的服务器 (ctrl+c) 并继续下一部分。

步骤 2:向网关添加重路由指令

在您的 IDE 中,打开类 src/main/java/com/example/demo/DemoApplication.java 并添加以下方法,同时更正导入语句。如果您遇到困难,请查看 此处 的代码示例。

    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            // Add a simple re-route from: /get to: http://httpbin.org:80
            // Add a simple "Hello:World" HTTP Header
            .route(p -> p
            .path("/get") // intercept calls to the /get path
            .filters(f -> f.addRequestHeader("Hello", "World")) // add header
            .uri("http://httpbin.org:80")) // forward to httpbin
            .build();
    }

这里我们为网关构建了一个新路由。任何到 https://:8080/get 的请求都将匹配此路由指令,并且我们将对请求进行两次更改。filters() 方法处理诸如添加或更改标头之类的事务,在我们的示例中,将 Hello 标头设置为值 World。此外,uri() 方法将我们的请求转发到新主机。重要的是要注意在转发消息时保留 /get 路径。

现在编译您的新代码并再次启动应用程序服务器,如下所示...

./mvnw package spring-boot:run

在下一节中,我们将测试我们构建的内容。

步骤 3:测试您的新网关

为了测试我们构建的内容,我们可以再次使用 HTTPie。向 https://:8080/get 发送一个 HTTP GET 请求,并观察返回的内容,如下所示...

http localhost:8080/get --print=HhBb

您应该会看到与下面所示非常相似的响应。

GET /get HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8080
User-Agent: HTTPie/1.0.2

HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Encoding: gzip
Content-Length: 256
Content-Type: application/json
Date: Mon, 10 Jun 2019 13:13:36 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: nginx
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Forwarded": "proto=http;host=\"localhost:8080\";for=\"0:0:0:0:0:0:0:1:52144\"",
        "Hello": "World",
        "Host": "httpbin.org",
        "User-Agent": "HTTPie/1.0.2",
        "X-Forwarded-Host": "localhost:8080"
    },
    "origin": "0:0:0:0:0:0:0:1, 2.102.147.153, ::1",
    "url": "https://:8080/get"
}

此输出中有几点值得注意

  1. 响应源自 httpbin.org"Host" 标头证明了这一点。
  2. "X-Forwarded-Host""localhost:8080"(我们本地运行的网关应用程序)
  3. 已插入 Http 标头 "Hello" 并为其指定了值 "World"
  4. 在 Json 响应中,原始请求的完整 "url""https://:8080/get"(我们共同构建的网关服务)。

执行路径是客户端 (HTTPie) -> DemoApplication.java (我们的网关) -> httpbin.org (我们的回显服务),然后再返回。

最后思考。

就这样。您现在应该已经启动并运行了 Spring Cloud Gateway 应用程序,并学习了如何将其接收到的请求转发到另一个端点。您可以使用此技术自动将请求从您的网关应用程序转发到任何其他服务。

本文附带的代码可以在 此处 找到。当前 GA 版本的 Spring Cloud Gateway(撰写本文时为 2.1.0)的完整文档可以在 此处 找到。

下次

我们只涉足了 Spring Cloud Gateway 可以实现的一小部分,但希望这是一个很好的初探。在我们的下一篇文章中,我们将探讨如何创建一个动态网关——一个可以在运行时发现服务位置的网关。在此之前,如果您想了解更多信息,请务必查看 spring.io 上的 Spring Cloud Gateway 页面官方指南,或者在 Pivotal Web Services 上设置您自己的服务和网关!

最后,请务必查看 SpringOne Platform,这是构建人们喜爱的可伸缩应用程序的首要会议。从 10 月 7 日至 10 日,在德克萨斯州奥斯汀与同行们一起学习、分享和享受迄今为止最大最好的盛会。更棒的是,注册时使用代码 S1P_Save200 即可节省票价。我们希望在那里见到您!


作者

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有