微服务架构很棒,但随着应用程序编程接口(API)的开始增长,与维护相关的挑战也随之增加。
例如,随着现有API的成熟和添加新功能,当API的详细信息发生变化时,客户端需要进行调整才能使用这些更改。这个过程需要时间,会真正降低您的API演变效率,并干扰您快速迭代的能力。
提供多个API也会带来了一系列挑战。如何将请求和响应路由到正确的API?你如何管理任何消息差异?当终端发生变化迁移时,您如何为变化的客户端提供支持?
还有与遗留系统集成的问题。并非所有人都如此幸运,以至于他们可以将应用程序和服务构建到一个全新的生态系统中。
API网关可帮助您解决这些问题等。它是一个功能强大的架构工具,可用于管理微服务架构中的消息路由,过滤和代理。许多API管理网关可以追溯到SOA,这些网关往往是作为集中式服务器实现的。但随着微服务变得越来越流行,现代轻量级独立和分散式微网关应用程序已经出现 - 例如 Spring Cloud Gateway 。
下面展示使用Spring Cloud Gateway进行开发的步骤
需要的工具:
第1步:创建一个项目
在新文件夹中,使用 start.spring.io (和 HTTPie )下载并提取新的Spring Cloud Gateway项目,如下所示......
http https:<font><i>//start.spring.io/starter.zip dependencies==cloud-gateway,actuator baseDir==spring-cloud-gateway-demo | tar -xzvf -</i></font><font> </font>
运行:
./mvnw <b>package</b> spring-boot:run
现在您的Spring Boot应用程序已启动并运行,请将浏览器指向 http:// localhost:8080 / actuator / health 。您应该收到一条JSON格式的消息{"status":"UP"},说明一切正常。现在停止服务器(ctrl + c)并继续下一部分。
步骤2:向网关添加重新路由指令
在IDE中,打开该类src/main/java/com/example/demo/DemoApplication.java并添加以下方法,随时更正import语句。如果您遇到问题,请查看 此处 的代码示例。
@Bean <b>public</b> RouteLocator myRoutes(RouteLocatorBuilder builder) { <b>return</b> builder.routes() <font><i>// Add a simple re-route from: /get to: http://httpbin.org:80</i></font><font> </font><font><i>// Add a simple "Hello:World" HTTP Header</i></font><font> .route(p -> p .path(</font><font>"/get"</font><font>) </font><font><i>// intercept calls to the /get path</i></font><font> .filters(f -> f.addRequestHeader(</font><font>"Hello"</font><font>, </font><font>"World"</font><font>)) </font><font><i>// add header</i></font><font> .uri(</font><font>"http://httpbin.org:80"</font><font>)) // forward to httpbin .build(); } </font>
在这里,我们建立了一条新路由:任何请求http://localhost:8080/get都将与此路由指令匹配,并且我们将对请求进行两次更改:filters()方法处理诸如添加或更改标题之类的事情,在我们的示例中将Hello标题设置为值World。此外,该uri()方法将我们的请求转发给新主机。请务必注意/get转发邮件时保留路径。
现在编译新代码并再次启动应用程序服务器,如下所示......
./mvnw package spring-boot:run
第3步:测试新网关
为了测试我们构建的内容,我们可以再次使用 HTTPie 。将HTTP GET请求发送到 http:// localhost:8080 / get 并观察返回的内容,如下所示...
http localhost:8080/get --print=HhBb
应该看到与下面显示的响应非常相似的响应:
GET /get HTTP/1.1 Accept: *<font><i>/* 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: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" } </i></font>
输出中有一些注意事项:
执行路径:来自客户端( HTTPie ) - > DemoApplication.java(我们的网关) - > httpbin.org(我们的echo服务),然后再返回。
最后的想法
您现在应该启动并运行Spring Cloud Gateway应用程序,并学习如何将收到的请求转发到另一个端点。您可以使用此技术自动将请求从Gateway应用程序转发到任何其他服务。
可以在 此处 找到本文附带的代码。可在 此处 找到当前GA版本的Spring Cloud Gateway(撰写本文时为2.1.0)的完整文档。