领先一步
VMware提供培训和认证,以加速您的进步。
了解更多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分钟,具体取决于您的互联网速度等。
下载并安装上面列表中所有“您需要的东西”。然后按照如下方式更改到源代码中的runtime-discovery文件夹
cd runtime-discovery
使用Maven将网关、注册表和服务构建并打包成JAR,然后为每个JAR创建Docker容器。我们提供了一个方便的pack-images脚本来执行此操作
./pack-images.sh
在后台启动Docker测试环境。我们在这里使用docker-compose,因为它可以启动多个容器并为它们创建私有网络以进行通信
docker-compose up
等待。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网络内部(就像它位于公司防火墙后面一样)。我们不应该能够直接与问候服务通信。相反,您将看到类似于以下错误页面。
现在,将您的浏览器导航到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。您应该会看到类似于以下屏幕。
完成后,在您的终端中使用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个服务器的描述以及每个服务器的作用……
网关 – 充当我们所有HTTP流量的守门人。所有入站和出站流量都流经此门户 – 它充当外部世界(您的浏览器)和内部Docker网络上的服务之间的桥梁。网关具有指定可用于与网络内部服务通信的路由的配置。这些路由使用目标服务的“逻辑”名称。这些逻辑名称由注册表服务器转换为实际地址。
注册表 – 充当隐藏网络上所有服务的电话簿。它允许网关仅使用其逻辑名称查找问候服务。
问候服务 – 是基于流行的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即可节省门票费用。如果您需要帮助说服您的经理,请使用此页面。期待在那里见到您。