文章目录
- 第1章 欢迎迈入云世界,Spring
-
- 1.1 什么是微服务
- 1.2 什么是Spring,为什么它与微服务有关
- 1.5 使用Spring Boot来构建微服务
- 1.6 为什么要改变构建应用的方式
- 1.7 云到底是什么
- 1.8 为什么是云和微服务
- 1.9 微服务不只是编写代码
-
- 1.9.1 核心微服务开发模式
- 1.9.2 微服务路由模式
- 1.9.3 微服务客户端弹性模式
- 1.9.4 微服务安全模式
- 1.9.5 微服务日志记录和跟踪模式
- 1.9.6 微服务构建和部署模式
- 1.10 使用Spring Cloud构建微服务
-
- 1.10.1 Spring Boot
- 1.10.2 Spring Cloud Config
- 1.10.3 Spring Cloud服务发现
- 1.10.4 Spring Cloud与Netflix Hystrix和Netflix Ribbon
- 1.10.5 Spring Cloud与Netflix Zuul
- 1.10.6 Spring Cloud Stream
- 1.10.7 Spring Cloud Sleuth
- 1.10.8 Spring Cloud Security
- 1.10.9 代码供应
- 1.11 通过示例来介绍Spring Cloud
- 1.12 确保本书的示例是有意义的
- 1.13 小结
- 源码地址
- 源码地址
第1章 欢迎迈入云世界,Spring
1.1 什么是微服务
微服务架构具有以下特征。
- 应用程序逻辑分解为具有明确定义了职责范围的细粒度组件,这些组件互相协调提供解决方案。
- 每个组件都有一个小的职责领域,并且完全独立部署。微服务应该对业务领域的单个部分负责。此外,一个微服务应该可以跨多个应用程序复用。
- 微服务通信基于一些基本的原则(注意,我说的是原则而不是标准),并采用HTTP和JSON(JavaScript Object Notation)这样的轻量级通信协议,在服务消费者和服务提供者之间进行数据交换。
- 服务的底层采用什么技术实现并没有什么影响,因为应用程序始终使用技术中立的协议(JSON是最常见的)进行通信。这意味着构建在微服务之上的应用程序能够使用多种编程语言和技术进行构建。
- 微服务利用其小、独立和分布式的性质,使组织拥有明确责任领域的小型开发团队。这些团队可能为同一个目标工作,如交付一个应用程序,但是每个团队只负责他们在做的服务。
1.2 什么是Spring,为什么它与微服务有关
在基于Java的应用程序构建中,Spring已经成为了事实上的标准开发框架。Spring的核心是建立在依赖注入的概念上的。在普通的Java应用程序中,应用程序被分解成为类,其中每个类与应用程序中的其他类经常有明显的联系,这些联系是在代码中直接调用类的构造器,一旦代码被编译,这些联系点将无法修改。
这在大型项目中是有问题的,因为这些外部联系是脆弱的,并且进行修改可能会对其他下游代码造成多重影响。依赖注入框架(如Spring),允许用户通过约定(以及注解)将应用程序对象之间的关系外部化,而不是在对象内部彼此硬编码实例化代码,以便更轻松地管理大型Java项目。Spring在应用程序的不同的Java类之间充当一个中间人,管理着它们的依赖关系。Spring本质上就是让用户像玩乐高积木一样将自己的代码组装在一起。
Spring能够快速引入特性的特点推动了它的实际应用,使用J2EE技术栈开发应用的企业级Java开发人员迅速采用它作为一个轻量级的替代方案。J2EE栈虽然功能强大,但许多人认为它过于庞大,甚至许多特性从未被应用程序开发团队使用过。此外,J2EE应用程序强制用户使用成熟的(和沉重的)Java应用程序服务器来部署自己的应用程序。
Spring框架的迷人之处在于它能够与时俱进并进行自我改造——它已经向开发 区证明了这一点。Spring团队发现,许多开发团队正在从将应用程序的展现、业务和数据访问逻辑打包在一起并部署为单个制品的单体应用程序模型中迁移,正转向高度分布式的模型,服务能够被构建成可以轻松部署到云端的小型分布式服务。为了响应这种转变,Spring开发团队启动了两个项目,即Spring Boot和Spring Cloud。
Spring Boot是对Spring框架理念重新思考的结果。虽然Spring Boot包含了Spring的核心特性,但它剥离了Spring中的许多“企业”特性,而提供了一个基于Java的、面向REST[1]的微服务框架。只需一些简单的注解,Java开发者就能够快速构建一个可打包和部署的REST 微服务,这个微服务并不需要外部的应用容器。
注意
虽然本书会在第2章中更详细地介绍REST,但REST背后最为核心的概念是,服务应该使用HTTP动词(GET、POST、PUT和DELETE)来代表服务中的核心操作,并且使用轻量级的面向Web的数据序列化协议(如JSON)来从服务请求数据和从服务接收数据。
在构建基于云的应用时,微服务已经成为更常见的架构模式之一,因此Spring 区为开发者提供了Spring Cloud。Spring Cloud框架使实施和部署微服务到私有云或公有云变得更加简单。Spring Cloud在一个公共框架之下封装了多个流行的云管理微服务框架,并且让这些技术的使用和部署像为代码添加注解一样简便。本章随后将介绍Spring Cloud中的不同组件。
1.5 使用Spring Boot来构建微服务
在本节中,我们不会详细介绍大部分代码。这个例子的目标是让读者体会一下编写Spring Boot服务的感受。第2章中会深入更多的细节。
图1-3展示了这个服务将会做什么,以及Spring Boot微服务将会如何处理用户请求的一般流程。
{“message”:“Hello john carnell”}
让我们启动服务。为此,请转到命令提示符并输入以下命令:
mvn spring-boot:run
这条mvn命令将使用Spring Boot插件,然后使用嵌入式Tomcat服务器启动应用程序。
1.6 为什么要改变构建应用的方式
我们正处于历史的拐点。现代 会的几乎所有方面都可以通过互联 连接在一起。习惯于为当地市场服务的公司突然发现,他们可以接触到全球的客户群,全球更大的客户群一起涌进来的同时也带来了全球竞争。这些竞争压力意味着以下力量正在影响开发人员考虑构建应用程序的方式。
- 复杂性上升——客户期望组织的所有部门都知道他们是谁。与单个数据库通信并且不与其他应用程序集成的“孤立的”应用程序已不再是常态。如今,应用程序不仅需要与多个位于公司数据中心内的服务和数据库进行通信,还需要通过互联 与外部服务提供商的服务和数据库进行通信。
- 客户期待更快速的交付——客户不再希望等待软件包的下一次年度发布或整体版本更新。相反,他们期望软件产品中的功能被拆分,以便在几周(甚至几天)内即可快速发布新功能,而无需等待整个产品发布。
- 性能和可伸缩性——全球性的应用程序使预测应用程序将处理多少事务量以及何时触发该事务量变得非常困难。应用程序需要快速跨多个服务器进行扩大,然后在事务量高峰过去时进行收缩。
- 客户期望他们的应用程序可用——因为客户与竞争对手之间只有点击一下鼠标的距离,所以企业的应用程序必须具有高度的弹性。应用程序中某个部分的故障或问题不应该导致整个应用程序崩溃。
为了满足这些期望,作为应用开发人员,我们不得不接受这样一个悖论:构建高可伸缩性和高度冗余的应用程序。我们需要将应用程序分解成可以互相独立构建和部署的小型服务。如果将应用程序“分解”为小型服务,并将它们从单体制品中转移出来,那么就可以构建具有下面这些特性的系统。
- 灵活性——可以将解耦的服务进行组合和重新安排,以快速交付新的功能。一个正在使用的代码单元越小,更改代码越不复杂,测试部署代码所需的时间越短。
- 有弹性——解耦的服务意味着应用程序不再是单个“泥浆球”,在这种架构中其中一部分应用程序的降级会导致整个应用程序失败。故障可以限制在应用程序的一小部分之中,并在整个应用程序遇到中断之前被控制。这也使应用程序在出现不可恢复的错误的情况下能够优雅地降级。
- 可伸缩性——解耦的服务可以轻松地跨多个服务器进行水平分布,从而可以适当地对功能 / 服务进行伸缩。单体应用程序中的所有逻辑是交织在一起的,即使只有一小部分应用程序是瓶颈,整个应用程序也需要扩展。小型服务的扩展是局部的,成本效益更高。
为此,当我们开始讨论微服务时,请记住下面一句话:小型的、简单的和解耦的服务=可伸缩的、有弹性的和灵活的应用程序。
1.7 云到底是什么
术语“云”已经被过度使用了。每个软件供应商都有云,每个软件供应商的平台都是支持云的,但是如果穿透这些天花乱坠的广告宣传,我们就会发现云计算有3种基本模式。它们是:
- 基础设施即服务(Infrastructure as a Service,IaaS);
- 平台即服务(Platform as a Service,PaaS);
- 软件即服务(Software as a Service,SaaS)。
为了更好地理解这些概念,让我们将每天的任务映射到不同的云计算模型中。当你想吃饭时,你有4种选择
1)在家做饭;
(2)去食品杂货店买一顿预先做好的膳食,然后你加热并享用它;
(3)叫外卖送到家里;
(4)开车去餐厅吃饭。
图1-6展示了各种模型。
图1-7 微服务不只是业务逻辑,还需要考虑服务的运行环境以及服务的伸缩性和弹性
下面我们来更详细地了解一下图1-7中提及的要点。
- 大小适当——如何确保正确地划分微服务的大小,以避免微服务承担太多的职责记住,适当的大小允许快速更改应用程序,并降低整个应用程序中断的总体风险。
- 位置透明——在微服务应用程序中,多个服务实例可以快速启动和关闭时,如何管理服务调用的物理细节/li>
- 有弹性——如何通过绕过失败的服务,确保采取“快速失败”的方法来保护微服务消费者和应用程序的整体完整性/li>
- 可重复——如何确保提供的每个新服务实例与生产环境中的所有其他服务实例具有相同的配置和代码库/li>
- 可伸缩——如何使用异步处理和事件来最小化服务之间的直接依赖关系,并确保可以优雅地扩展微服务/li>
本书采用基于模式的方法来回答这些问题。通过基于模式的方法,本书列出可以跨不同技术实现来使用的通用设计。虽然本书选择了使用Spring Boot和Spring Cloud来实现本书中所使用的模式,但开发人员完全可以把这些概念和其他技术平台一起使用。具体来说,本书涵盖以下6类微服务模式:
- 核心微服务开发模式;
- 微服务路由模式;
- 微服务客户端弹性模式;
- 微服务安全模式;
- 微服务日志记录和跟踪模式;
- 微服务构建和部署模式。
让我们深入了解一下这些模式。
1.9.1 核心微服务开发模式
核心微服务开发模式解决了构建微服务的基础问题,图1-8突出了我们将要讨论的基本服务设计的主题。
图1-9 服务发现和路由是所有大规模微服务应用的关键部分
1.9.3 微服务客户端弹性模式
因为微服务架构是高度分布式的,所以必须对如何防止单个服务(或服务实例)中的问题级联暴露给服务的消费者十分敏感。为此,这里将介绍4种客户端弹性模式。
- 客户端负载均衡——如何在服务客户端上缓存服务实例的位置,以便对微服务的多个实例的调用负载均衡到该微服务的所有健康实例/li>
- 断路器模式——如何阻止客户继续调用出现故障的或遭遇性能问题的服务果服务运行缓慢,客户端调用时会消耗它的资源。开发人员希望出现故障的微服务调用能够快速失败,以便主叫客户端可以快速响应并采取适当的措施。
- 后备模式——当服务调用失败时,如何提供“插件”机制,允许服务的客户端尝试通过调用微服务之外的其他方法来执行工作/li>
- 舱壁模式——微服务应用程序使用多个分布式资源来执行工作。如何区分这些调用,以便表现不佳的服务调用不会对应用程序的其他部分产生负面影响/li>
图1-10展示了这些模式如何在服务表现不佳时,保护服务消费者不受影响。第5章将会介绍这些主题。
图1-11 使用基于令牌的安全方案,可以实现服务验证和授权,而无需传递客户端凭据
本书现在不会太深入图1-11中的细节。需要一整章来介绍安全是有原因的(实际上它本身就可以是一本书)。
1.9.5 微服务日志记录和跟踪模式
微服务架构的优点是单体应用程序被分解成可以彼此独立部署的小的功能部件,而它的缺点是调试和跟踪应用程序和服务中发生的事情要困难得多。
因此,本书将介绍以下3种核心日志记录和跟踪模式。
- 日志关联——一个用户事务会调用多个服务,如何将这些服务所生成的日志关联到一起助这种模式,本书将会介绍如何实现一个关联(correlation)ID,这是一个唯一的标识符,在事务中调用所有服务都会携带它,通过它能够将每个服务生成的日志条目联系起来。
- 日志聚合——借助这种模式,我们将会介绍如何将微服务(及其各个实例)生成的所有日志合并到一个可查询的数据库中。此外,本书还会研究如何使用关联ID来协助搜索聚合日志。
- 微服务跟踪——最后,我们将探讨如何在涉及的所有服务中可视化客户端事务的流程,并了解事务所涉及的服务的性能特征。
图1-12展示了这些模式如何配合在一起。第9章中将会更加详细地介绍日志记录和跟踪模式。
图1-13 开发人员希望微服务及其运行所需的服务器成为在不同环境间作为整体部署的原子制件
- 构建和部署管道——如何创建一个可重复的构建和部署过程,只需一键即可构建和部署到组织中的任何环境/li>
- 基础设施即代码——如何将服务的基础设施作为可在源代码管理下执行和管理的代码去对待/li>
- 不可变服务器——一旦创建了微服务镜像,如何确保它在部署之后永远不会更改/li>
- 凤凰服务器(Phoenix server)——服务器运行的时间越长,就越容易发生配置漂移。如何确保运行微服务的服务器定期被拆卸,并重新创建一个不可变的镜像/li>
使用这些模式和主题的目的是,在配置漂移影响到上层环境(如交付准备环境或生产环境)之前,尽可能快地公开并消除配置漂移。
注意
本书中的代码示例(除了第10章)都将在本地机器上运行。前两章的代码可以直接从命令行运行,从第3章开始,所有代码将被编译并作为Docker容器运行。
1.10 使用Spring Cloud构建微服务
本节将简要介绍在构建微服务时会使用的Spring Cloud技术。这是一个高层次的概述。在书中使用各项技术时,我们会根据需要为读者讲解这些技术的细节。
从零开始实现所有这些模式将是一项巨大的工作。幸好,Spring团队将大量经过实战检验的开源项目整合到一个称为Spring Cloud的Spring子项目中。
Spring Cloud将Pivotal、HashiCorp和Netflix等开源公司的工作封装在一起。Spring Cloud简化了将这些项目设置和配置到Spring应用程序中的工作,以便开发人员可以专注于编写代码,而不会陷入配置构建和部署微服务应用程序的所有基础设施的细节中。
图1-14将1.9节中列出的模式映射到实现它们的Spring Cloud项目。

图1-14 可以将这些直接可用的技术与本章探讨的微服务模式对应起来
下面让我们更详细地了解一下这些技术。
1.10.1 Spring Boot
Spring Boot是微服务实现中使用的核心技术。Spring Boot通过简化构建基于REST的微服务的核心任务,大大简化了微服务开发。Spring Boot还极大地简化了将HTTP类型的动词(GET、PUT、POST和DELETE)映射到URL、JSON协议序列化与Java对象的相互转化,以及将Java异常映射回标准HTTP错误代码的工作。
1.10.2 Spring Cloud Config
Spring Cloud Config通过集中式服务来处理应用程序配置数据的管理,因此应用程序配置数据(特别是环境特定的配置数据)与部署的微服务完全分离。这确保了无论启动多少个微服务实例,这些微服务实例始终具有相同的配置。Spring Cloud Config拥有自己的属性管理存储库,也可以与以下开源项目集成。
- Consul——Consul是一种开源的服务发现工具,允许服务实例向该服务注册自己。服务客户端可以向Consul咨询服务实例的位置。Consul还包括可以被Spring Cloud Config使用的基于键值存储的数据库,能够用来存储应用程序的配置数据。
- Eureka——Eureka是一个开源的Netflix项目,像Consul一样,提供类似的服务发现功能。Eureka同样有一个可以被Spring Cloud Config使用的键值数据库。
1.10.3 Spring Cloud服务发现
通过Spring Cloud服务发现,开发人员可以从客户端消费的服务中抽象出部署服务器的物理位置(IP或服务器名称)。服务消费者通过逻辑名称而不是物理位置来调用服务器的业务逻辑。Spring Cloud服务发现也处理服务实例的注册和注销(在服务实例启动和关闭时)。Spring Cloud服务发现可以使用Consul和Eureka作为服务发现引擎。
1.10.4 Spring Cloud与Netflix Hystrix和Netflix Ribbon
Spring Cloud与Netflix的开源项目进行了大量整合。对于微服务客户端弹性模式,Spring Cloud封装了Netflix Hystrix库和Netflix Ribbon项目,开发人员可以轻松地在微服务中使用它们。
使用Netflix Hystrix库,开发人员可以快速实现服务客户端弹性模式,如断路器模式和舱壁模式。
虽然Netflix Ribbon项目简化了与诸如Eureka这样的服务发现代理的集成,但它也为服务消费者提供了客户端对服务调用的负载均衡。即使在服务发现代理暂时不可用时,客户端也可以继续进行服务调用。
1.10.5 Spring Cloud与Netflix Zuul
Spring Cloud使用Netflix Zuul项目为微服务应用程序提供服务路由功能。Zuul是代理服务请求的服务 关,确保在调用目标服务之前,对微服务的所有调用都经过一个“前门”。通过集中的服务调用,开发人员可以强制执行标准服务策略,如安全授权验证、内容过滤和路由规则。
1.10.6 Spring Cloud Stream
Spring Cloud Stream(https://cloud.spring.io/spring-cloud-stream/)是一种可让开发人员轻松地将轻量级消息处理集成到微服务中的支持技术。借助Spring Cloud Stream,开发人员能够构建智能的微服务,它可以使用在应用程序中出现的异步事件。此外,使用Spring Cloud Stream可以快速将微服务与消息代理进行整合,如RabbitMQ和Kafka。
1.10.7 Spring Cloud Sleuth
Spring Cloud Sleuth允许将唯一跟踪标识符集成到应用程序所使用的HTTP调用和消息通道(RabbitMQ、Apache Kafka)之中。这些跟踪 码(有时称为关联ID或跟踪ID)能够让开发人员在事务流经应用程序中的不同服务时跟踪事务。有了Spring Cloud Sleuth,这些跟踪ID将自动添加到微服务生成的任何日志记录中。
Spring Cloud Sleuth与日志聚合技术工具(如Papertrail)和跟踪工具(如Zipkin)结合时,能够展现出真正的威力。Papertail是一个基于云的日志记录平台,用于将日志从不同的微服务实时聚合到一个可查询的数据库中。Zipkin可以获取Spring Cloud Sleuth生成的数据,并允许开发人员可视化单个事务涉及的服务调用流程。
1.10.8 Spring Cloud Security
Spring Cloud Security是一个验证和授权框架,可以控制哪些人可以访问服务,以及他们可以用服务做什么。Spring Cloud Security是基于令牌的,允许服务通过验证服务器发出的令牌彼此进行通信。接收调用的每个服务可以检查HTTP调用中提供的令牌,以确认用户的身份以及用户对该服务的访问权限。
此外,Spring Cloud Security支持JSON Web Token。JSON Web Token(JWT)框架标准化了创建OAuth2令牌的格式,并为创建的令牌进行数字签名提供了标准。
1.10.9 代码供应
要实现代码供应,我们将会转移到其他的技术栈。Spring框架是面向应用程序开发的,它(包括Spring Cloud)没有用于创建“构建和部署”管道的工具。要实现一个“构建和部署”管道,开发人员需要使用Travis CI和Docker这两样工具,前者可以作为构建工具,而后者可以构建包含微服务的服务器镜像。
为了部署构建好的Docke
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!