领先一步
VMware 提供培训和认证,助力你的职业发展。
了解更多微服务架构很棒,但随着应用程序接口(API)的增长,维护相关的挑战也随之增加。
例如,当现有 API 成熟并添加新功能时,它需要带着其客户端一同前进。当 API 的细节发生变化时,客户端需要进行调整以适应这些变化。这个过程需要时间,这会大大减缓 API 的演进,并影响你快速迭代的能力。
提供多个 API 本身也带来了一系列挑战。如何将请求和响应路由到正确的 API?如何管理任何消息差异?当你的端点可能移动时,如何支持客户端?
此外,还有与遗留系统集成的挑战。并非所有人都幸运地可以将应用和服务构建到全新的生态系统中,他们往往需要与现有的系统良好协作,例如进行身份验证和其他后端服务。
API 网关可以帮助你解决这些问题及更多。它是一个强大的架构工具,你可以用来在微服务架构中管理消息路由、过滤和代理。许多 API 管理网关可以追溯到 SOA,它们通常被实现为集中式服务器。但随着微服务变得越来越流行,现代的轻量级、独立和去中心化的微网关应用程序应运而生——例如 Spring Cloud Gateway。
在本系列关于 Spring Cloud Gateway 的第一篇文章中,我们将从一个非常简单的事情开始——重新路由进入网关的请求,并将它们转发到其他地方的另一个服务。我们还将向请求中插入一个简单的 HTTP Header,以此来展示使用网关可以实现的一种可能。
在一个新文件夹中,使用 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 应用程序已经启动并运行,将浏览器指向 http://localhost:8080/actuator/health。你应该会收到一个 JSON 格式的消息,显示 {"status":"UP"}
,这表示一切正常。现在停止服务器(ctrl+c),然后继续下一节。
在你的 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();
}
在这里,我们为网关构建了一个新路由。任何对 http://localhost:8080/get
的请求都将匹配此路由指令,并会进行我们对请求所做的两项更改。filters()
方法处理添加或更改 header 等事情,在本例中,它将 Hello
header 设置为值 World
。此外,uri()
方法将请求转发到新的 host。值得注意的是,在转发消息时,/get
路径被保留了。
现在编译你的新代码并再次启动应用程序服务器,如下所示...
./mvnw package spring-boot:run
在下一节中,我们将测试我们构建的内容。
为了测试我们构建的内容,我们可以再次使用 HTTPie。向 http://localhost: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://localhost:8080/get"
}
此输出中有几点值得注意:
"Host"
header 所示。"X-Forwarded-Host"
是 "localhost:8080"
(我们本地运行的网关应用程序)"Hello"
已被插入,并被赋予了值 "World"
。"url"
是 "https://localhost:8080/get"
(我们一起构建的网关服务)。执行路径是:客户端 (HTTPie) -> DemoApplication.java (我们的网关) -> httpbin.org (我们的回显服务),然后再返回。
就是这样。现在你应该有一个 Spring Cloud Gateway 应用程序正在运行,并且已经学会了如何将它接收到的请求转发到另一个端点。你可以使用这种技术将来自网关应用程序的请求自动转发到任何其他服务。
本文 accompanying 的代码可以在这里找到。Spring Cloud Gateway 当前 GA 版本(撰写本文时为 2.1.0)的完整文档可以在这里找到。
我们只是浅尝了 Spring Cloud Gateway 的功能,但希望这是一个不错的初体验。在下一篇文章中,我们将探讨如何创建一个动态网关——一个能够在运行时发现服务位置的网关。在此之前,如果你想了解更多,务必查看 spring.io 上的 Spring Cloud Gateway 页面、官方指南,或者在 Pivotal Web Services 上搭建你自己的服务和网关!
最后,一定要关注 SpringOne Platform,这是关于构建人们喜爱的可伸缩应用程序的首要会议。10月7日至10日,在德克萨斯州奥斯汀与你的同行们一起学习、分享和享受乐趣,这将是迄今为止最大、最精彩的展会。更棒的是,注册时使用代码 S1P_Save200 可以节省你的门票费用。我们希望在那里见到你!