Spring Cloud Gateway入门 - spring.io


微服务架构很棒,但随着应用程序编程接口(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"
}

输出中有一些注意事项:

  1. 响应源自httpbin.org,如"Host"标题所示。
  2. "X-Forwarded-Host"是"localhost:8080"(我们本地运行的应用网关)
  3. "Hello"已插入Http标头并给出值"World"。
  4. 在Json响应中,完整"url"的原始请求是"https://localhost:8080/get"(我们一起构建的网关服务)。

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

最后的想法
您现在应该启动并运行Spring Cloud Gateway应用程序,并学习如何将收到的请求转发到另一个端点。您可以使用此技术自动将请求从Gateway应用程序转发到任何其他服务。
可以在此处找到本文附带的代码。可在此处找到当前GA版本的Spring Cloud Gateway(撰写本文时为2.1.0)的完整文档。