19-06-22
banq
微服务架构很棒,但随着应用程序编程接口(API)的开始增长,与维护相关的挑战也随之增加。
例如,随着现有API的成熟和添加新功能,当API的详细信息发生变化时,客户端需要进行调整才能使用这些更改。这个过程需要时间,会真正降低您的API演变效率,并干扰您快速迭代的能力。
提供多个API也会带来了一系列挑战。如何将请求和响应路由到正确的API?你如何管理任何消息差异?当终端发生变化迁移时,您如何为变化的客户端提供支持?
还有与遗留系统集成的问题。并非所有人都如此幸运,以至于他们可以将应用程序和服务构建到一个全新的生态系统中。
API网关可帮助您解决这些问题等。它是一个功能强大的架构工具,可用于管理微服务架构中的消息路由,过滤和代理。许多API管理网关可以追溯到SOA,这些网关往往是作为集中式服务器实现的。但随着微服务变得越来越流行,现代轻量级独立和分散式微网关应用程序已经出现 - 例如Spring Cloud Gateway。
下面展示使用Spring Cloud Gateway进行开发的步骤
需要的工具:
- 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 - |
运行:
./mvnw package 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 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()方法处理诸如添加或更改标题之类的事情,在我们的示例中将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: */* 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" } |
输出中有一些注意事项:
- 响应源自httpbin.org,如"Host"标题所示。
- "X-Forwarded-Host"是"localhost:8080"(我们本地运行的应用网关)
- "Hello"已插入Http标头并给出值"World"。
- 在Json响应中,完整"url"的原始请求是"https://localhost:8080/get"(我们一起构建的网关服务)。
执行路径:来自客户端(HTTPie) - > DemoApplication.java(我们的网关) - > httpbin.org(我们的echo服务),然后再返回。
最后的想法
您现在应该启动并运行Spring Cloud Gateway应用程序,并学习如何将收到的请求转发到另一个端点。您可以使用此技术自动将请求从Gateway应用程序转发到任何其他服务。
可以在此处找到本文附带的代码。可在此处找到当前GA版本的Spring Cloud Gateway(撰写本文时为2.1.0)的完整文档。