使用Spring Cloud Gateway隐藏服务和运行时发现

工程 | Ben Wilcock | 2019年7月1日 | ...

Ben Wilcock – Pivotal Spring 市场营销,Brian McClain – Pivotal 技术市场营销。

很少有公司希望_所有_API都可公开访问。大多数公司更倾向于默认情况下将服务保密,只有在绝对必要时才公开暴露API。

Spring Cloud Gateway 可以提供帮助。Spring Cloud Gateway允许您使用简单的Java™指令(我们在上一篇文章中看到过)或YAML配置文件(我们将在本文中演示)来路由到您的API的流量。要隐藏您的服务,您可以设置您的网络,以便从外部访问的唯一服务器是网关。然后,网关成为一个看门人,控制来自外部的入口和出口。这是一个非常流行的模式。

基于云的服务也有一个习惯,那就是在没有太多警告的情况下更改位置和粒度。为了更好地应对这种情况,您可以将网关与服务注册表结合使用,以允许网络上的应用程序在运行时动态地相互查找。如果您这样做,您的应用程序将对更改具有更高的弹性。Spring Cloud Netflix Eureka Server 就是这样一个服务注册表。

在这篇文章中,我们将研究Spring Cloud的网关和注册表组件,并说明如何将它们结合使用以使您的应用程序更安全、更可靠。

由于此安排需要特定的设置,我们提供了可下载并运行的现成代码。我们将使用Docker来编排我们的服务并模拟私有网络。然后,我们将使用HTTPie与正在运行的服务进行通信。

您需要的东西

  • Java(假定版本8),以及您最喜欢的网络浏览器和终端应用程序。

  • 源代码 – 此次无需编写任何代码,只需git clone(或下载并unzip)来自GitHub的此项目的源代码存储库

  • Docker Desktop – Docker将提供我们的伪生产环境。我们将使用它来在私有网络中隐藏我们的服务。

  • Cloud Native Buildpacks – 我们将使用Cloud Native Buildpacks为我们构建Docker容器镜像。Buildpacks体现了多种DevOps最佳实践,包括加固的开源操作系统和免费使用的OpenJDK发行版。

  • 大约10-15分钟,具体取决于您的互联网速度等。

让我们开始吧……

步骤1

下载并安装上面列表中所有“您需要的东西”。然后按照如下方式更改到源代码中的runtime-discovery文件夹

cd runtime-discovery

步骤2

使用Maven将网关、注册表和服务构建并打包成JAR,然后为每个JAR创建Docker容器。我们提供了一个方便的pack-images脚本来执行此操作

 ./pack-images.sh

步骤3

在后台启动Docker测试环境。我们在这里使用docker-compose,因为它可以启动多个容器并为它们创建私有网络以进行通信

docker-compose up

步骤4

等待。Docker将启动所有容器(使用docker-compose.yml文件中提供的配置)。建议在此处多等几分钟。这为Docker提供启动所有内容的时间,并为应用程序提供通信和稳定下来的机会。如果您等待,您应该看到网关和问候服务向注册表注册自身。会有很多日志,但在其中会有来自注册表的类似以下行的内容

registry    | 2019-06-28 12:19:01.780  INFO 1 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance REGISTRY/db1d80613789:registry:8761 with status UP (replication=false)
registry    | 2019-06-28 12:19:02.380  INFO 1 --- [nio-8761-exec-6] c.n.e.registry.AbstractInstanceRegistry  : Registered instance GATEWAY/9c0c0c9ba027:gateway:8760 with status UP (replication=true)
registry    | 2019-06-28 12:19:02.382  INFO 1 --- [nio-8761-exec-6] c.n.e.registry.AbstractInstanceRegistry  : Registered instance SERVICE/fe7e38b21cac:service:8762 with status UP (replication=true)

让我们试试看……

首先,检查问候服务是否隐藏

问候服务在端口8762上运行,并隐藏在Docker网络内部。让我们尝试使用https://127.0.0.1:8762/greeting从您最喜欢的浏览器调用它。您的浏览器应该会告诉您“无法访问该站点”。这是因为问候服务隐藏在Docker网络内部(就像它位于公司防火墙后面一样)。我们不应该能够直接与问候服务通信。相反,您将看到类似于以下错误页面。

Screenshot from the browser window showing that the service is unreachable

接下来,通过网关访问问候服务

现在,将您的浏览器导航到https://127.0.0.1:8080/service/greeting。您现在应该得到一个有效的响应,其内容类似于下面显示的“Hello, World”JSON

{ "id": 1, "content": "Hello, World!"}

当您从浏览器发出此新的HTTP请求时,它被发送到网关并由网关处理。网关服务_是_公开可访问的(它映射到端口8080)。您的请求代表您由网关转发到问候服务,然后响应由网关路由回您。

现在,查看服务注册表

Docker网络上的微服务都向注册表服务器注册自身(这可能需要几分钟,请耐心等待)。注册表服务器充当服务的地址簿。如果服务移动,或创建新实例,它们将向注册表添加自身。

要查看当前注册服务的列表,请将浏览器指向https://127.0.0.1:8080/registry。您应该会看到类似于以下屏幕。

Screenshot from the Registry console, listing several services

最终关闭

完成后,在您的终端中使用ctrl-C关闭Docker服务。如果由于任何原因此方法无效,您也可以从runtime-discovery文件夹使用docker-compose down。使用任何一种方法,您都应该看到类似于以下的输出

Stopping gateway  ... done
Stopping service  ... done
Stopping registry ... done

可以使用docker-compose rm -f进行进一步清理。

工作原理

在此演示中,我们有3个服务器。这些服务器都在由Docker Compose提供的“隐藏”网络中运行。只有网关服务器暴露在外部世界,因此所有HTTP流量都必须通过此网关。

以下是3个服务器的描述以及每个服务器的作用……

  1. 网关 – 充当我们所有HTTP流量的守门人。所有入站和出站流量都流经此门户 – 它充当外部世界(您的浏览器)和内部Docker网络上的服务之间的桥梁。网关具有指定可用于与网络内部服务通信的路由的配置。这些路由使用目标服务的“逻辑”名称。这些逻辑名称由注册表服务器转换为实际地址。

  2. 注册表 – 充当隐藏网络上所有服务的电话簿。它允许网关仅使用其逻辑名称查找问候服务。

  3. 问候服务 – 是基于流行的Spring.io指南“构建RESTful Web服务”的简单REST服务。

正如您在docker-compose.yml中看到的,Docker配置为仅允许外部调用到达网关 – 在端口80上。其他服务器(注册表和问候服务)无法从外部直接访问。

网关配置的URL直通路径可以在网关的application.yml文件中看到。此配置使用这些服务器的“逻辑”名称和如下所示的lb:(负载均衡器)协议

spring:
  application:
    name: gateway  
  cloud:
    gateway:
      routes:
      - id: service
        uri: lb://service
        predicates:
        - Path=/service/**
        filters:
        - StripPrefix=1
...

通过使用这些“逻辑”服务器名称,网关可以在运行时使用注册表来发现这些服务的真实位置。

总结

使用您可用的整个Spring工具包,Spring Cloud Gateway的灵活性和强大功能很快就会显而易见。如果您深入研究源代码,您会注意到,只需几行Java代码和一些依赖项,我们就可以轻松地将Spring Boot微服务与Eureka集成,并控制对我们服务API的访问。

在您完成之前,为什么不注册参加SpringOne Platform 2019 – 构建让用户满意的可扩展应用程序的顶级会议。加入数千名志同道合的Spring开发者,在10月7日至10日于德克萨斯州奥斯汀一起学习、分享和娱乐。注册时使用折扣码S1P_Save200即可节省门票费用。如果您需要帮助说服您的经理,请使用此页面。期待在那里见到您。

获取Spring通讯

随时关注Spring通讯

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部