DevOps Spring Cloud 和 Docker 搭建微服务平台

laofo · 2017年10月17日 · 45 次阅读

Spring Cloud 简介

1.1 Spring Cloud

Spring Cloud 是一组由 Pivotal 公司开发的工具集,为搭建分布式系统提供一些常见模式的解决方案。如果你熟悉使用 Spring Framework 来搭建应用程序的话,会发现,Spring Cloud 是构建在它的一些常用构建块的基础上的。 Spring Cloud 提供了一系列工具,以使开发者能够在分布式系统上快速搭建起常用的功能。比如说:配置管理、服务发现、断路器、智能路由、微代理、控制总线、one-time tokens、全局锁、leadership election、分布式会话、集群状态。分布式系统的协调导致了样板模式(boiler plate patterns),并且使用 Spring Cloud 开发人员可以快速地搭建起实现这些模式的服务和应用程序。

1.2 Spring Boot

Spring Cloud 中的绝大部分,是构建在 Spring Boot 的概念之上的。对于那些刚接触 Spring Boot 的人来说,这个项目的名字就是它的含义。你将会得到 Spring Framework 和项目生态系统最好的东西,经过最少的配置,调整到完美,做好生产前的所有准备。

1.3 Spring 框架及 spring cloud 框架主要组件

Spring 顶级项目:

  • Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你使用 maven dependency 引入 spring jar 包时它就在工作了。
  • Spring Boot:旨在简化创建产品级的 Spring Cloud 联合部署。
  • Spring Framework:即通常所说的 spring 框架,是一个开源的 Java/Java EE 全功能栈应用程序框架,其它 spring 项目如 spring boot 也依赖于此框架。
  • Spring Cloud:微服务工具包,为开发者提供了在分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线等开发工具包。
  • Spring XD:是一种运行时环境(服务器软件,非开发框架),组合 spring 技术,如 spring batch、spring boot、spring data,采集大数据并处理。
  • Spring Data:是一个数据访问及操作的工具包,封装了很多种数据及数据库的访问相关技术,包括:jdbc、Redis、MongoDB、Neo4j 等。
  • Spring Batch:批处理框架,或者说是批量任务执行管理器,功能包括任务调度、日志记录/跟踪等。
  • Spring Security:是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
  • Spring Integration:面向企业应用集成(EAI/ESB)的编程框架,支持的通信方式包括 HTTP、FTP、TCP/UDP、JMS、RabbitMQ、Email 等。
  • Spring Social:一组工具包,一组连接社交服务 API,如 Twitter、Facebook、LinkedIn、GitHub 等,有几十个。
  • Spring AMQP:消息队列操作的工具包,主要是封装了 RabbitMQ 的操作。
  • Spring HATEOAS:是一个用于支持实现超文本驱动的 REST Web 服务的开发库。
  • Spring Mobile:是 Spring MVC 的扩展,用来简化手机上的 Web 应用开发。
  • Spring for Android:是 Spring 框架的一个扩展,其主要目的在于简化 Android 本地应用的开发,提供 RestTemplate 来访问 Rest 服务。
  • Spring Web Flow:目标是成为管理 Web 应用页面流程的最佳方案,将页面跳转流程单独管理,并可配置。
  • Spring LDAP:是一个用于操作 LDAP 的 Java 工具包,基于 Spring 的 JdbcTemplate 模式,简化 LDAP 访问。
  • Spring Session:session 管理的开发工具包,让你可以把 session 保存到 redis 等,进行集群化 session 管理。
  • Spring Web Services:是基于 Spring 的 Web 服务框架,提供 SOAP 服务开发,允许通过多种方式创建 Web 服务。
  • Spring Shell:提供交互式的 Shell 可让你使用简单的基于 Spring 的编程模型来开发命令,比如 Spring Roo 命令。
  • Spring Roo:是一种 Spring 开发的辅助工具,使用命令行操作来生成自动化项目,操作非常类似于 Rails。
  • Spring Scala:为 Scala 语言编程提供的 spring 框架的封装(新的编程语言,Java 平台的 Scala 于 2003 年底/2004 年初发布)。
  • Spring BlazeDS Integration:一个开发 RIA 工具包,可以集成 Adobe Flex、BlazeDS、Spring 以及 Java 技术创建 RIA。
  • Spring Loaded:用于实现 java 程序和 web 应用的热部署的开源工具。
  • Spring REST Shell:可以调用 Rest 服务的命令行工具,敲命令行操作 Rest 服务。   目前来说 spring 主要集中于 spring boot(用于开发微服务)和 spring cloud 相关框架的开发,spring cloud 子项目包括:
  • Spring Cloud Config:配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储、Git 以及 Subversion。
  • Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。
  • Spring Cloud Netflix:针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka、Hystrix、Zuul、Archaius 等。
  • Netflix Eureka:云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。
  • Netflix Hystrix:容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
  • Netflix Zuul:边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。
  • Netflix Archaius:配置管理 API,包含一系列配置管理 API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
  • Spring Cloud for Cloud Foundry:通过 Oauth2 协议绑定服务到 CloudFoundry,CloudFoundry 是 VMware 推出的开源 PaaS 云平台。
  • Spring Cloud Sleuth:日志收集工具包,封装了 Dapper,Zipkin 和 HTrace 操作。
  • Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。
  • Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指 OAuth2。
  • Spring Cloud Consul:封装了 Consul 操作,consul 是一个服务发现与配置工具,与 Docker 容器可以无缝集成。
  • Spring Cloud Zookeeper:操作 Zookeeper 的工具包,用于使用 zookeeper 方式的服务注册和发现。
  • Spring Cloud Stream:数据流操作开发包,封装了与 Redis,Rabbit、Kafka 等发送接收消息。
  • Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。-

1.4 “12-factor app” 方法论

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性。 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源。 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展。 这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

12-Factor:

  • I. 基准代码: 一份基准代码,多份部署
  • II. 依赖: 显式声明依赖关系
  • III. 配置: 在环境中存储配置
  • IV. 后端服务:把后端服务当作附加资源
  • V. 构建,发布,运行: 严格分离构建和运行
  • VI. 进程: 以一个或多个无状态进程运行应用
  • VII. 端口绑定:通过端口绑定提供服务
  • VIII. 并发:通过进程模型进行扩展
  • IX. 易处理:快速启动和优雅终止可最大化健壮性
  • X. 开发环境与线上环境等价:尽可能的保持开发,预发布,线上环境相同
  • XI. 日志:把日志当作事件流
  • XII. 管理进程:后台管理任务当作一次性进程运行

服务发现和智能路由

在微服务框架下,每个服务都只专注于一个目标。用 Spring Cloud 搭建微服务框架的时候,有几个先要处理的关键点。首先要创建的两个微服务是:配置服务(configuration service)和发现服务(discovery service)

上面的图片演示了一个由 4 个微服务组成的系统,以及他们之间的依赖关系。 在最上面的黄色标记的配置服务(configuration service),被其他所有的微服务所依赖。最下面的蓝色标记的发现服务(discovery service),同样是被其他所有的微服务所依赖。 绿色的两个微服务将会作为例子,贯穿整篇文章。他们分别提供电影播放和简介的服务。

2.1 配置服务(configuration service)

配置服务(configuration service)对所有微服务框架都是一个只管重要的组件。基于 “12-factor app” 方法论,微服务应用程序的配置信息被保存在系统环境中,而不是工程文件里。   配置服务(configuration service)很重要的原因是:通过一个简单的点对点服务调用,所有的服务就可以通过它获取自己的配置信息。这样做的好处就是:多用途(一次配置多处使用)。   假设我们有多个部署环境。一个测试环境,一个生产环境,他们的配置信息肯定是不一样的。配置服务(configuration service)会有一个独立的 Git 仓库,每个环境只会读取自己专属的配置信息。

当配置服务(configuration service)启动之后,他会根据路径为其他的微服务们提供读取配置文件的服务。每个微服务都拥有它正在运行的环境所使用的配置文件。实现了配置信息的外置化、集中化,并将它们置于版本控制下。这样一来,修改配置信息也就不用重启(配置)服务了。 基于 Spring Cloud 对端点的管理,你可以在修改配置信息之后,刷新发现服务(discovery service),即实现了调用者(consumers)去提取新的配置信息。

2.2 发现服务(discovery service)

发现服务(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 网关服务(API Gateway)也是一个必不可少的组件。

让我们假设刚才介绍的两个服务和 movie 服务已经通过域实体暴露了 REST API。API 网关服务(API Gateway)会通过发现服务(discovery service)发现这些服务,并且将它们的接口函数,从其他服务那里注入基于代理的路由。这样,上面说的三个服务就具有了完整的 REST API 的路由(serviceID+apiUrl)。API 网关服务(API Gateway)将接口调用重定向成 HTTP 请求到对应的服务实例上。

Demo

下面,将用一个端到端的原生云(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 来支持象内嵌连接一样找到服务提供的所有功能。

暂无回复。
需要 登录 后方可回复。