Spring Cloud 简介
Spring Cloud 是一组由 Pivotal 公司开发的工具集,为搭建分布式系统提供一些常见模式的解决方案。如果你熟悉使用 Spring Framework 来搭建应用程序的话,会发现,Spring Cloud 是构建在它的一些常用构建块的基础上的。 Spring Cloud 提供了一系列工具,以使开发者能够在分布式系统上快速搭建起常用的功能。比如说:配置管理、服务发现、断路器、智能路由、微代理、控制总线、one-time tokens、全局锁、leadership election、分布式会话、集群状态。分布式系统的协调导致了样板模式(boiler plate patterns),并且使用 Spring Cloud 开发人员可以快速地搭建起实现这些模式的服务和应用程序。
Spring Cloud 中的绝大部分,是构建在 Spring Boot 的概念之上的。对于那些刚接触 Spring Boot 的人来说,这个项目的名字就是它的含义。你将会得到 Spring Framework 和项目生态系统最好的东西,经过最少的配置,调整到完美,做好生产前的所有准备。
Spring 顶级项目:
如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性。 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源。 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展。 这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。
12-Factor:
在微服务框架下,每个服务都只专注于一个目标。用 Spring Cloud 搭建微服务框架的时候,有几个先要处理的关键点。首先要创建的两个微服务是:配置服务(configuration service)和发现服务(discovery service)
上面的图片演示了一个由 4 个微服务组成的系统,以及他们之间的依赖关系。 在最上面的黄色标记的配置服务(configuration service),被其他所有的微服务所依赖。最下面的蓝色标记的发现服务(discovery service),同样是被其他所有的微服务所依赖。 绿色的两个微服务将会作为例子,贯穿整篇文章。他们分别提供电影播放和简介的服务。
配置服务(configuration service)对所有微服务框架都是一个只管重要的组件。基于 “12-factor app” 方法论,微服务应用程序的配置信息被保存在系统环境中,而不是工程文件里。 配置服务(configuration service)很重要的原因是:通过一个简单的点对点服务调用,所有的服务就可以通过它获取自己的配置信息。这样做的好处就是:多用途(一次配置多处使用)。 假设我们有多个部署环境。一个测试环境,一个生产环境,他们的配置信息肯定是不一样的。配置服务(configuration service)会有一个独立的 Git 仓库,每个环境只会读取自己专属的配置信息。
当配置服务(configuration service)启动之后,他会根据路径为其他的微服务们提供读取配置文件的服务。每个微服务都拥有它正在运行的环境所使用的配置文件。实现了配置信息的外置化、集中化,并将它们置于版本控制下。这样一来,修改配置信息也就不用重启(配置)服务了。 基于 Spring Cloud 对端点的管理,你可以在修改配置信息之后,刷新发现服务(discovery service),即实现了调用者(consumers)去提取新的配置信息。
发现服务(discovery service)是微服务架构中另一个必不可少的组件。它负责维护集群里所有正在运行中的服务实例的列表。在应用程序内部,用客户端的方式来实现服务间的调用。这里,我用的是 Spring Cloud Feign, 一个基于 RESTful 客户端的 API,源自于 Netflix OSS 项目。
在上面的代码里,创建了一个 Feign 客户端,把 movie 服务中暴露的接口,映射成 REST API。首先,我用@FeignClient注解指明,我要创建一个针对 movie 微服务的客户端 API。然后,我在函数的前面,以 URL 的形式,具体说明了哪些是接口函数——将它们定义成了 REST API 的路径。 要创建一个 Feign 客户端,我只需要知道我要访问的服务的 ID。因为,每个微服务的 URL 在发现服务(discovery service)启动的时候,就被注册在了各自的服务 ID 上。 在我搭建的微服务架构里的其他服务也都一样的。我想要跟哪个服务通讯,只要知道它的服务 ID 就可以了,其他的事情由 Spring 自动装配。
如果我们想要创建一个服务集群来管理他们自己的域实体,那么,API 网关服务(API Gateway)也是一个必不可少的组件。
让我们假设刚才介绍的两个服务和 movie 服务已经通过域实体暴露了 REST API。API 网关服务(API Gateway)会通过发现服务(discovery service)发现这些服务,并且将它们的接口函数,从其他服务那里注入基于代理的路由。这样,上面说的三个服务就具有了完整的 REST API 的路由(serviceID+apiUrl)。API 网关服务(API Gateway)将接口调用重定向成 HTTP 请求到对应的服务实例上。
下面,将用一个端到端的原生云(cloud-native)平台系统,来演示怎样用 SpringCloud 搭建真实的微服务框架。 每个服务都是 Docker 编译和部署的。开发人员在自己的开发环境就可以用 Docker 实现端到端的集成测试。 例子工程里一个核心概念,就是要探讨如何实现 “混合持久化”(注 4)。在整合其他服务的数据时(通过 REST 或是消息总线),工程中的微服务各自使用独立的数据库。举个例子,每个微服务都可以选择下面不同的数据库:
Neo4j (图形数据库) MongoDB (文档导向型数据库) MySQL (关系型数据库)
例子工程演示了怎样用微服务搭建一个应用程序,而不是采用 “整体架构先行” 的策略。正是因为每个微服务都是一个 “单父项目”,开发人员可以在本机上很方便地单独运行和开发任何一个微服务。添加一个新的微服务也很简单,就像发现服务会自动找到集群里新近运行的服务一样。本工程有两个发现服务,一个是 Netflix Eureka,另一个是 Hashicorp 的 Consul。用多个发现服务,是为了实现:一个为集群提供 DNS 功能(Consul),一个作为 API 网关服务(Eureka)。 例子工程用 Docker 为我们的每一个微服务创建一个容器镜像,作为 maven 部署的一部分。我们甚至可以很轻松地把整个微服务集群都部署(orchestrate 编配)到我们的开发机上
4.1 安装与部署 Step 1 安装 Docker 如果使用的是 Windows 10 专业版和企业版,可下载安装 Windows 版的 Docker。其他版本的操作系统可下载安装 DockerToolbox。 下载地址:https://www.docker.com/products/docker-toolbox Step 2 下载 Docker-compose 我安装 DockerToolbox 应该已经安装了 Docker-compose,但安装后仍然找不到该程序集,所以我直接下载了一个 Docker-compose 程序集使用,无需安装。 Step 3 安装 Java 8 Step 4 安装 Maven 3 Step 5 配置环境变量 Step 6 配置虚拟机内存 将 Docker 主机内存大小设置在 5G 以上。 Step 7 下载 Demo 源文件 下载地址为:https://github.com/kbastani/spring-cloud-microservice-example Step 8 编译工程 开始编译:打开终端(命令行),在工程的根目录下运行如下命令: $ mvn clean install 工程将会下载所有的依赖,并依次编译每一个服务(artifacts)。编译完之后,Maven 上的 Docker 插件会自动将这些镜像文件拷贝到你本地的 Docker 资源库里。在运行 mvn clean install 这个命令的时候,Docker 必须是运行并可用的,才能保证编译成功。成功之后,你将会看到如下输出:
Step 9 启动 Docker 第一次启动时间会比较长,请注意下图中的 Docker 主机地址。
Step 10 用 Docker Compose 运行集群 所有的镜像都已编译成功,我们可以用 Docker Compose 把集群运转起来了。我已经在工程里引入了一个预编译的 Docker Compose yaml 文件。 从工程根目录进入 spring-cloud-microservice-example/docker 目录,运行如下命令来启动微服务集群: $ docker-compose up 只要正确地配置,我们编译的镜像将会在 Docker 容器里启动,发现服务自动加载到网络上。你会在 log 输出端看见一阵忙乱,是因为这些服务都在依次启动各自的应用。这可能会持续几分钟,依机器的性能而定。
启动完毕之后,你可以看到 Docker 容器和端口映射信息。
4.2 演示 请使用 IE 以外的浏览器访问,地址参考 Docker 主机 IP 地址和端口映射信息。
我们可以在上看见所有已经启动的服务实例,以及他们的状态。怎样登陆一个以数据驱动的服务呢?以 movie 服务为例:
通过 API 网关找到 movie 服务的 REST API。这些 REST API 经过配置,使用 HATEOAS 来支持象内嵌连接一样找到服务提供的所有功能。