在这一系列文章中,我将为您介绍利用Spring Cloud和Docker构建微服务平台的一些基本概念。
什么是Spring Cloud
Spring Cloud是一系列Pivotal云应用开放工具的合称,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式,为构建分布式系统的一些常见模式提供了解决方案。
如果您熟悉构建应用程序的Spring Framework,那么对Spring Cloud就应该也不陌生,因为它就是以这些框架为基础而发展出来的。
在Spring Cloud提供的解决方案当中,你会发现解决以下问题的工具:
-
配置管理
-
服务探索
-
断路器
-
分布式会话
采用Spring Cloud 的最大好处在于它是构建在Spring Boot的概念之上的。
对第一次听说Spring Boot 的你们而言,从这个项目的名字就可以洞察一切。你可以从Spring Framework和项目生态系统当中得到一切所需,调整完善、简化配置并实现生产就绪。
服务探索和智能路由
每个服务在微服务架构中都有专门用途。在Spring Cloud上构建微服务架构时先要应对几个首要的问题,首先要创建的两个微服务分别叫做配置服务和探索服务。下面用一张图例来说明。
上图阐释了4步微服务设置,模块间的线条代表它们之间的关联性
配置服务位于上方,为黄色,并且依赖于其他的微服务;探索服务位于底部,为蓝色,也依赖于其他微服务。
有两个微服务是绿色的,它们与我将在本系列中使用的示例应用程序相关:电影和建议。
配置服务
配置服务是任何微服务架构的重要组成部分。以十二要素应用宣言的方法为基础,你的微服务的应用程序配置应储存于环境下,而非项目中。
配置服务之所以必要,是因为它通过简单的点到点服务呼叫来检索配置,从而处理所有服务,这样做的优点是多目的性。
假设我们拥有多个部署环境,那么如果我们只有一个测试环境和生产环境,这些环境的配置就将有所不同。配置服务可能会为某个环境配置专用的Git仓库,其他环境中无法访问该配置,仅有该环境中运行的配置服务可以访问该配置。
当配置服务启动时将引用这些配置文件的路径,并开始将这些文件提供给需要配置的微服务。每个微服务可以拥有各自的配置文件来配置到它正在运行的环境中,在此过程中,配置具体且集中于同一地方,这个地方可供版本控制和修订,无需重新启动服务来改变配置。
有了Spring Cloud可访问的管理端点,你可以更改环境中的配置和主导探索服务的刷新,这将使所有的消费者都获取全新配置。
探索服务
探索服务是微服务架构的另一个重要组成部分。探索服务处理并保有可用于集群的服务实例列表。在应用程序中,服务到服务的请求是由客户端发起的,而这个实例项目中却使用了Spring Cloud Feign,一个源自Netflix OSS项目,为微服务RESTful架构以客户为基础的API。
在上面的代码示例中,我创建了一个Feign客户端映射到由电影服务披露的REST API架构方法。首先使用@FeignClient注释,指定我想创建为电影微服务的客户API,接下来明确映射我想消费的服务,在描述REST API的方法中指定一个URL模式。
最有意思的部分则是创建Feign客户端,我只需知道想要创建的客户端服务ID就可以了。该服务URL是在运行时自动配置的,因为设置时集群中每个微服务都将在探索服务上注册一个服务ID。
这同样适用于微服务架构中的其他所有服务,用户只需提供想要通信的服务ID即可,其他一切将被Spring自动完成。
API网关
如果我们想要创建服务集群来管理领域实体,那么API网关服务就是另一个重要组成部分。下面的绿色六边形是我们的数据驱动服务,该服务管理领域实体,甚至还管理其数据库。通过增加API网关服务,我们可以为每个由绿色服务披露的API路径创建代理。
假定建议服务和电影服务在他们所管理的领域实体上暴露了自己的REST API,API网关将通过探索服务找出这些服务,并注入其他服务的API方法的代理路径。这种方式下,建议服务和电影服务将在所有暴露REST API的微服务中具有完整定义的本地路径,API网关将把路径请求通过HTTP重新转到其请求路径的服务实例上去。
示例项目
我将使用一个示例项目为您演示一个终端到终端的云原生平台,使用Spring Cloud构建实际微服务架构的方法。
示例中所展示的概念有:
-
Docker集成测试
-
混合持久化
-
微服务架构
-
服务探索
-
API网关
各个服务均是通过Docker建立和部署的,终端到终端的集成测试可以使用Docker在开发人员的机器上组建完成。
示例项目的核心概念之一是如何在实践中实现混合持久化,项目微服务使用其数据库的同时与其他服务通过REST或消息总线进行数据集成,以下各个数据库的都可以拥有微服务。
-
Neo4j(图形)
-
MongoDB的(文件)
-
MySQL的(关系)
示例项目演示了如何使用微服务,而非使用整体优先策略来构建新的应用程序。由于项目中的每个微服务都是“单亲项目”的一个模块,开发人员能够运行和开发其本地机器上运行的每个微服务。添加新的微服务的过程相当轻松,因为探索服务将自动发现集群上运行的新服务。
该项目包含两个探索服务,一个在Netflix Eureka上,另一个使用Hashicorp的Consul。拥有多个探索服务使得我们可以使用其一(Consul)为集群DNS提供商,另一(Eureka)为API网关代理。
每个微服务将与Eureka为整个集群协调检索API路径。在集群中,每个微服务均使用这种策略保持负载平衡,并通过一个API网关进行曝光。每个服务将自动探索并把API请求转到该路径服务上去。这个代理技术在开发用户界面方面和通过它自己的主机作为代理来访问平台上的全部API方面同样大有裨益。
示例项目使用Docker打造各个微服务的容器图像。作为Maven构建过程的一部分,我们可以轻易地在设备上通过Docker协调组建所有微服务集群。
让我们开始吧!
开始使用之前请访问此示例项目的GitHub信息库(在浏览器中手动输入如下链接)。
https://github.com/kbastani/spring-cloud-microservice-example
复制项目并将信息库下载到你的计算机上,下载后,你需要同时使用Maven和Docker进行本地编辑和构建图像。
首先,请下载Docker。如果您还没有下载,请先在开发设备上下载和运行Docker。您还需要安装DockerCompose,如果您使用的是Mac OSX和boot2docker,请确保您在VirtualBox上为boot2docker-VM配置的内存至少是5GB,具体方法详见如下命令。
在您的设备上运行该示例的要求如下:
-
Maven 3
-
Java 8
-
Docker
-
Docker Compose
想要从终端构建项目,请在项目的根目录下运行以下命令。
该项目将下载所有依赖关系和编写各个项目所需的要素,各个服务即将构建,然后Maven Docker插件将把各个图像自动构建到本地Docker注册中去。Docker必须运行,并且在运行mvn clean install命令后可以访问即为构建成功。
该项目成功生成后,你会看到如下内容:
现在,既然各个图像已经成功生成,我们可以使用Docker Compose运转集群,项目预配置中已包含Docker Compose的yaml文件。
从项目根目录,导航到spring-cloud-microservice-example/docker目录。
要启动微服务集群,请运行以下命令:
如果一切配置正确,我们先前构建的各个容器图像将在其Docker VM容器内推出,并可与自动服务探索联网。你会发现各个服务均有日志输出波动,因为它们开启了启动顺序,取决于你正在运行的设备的性能,这一过程可能需要几分钟。
一旦启动序列完成,就可以导航到Eureka主机,将会显示已注册探索服务的服务。
复制并粘贴以下命令到可以通过$ DOCKER_HOST环境变量进行访问的Docker终端上去。
如下图所示,如果Eureka可以正确启动,一个浏览器窗口将在Eureka服务仪表盘位置打开。
我们可以看到各个正在运行的服务实例及其状态,然后,我们可以访问数据驱动型服务中的一种,例如电影服务。
该命令将导航到API网关的端点,并将代理转向电影服务的REST API端点。这些REST API已配置为可使用HATEOAS的状态,可以自动探索所有服务的功能性和嵌入式链接的有效性。
总结
本文中主要回顾了以下概念,如果您能仔细回味一下刚刚的例子,相信能为您更好地理解微服务有所帮助。
-
服务探索
-
配置具体化
-
API网关
-
使用Docker Compose进行服务编排
作者介绍 Kenny Bastani
-
Spring项目组的一员,也是硅谷一位充满激情的技术推广者和开源软件的倡导者。
-
作为一个企业软件顾问,他把多样化的技能应用到敏捷模式下需要全栈Web开发人员的项目中去。作为流行的图形数据库Neo4j的积极倡导者,Kenny支持在其技术堆栈中嵌入NoSQL数据库。
-
作为一个充满激情的博主和开源贡献者,Kenny是开源开发社区中的一员,利用全新图形处理技术进行数据分析。
本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-07-05