其他配置和发现功能
前篇文中提到“服务发现”和“使用Spring Cloud Config”进行分布式配置”中讨论了大量有关服务发现和分布式配置的内容。我们详细讨论了两种解决方案,其中的第一个解决方案是Eureka,由Netlix Oss提供,并已被Spring Cloud用于服务发现; 第二个解决方案是Spring Cloud Config项目,仅专用于分布式配置。但是,市场上有一些有趣的解决方案有效地结合了这两个功能。目前,Spring Cloud支持其中两个。
口Consul: 该产品由HashiCorp构建。它是一种高度可用的分布式解决方案,旨在跨动态分布式基础架构连接和配置应用程序。Consul是一个相当复杂的产品,具有多个组件,但其主要功能是在任何基础架构中发现和配置服务。
口Zookeeper: 该产品由Apache Software Foundation构建。它是一个用Java编写的分布式、分层键/值存储。它旨在维护配置信息、命名和分布式同步。与Consul相比,它更像是一种原始的键/值存储而不是现代服务发现工具。但是, Zookeeper仍然非常流行,特别是对基于Apache Sofware堆栈的解决方案更是如此。对该领域其他两种受欢迎产品的支持仍处于开发阶段。以下项目尚未添加到官方Spring Cloud版本列车中。
口Kubernetes: 这是一 个开源解决方案,旨在实现最初由Google创建的容器化应用程序的自动化部署、扩展和管理。这个工具现在很受欢迎。最近,Docker 平台已经开始支持Kubermetes。
口Eted:这是一个分布式可靠的键/值存储,用于Go中编写的分布式系统的最关键数据。它被许多公司和其他软件产品用于生产,如Kubernetes。本章将仅介绍官方支持的解决方案,即Consul和Zookeeper。Kubernetes 不仅仅是一个键/值存储或服务注册表,本书将在第14章“Docker支持”中详细讨论它。
使用Spring Cloud Consul
Spring Cloud Consul项目可以通过自动配置为Consul和Spring Boot应用程序提供集成。通过使用众所周知的Spring Framework注解样式,开发人员可以在基于微服务的环境中启用和配置常见模式。这些模式包括:使用Consul代理进行服务发现、使用Consul键/值存储进行分布式配置、使用Spring Cloud Bus进行分布式事件以及使用Consul Events等。该项目还支持基于Netflix Ribbon的客户端负载均衡器和基于Nettlix Zuul的API网关。在开始讨论这些功能之前,必须先运行并配置Consul代理。
运行 Consul代理
我们将从在本地计算机上启动Consul代理的最简单方法开始。可以使用Docker容器轻松设置独立开发模式。以下命令将从Docker Hub上可用的官方Hashicorp 镜像启动Consul容器。
docker run -d --name consul -p 8500:8500 consul
在启动之后,Consul的地址为htp://9/168.99.100.85000 它公开了RESTful HTTP API,这也是它的主接口。所有API路由都以/VI/为前缀。当然,它不需要直接使用API。有一些编程库可以更方便地使用API,其中一个是consul-api,客户端用Java编写,内部也由Spring Cloud Consul使用。Consul 提供的Web用户界面仪表板在与HTTP API相同的地址下可用,但在不同的上下文路径/ui/上。它允许查看所有已注册的服务和节点,查看所有运行状况检查及其当前状态,以及读取和设置键/值数据。
如前文所述,我们将使用Consul的3个不同功能一代理、事件和键值存储。它们的对应端点分别是/agent. /event 和Av。 最有趣的代理端点是与服务注册相关的端点。表10.1是这些代理端点的列表。
/kv端点专用于管理简单的键/值存储,这对于存储服务配置或其他元数据特别有用。值得注意的是,每个数据中心都有自己的KV存储,因此,要在多个节点之间共享它,开发人员应该配置Consul复制守护进程。表10.2是管理键/值存储的3个端点的列表。
Spring Cloud使用Consul Events 提供动态配置重新加载。有两种简单的API方法。第一种是PUT /event/fire/:name,它将触发一个新事件。第二种是GET /event/list,它将返回一个事件列表,并且可以按名称、标记、节点或服务名称进行过滤。
在客户端集成
要在项目中激活Consul服务发现,应该在依赖项中包含spring
cloud-tarter-consul-discovery启动器。如果要使用Consul 启用分布式配置,只需包含spring-cloud-starter-consul-confg.在某些情况下,开发人员可能会在客户端应用程序中使用这两个功能,这样的话就应该声明对spring cloud. starter consu-al工件的依赖。
<dependency>
<groupId>org. spr ingframework. cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</arti factId>
</dependency>