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

laofo · 发布于 2017年10月17日 · 282 次阅读
4

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来支持象内嵌连接一样找到服务提供的所有功能。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册