领先一步
VMware 提供培训和认证,以快速提升您的进步。
了解更多微服务架构很棒,但是随着应用程序编程接口 (API) 的增长,其维护相关的挑战也随之增加。
例如,随着现有 API 的成熟和新增功能,它需要让其客户端参与其中。当 API 的细节发生变化时,客户端需要进行调整才能适应这些变化。此过程需要时间,并且会严重减慢 API 的发展速度,并干扰快速迭代的能力。
提供多个 API 会带来自身的一系列挑战。如何将请求和响应路由到正确的 API?如何管理任何消息差异?当您的端点可以四处移动时,如何支持客户端?
然后是与遗留系统集成的問題。并非每个人都那么幸运,可以将应用程序和服务构建到全新的生态系统中,而需要与预先存在的系统(例如身份验证和其他后端服务)良好配合。
API 网关可帮助您解决这些问题以及更多问题。它是一个强大的架构工具,您可以使用它来管理微服务架构中的消息路由、过滤和代理。许多 API 管理网关可以追溯到 SOA,这些网关往往被实现为集中式服务器。但是,随着微服务的普及,现代轻量级独立和分散的微网关应用程序出现了——例如Spring Cloud Gateway。
在本系列关于 Spring Cloud Gateway 的第一篇文章中,我们将从非常简单的事情开始——重新路由进入网关的请求并将其转发到其他地方的服务。我们还将向请求插入一个简单的 HTTP 标头,只是为了展示网关可以实现的更多示例。
在新文件夹中,使用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://127.0.0.1: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();
}
在这里,我们为网关构建一条新路由。任何对https://127.0.0.1:8080/get
的请求都将与该路由指令匹配,并且将对请求进行我们的两个更改。filters()
方法处理诸如添加或更改标头之类的操作,在本例中,将Hello
标头的值设置为World
。此外,uri()
方法将我们的请求转发到新的主机。需要注意的是,转发消息时保留了/get
路径。
现在编译您的新代码并再次启动应用程序服务器,如下所示……
./mvnw package spring-boot:run
在下一节中,我们将测试我们构建的内容。
要测试我们构建的内容,我们可以再次使用HTTPie。向https://127.0.0.1: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://127.0.0.1:8080/get"
}
此输出中有一些需要注意的地方
"Host"
标头证明。"X-Forwarded-Host"
为"localhost:8080"
(我们本地运行的网关应用程序)"Hello"
,其值为"World"
。"url"
为"https://127.0.0.1:8080/get"
(我们一起构建的网关服务)。执行路径是从客户端(HTTPie)-> DemoApplication.java(我们的网关)-> httpbin.org(我们的回显服务),然后返回。
就是这样。您现在应该已经启动并运行了 Spring Cloud Gateway 应用程序,并学习了如何将它接收到的请求转发到另一个端点。您可以使用此技术将来自网关应用程序的请求自动转发到任何其他服务。
本文随附的代码可以在这里找到。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即可节省门票费用。我们希望在那里见到您!