Spring微服务架构设计(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-08 07:11:38

点击下载

作者:(印)拉杰什·R. V.(Rajesh R V)

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spring微服务架构设计(第2版)

Spring微服务架构设计(第2版)试读:

前言

本书内容

本书要求

读者对象

排版约定

读者反馈

用户支持

下载示例代码

疑问

勘误

侵权行为

电子书

第 1 章 微服务揭秘

1.1 微服务的演进

1.1.1 微服务演进的催化剂——业务需求

1.1.2 微服务演进的催化剂——技术演进

1.1.3 架构演进势在必行

1.2 什么是微服务

1.3 微服务蜂巢

1.4 微服务架构的设计原则

1.4.1 每个服务承担单一责任

1.4.2 微服务是自治的

1.5 微服务的特性

1.5.1 服务是一等公民

1.5.2 微服务是轻量级的

1.5.3 微服务的混合架构

1.5.4 微服务环境中的自动化

1.5.5 微服务的生态支持系统

1.5.6 微服务是动态分布式的

1.5.7 抗脆弱、快速失败和自我愈合

1.6 微服务的实例

1.6.1 一个酒店门户网站的例子

1.6.2 一个旅行社门户网站的例子

1.7 微服务架构的优势

1.7.1 支持混合架构

1.7.2 为试验和创新赋能

1.7.3 弹性伸缩和选择性扩容

1.7.4 服务可替换

1.7.5 为构建有机系统赋能

1.7.6 有助于管理技术债

1.7.7 允许不同版本并存

1.7.8 支持构建自组织系统

1.7.9 支持事件驱动架构

1.7.10 为DevOps赋能

1.8 小结

第 2 章 相关架构风格和用例

2.1 SOA

2.1.1 面向服务的集成

2.1.2 遗留系统现代化

2.1.3 面向服务的应用

2.1.4 用SOA迁移单体应用

2.2 十二要素应用

2.2.1 单一代码库

2.2.2 依赖捆绑

2.2.3 配置外部化

2.2.4 支撑服务可寻址

2.2.5 构建、发布和运行时的隔离

2.2.6 无状态、不共享进程

2.2.7 通过端口绑定暴露服务

2.2.8 以水平扩展实现高并发

2.2.9 以最小的开销实现可处置性

2.2.10 开发环境和生产环境的对等性

2.2.11 日志信息外部化

2.2.12 打包后台管理进程

2.3 无服务器计算

2.4 Lambda架构

2.5 DevOps、云计算和容器

2.5.1 DevOps是实现微服务架构的实践和流程

2.5.2 以云计算和容器作为微服务的自助式基础设施

2.6 响应式微服务

一个基于响应式微服务的订单管理系统

2.7 微服务用例

2.8 微服务先行者的共同点

单体迁移是常见用例

2.9 微服务框架

2.10 小结

第 3 章 用Spring Boot构建微服务

3.1 搭建开发环境

3.2 用Spring Boot构建RESTful微服务

3.3 Spring Boot入门

3.4 开发Spring Boot微服务

3.5 开发第一个Spring Boot微服务

测试Spring Boot微服务

3.6 启用HATEOAS的Spring Boot微服务

3.7 响应式Spring Boot微服务

3.7.1 使用Spring WebFlux实现响应式微服务

3.7.2 用Spring Boot和RabbitMQ实现响应式微服务

3.8 实现微服务安全

3.8.1 用基本安全策略保护微服务

3.8.2 用OAuth2保护微服务

3.9 为微服务交互启用跨域访问

3.10 使用Spring Boot Actuator实现微服务instrumentation

3.10.1 利用JConsole监控应用

3.10.2 利用ssh监控应用

3.10.3 添加自定义健康检查模块

3.10.4 自定义指标

3.11 微服务文档化

3.12 综合实例:开发客户注册微服务

3.13 小结

第 4 章 应用微服务概念

4.1 微服务设计指南

4.1.1 确定微服务的边界

4.1.2 设计微服务通信方式

4.1.3 微服务编排

4.1.4 每个微服务包含多少个端口——一个还是多个

4.1.5 每个虚拟机运行多少个微服务——一个还是多个

4.1.6 规则引擎——共享还是嵌入

4.1.7 BPM和工作流的作用

4.1.8 微服务可以共享数据库吗

4.1.9 微服务可以无头吗

4.1.10 确定事务边界

4.1.11 服务端口设计的考量点

4.1.12 处理共享类库

4.1.13 微服务中的UI

4.1.14 微服务中使用API网关

4.1.15 在微服务架构中使用ESB和iPaaS

4.1.16 服务版本化的考虑

4.1.17 跨域设计

4.1.18 处理共享的引用数据

4.1.19 微服务和批量操作

4.2 小结

第 5 章 微服务能力模型

5.1 微服务能力模型简介

5.2 核心能力

5.2.1 服务监听器和类库

5.2.2 存储能力

5.2.3 服务实现

5.2.4 服务端口

5.3 基础设施能力

5.3.1 云计算

5.3.2 容器运行时

5.3.3 容器编排

5.4 支撑能力

5.4.1 服务网关

5.4.2 软件定义的负载均衡

5.4.3 集中式日志管理

5.4.4 服务发现

5.4.5 安全服务

5.4.6 服务配置

5.4.7 运维监控

5.4.8 依赖管理

5.4.9 数据湖

5.4.10 可靠的消息机制

5.5 流程和治理能力

5.5.1 DevOps

5.5.2 自动化工具

5.5.3 容器注册表

5.5.4 微服务文档化

5.5.5 参考架构和类库

5.6 微服务成熟度模型

5.6.1 第0级——传统

5.6.2 第1级——初级

5.6.3 第2级——中级

5.6.4 第3级——高级

5.7 微服务采用的入口

5.8 小结

第 6 章 微服务演进案例研究

6.1 理解PSS应用

6.1.1 业务流程视图

6.1.2 功能视图

6.1.3 架构视图

6.1.4 设计视图

6.1.5 实现视图

6.1.6 部署视图

6.2 单体之死

6.2.1 痛点

6.2.2 应急修复

6.2.3 复盘

6.3 诉诸微服务——有计划地迁移

6.3.1 业务用例

6.3.2 迁移方法

6.3.3 确定微服务边界

6.3.4 分析服务依赖关系

6.3.5 微服务迁移的优先级

6.3.6 迁移过程中的数据同步

6.3.7 管理引用数据

6.3.8 UI和Web应用

6.3.9 测试策略

6.3.10 构建生态系统能力

6.3.11 只迁移必要的模块

6.3.12 微服务的内部层次结构

6.3.13 微服务编排

6.3.14 与其他系统的集成

6.3.15 迁移共享类库

6.3.16 处理异常

6.4 目标实现

6.4.1 项目实现

6.4.2 项目运行和测试

6.5 后续工作

6.6 小结

第 7 章 用Spring Cloud组件扩展微服务

7.1 什么是Spring Cloud

7.2 Spring Cloud的版本

7.3 搭建BrownField航空公司PSS系统的项目环境

7.4 Spring Cloud Config

7.4.1 用配置服务器构建微服务

7.4.2 搭建配置服务器

7.4.3 理解配置服务器URL

7.4.4 处理配置变更

7.4.5 用Spring Cloud总线推送配置变更

7.4.6 搭建配置服务器的高可用集群

7.4.7 监控配置服务器的健康状态

7.4.8 用配置服务器管理配置文件

7.4.9 完成修改以使用配置服务器

7.5 将Eureka用于服务注册和发现

7.5.1 理解动态服务注册和发现

7.5.2 理解Eureka

7.5.3 搭建Eureka服务器

7.5.4 Eureka的高可用性

7.6 用Zuul代理作为API网关

7.6.1 搭建Zuul

7.6.2 Zuul的高可用性

7.7 响应式微服务流

7.8 用Spring Cloud Security保护微服务

7.9 总结BrownField航空公司的PSS应用架构

7.10 小结

第 8 章 微服务的日志管理和监控

8.1 日志管理的挑战

8.2 集中式日志管理方案

8.3 日志管理方案的选取

8.3.1 云服务

8.3.2 现成的方案

8.3.3 集成一流的组件

8.3.4 自定义日志管理方案的实现

8.3.5 用Spring Cloud Sleuth实现分布式追踪

8.4 监控微服务

8.4.1 微服务监控的挑战

8.4.2 监控工具

8.4.3 监控微服务依赖

8.4.4 用Spring Cloud Hystrix实现微服务容错

8.4.5 用Turbine聚合Hystrix流

8.5 使用数据湖做数据分析

8.6 小结

第 9 章 用Docker容器化微服务

9.1 BrownField公司PSS微服务的不足之处

9.2 什么是容器

9.3 虚拟机和容器的区别

9.4 容器的优势

9.5 微服务和容器

9.6 Docker简介

Docker的关键组件

9.7 将微服务部署到Docker中

9.8 在Docker上运行RabbitMQ

9.9 使用Docker注册表

9.9.1 设置Docker Hub

9.9.2 将微服务发布到Docker Hub

9.10 微服务上云

在AWS EC2上安装Docker

9.11 在EC2上运行BrownFiled公司的微服务

9.12 容器化的未来

9.13 小结

第 10 章 用Mesos和Marathon扩展容器化的微服务

10.1 微服务扩容

10.1.1 理解自动扩容

10.1.2 缺失的部分

10.2 容器编排

10.2.1 为什么容器编排很重要

10.2.2 容器编排是什么

10.2.3 容器编排和微服务的关系

10.2.4 容器编排和虚拟化的关系

10.2.5 容器编排方案

10.3 用Mesos和Marathon实现容器编排

深入Mesos

10.4 用DCOS实现Mesos和Marathon

10.5 为BrownField公司的微服务实现Mesos和Marathon

10.5.1 安装Mesos、Marathon及相关组件

10.5.2 运行Mesos和Marathon

10.6 准备部署BrownField公司的PSS微服务

部署BrownField公司的PSS服务

10.7 小结

第 11 章 微服务开发生命周期

11.1 微服务开发的实践要点

11.1.1 理解业务动机和价值

11.1.2 从项目开发到产品开发的观念转变

11.1.3 选择正确的开发理念

11.1.4 使用最小可行产品的概念

11.1.5 克服遗留热点

11.1.6 建立自组织的团队

11.1.7 构建自服务云

11.1.8 构建一套微服务生态系统

11.1.9 以DevOps实践贯穿微服务开发的生命周期

11.1.10 价值驱动计划

11.1.11 持续监控和反馈

11.2 自动化开发周期

11.2.1 开发

11.2.2 集成

11.2.3 测试

11.2.4 部署

11.2.5 监控和反馈

11.2.6 配置管理

11.2.7 微服务开发治理、参考架构和类库

11.3 小结版权声明

Copyright © 2017 Packt Publishing. First published in the English language under the title Spring 5.0 Microservices, Second Edition.

Simplified Chinese-language edition copyright © 2020 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Packt Publishing授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。

前言

微服务是一种架构风格和模式:将复杂系统拆解为协同工作的小型服务,以此构建大型业务服务。微服务是自治、自包含且可独立部署的服务。当今世界上的许多企业将微服务作为默认的架构标准来构建面向服务的大型企业级应用。

作为一种编程框架,Spring框架在开发者社区流行很多年了。使用Spring Boot不再需要重量级应用容器,并且它还支持部署轻量级无服务器应用。Spring Cloud结合了Netflix的许多OSS开源组件,提供了一个运行和管理大型微服务架构的生态系统;还支持负载均衡、服务注册、服务监控和服务网关,等等。

然而,微服务也带来了一些挑战,例如服务的监控、管理、分发、扩容和发现等,尤其是当大规模部署微服务时。如果在采用微服务架构之前不解决这些常见的问题,通常会导致灾难性的后果。本书旨在构建一个与技术细节无关的微服务能力模型,该模型有助于应对各种常见的微服务挑战。

本书提供了实现大型响应式微服务的实用方法和指导原则,并通过示例全面讲解如何构建微服务。本书深入介绍了Spring Boot、Spring Cloud、Docker、Mesos和Marathon,还会教授如何用Spring Boot部署自治服务,而无须使用重量级应用服务器,并介绍Spring Cloud框架的各项能力、如何使用Docker实现容器化,以及如何使用Mesos和Marathon抽象出计算资源和控制整个集群。

本书各章的内容都很实用,细致讲授了如何将微服务技术与业务相结合。通过一系列示例(包括一个旅游业的案例研究),书中阐述了微服务架构的实现,涉及Spring框架、Spring Boot和Spring Cloud。这些都是用于开发和部署大规模可扩展微服务的强大且久经考验的工具。本书基于Spring框架的最新规范编写。借助本书,你可以快速构建互联网级现代Java应用。本书内容

第1章,微服务揭秘,介绍了微服务的背景、评估和基本概念。

第2章,相关架构风格和用例,讨论了微服务与面向服务架构的关系、云原生的概念和十二要素应用,还展示了一些常见的微服务用例。

第3章,用Spring Boot构建微服务,介绍如何使用Spring框架构建REST和基于消息机制的微服务、如何用Spring Boot打包微服务,以及Spring Boot的一些核心能力。

第4章,应用微服务概念,介绍了实现微服务架构的一些实际问题,详细描述了开发人员在企业级微服务开发中会面临的一些挑战。

第5章,微服务能力模型,介绍了管理微服务生态系统所需的能力模型和成熟度评估模型,在企业层面采用微服务时后者非常有用。

第6章,微服务演进案例研究,以BrownField航空公司为例讲解微服务演进,以及如何应用前面讲过的微服务的概念。

第7章,用Spring Cloud组件扩展微服务,介绍了如何利用Spring Cloud技术栈的能力扩展之前的微服务实例,详细解析了Spring Cloud架构及其各个组件,以及如何集成这些组件。

第8章,微服务的日志管理和监控,讨论了日志管理和监控在微服务开发中的重要性,详细阐述了采用微服务架构的一些最佳实践,比如利用开源工具实现集中式的日志管理和监控,以及如何将这些工具和Spring项目集成。

第9章,用Docker容器化微服务,解释了微服务上下文中的容器化概念。作为下一步更深层次的实现,这一章演示了如何用Mesos和Marathon替换定制的生命周期管理器,实现大规模部署。

第10章,用Mesos和Marathon扩展容器化的微服务,介绍了微服务的自动配置和部署,以及如何在上一个例子中使用Docker容器实现大规模部署。

第11章,微服务开发生命周期,介绍了微服务开发的流程和实践方法,以及DevOps和持续交付管道(pipeline)的重要性。本书要求

第3章介绍了Spring Boot,需要使用下列软件测试代码。● JDK 1.8● Spring Tool Suite 3.8.2● Maven 3.3.1● Spring Framework 5.0.0.RC1● Spring Boot 2.0.0. SNAPSHOT● spring-boot-cli-2.0.0.SNAPSHOT-bin.zip● Rabbit MQ 3.5.6● FakeSMTP 2.0

第7章介绍了Spring Cloud项目。除了前面提到的软件,还需要以下软件。● Spring Cloud Dalston RELEASE

第8章介绍如何通过微服务实现集中式的日志管理,会用到下列软件。● elasticsearch-1.5.2● kibana-4.0.2-darwin-x64● logstash-2.1.2

第9章介绍如何使用Docker部署微服务,会用到下列软件。● Docker version (17.03.1-ce)● Docker Hub

第10章使用Mesos和Marathon将Docker化的微服务部署到自动扩容的云环境中,会用到下列软件。● Mesos version 1.2.0● Docker version 17.03.1-ce● Marathon version 3.4.9读者对象

本书适合想了解如何使用Spring框架、Spring Boot和Spring Cloud设计强大的互联网级微服务,以及如何用Docker、Mesos和Marathon来管理这些微服务的架构师。微服务能力模型有助于架构师运用各种工具和技术(不限于本书所述的)来设计微服务解决方案。

本书适合正在考虑开发云就绪的互联网级应用来满足当今业务需求的Spring开发人员。书中通过研究一系列真实用例和实操性的代码实例,揭示了微服务的实质及其在当今世界中的重要性。本书将指导开发人员构建简单的RESTful服务,并将其有条不紊地改造成真正的企业级微服务生态系统。排版约定

本书以不同的文本格式来区别不同类型的信息,示例及对应的含义如下所示。

正文中的代码采用以下样式。“RestTemplate是一个抽象HTTP客户端底层细节的实用工具类。”

代码块的样式如下所示。@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

为了强调代码片段中的特定部分,相关代码行或文字会加粗显示。@Componentclass Receiver { @RabbitListener(queues = "TestQ") public void processMessage(String content) { System.out.println(content); }}

命令行输入或输出如下所示。$java -jar target/bootrest-0.0.1-SNAPSHOT.jar

新术语或重要的词语用黑体表示。 此图标表示警告或需要特别注意的内容。 此图标表示提示或技巧。读者反馈

欢迎读者反馈。请告诉我们你对本书的看法——喜欢哪些内容、不喜欢哪些内容。读者反馈对我们很重要,它有助于我们编写出对读者真正有价值的图书。

对于本书的一般反馈,请发送邮件至feedback@packtpub.com并在主题处注明书名。

如果你掌握某个领域的专业知识,并且有兴趣写作图书,请访问authors.packtpub.com。用户支持

感谢选择Packt图书,我们会尽全力帮你充分利用你手中的书。下载示例代码

如果你是从http://www.packtpub.com网站购买的图书,登录自己的账号后就可以下载所有已购图书的示例代码。如果你是从其他地方购买的图书,请访问http://www.packtpub.com/support网站并注册,我们会将代码文件直接发送到你的电子邮箱。

你可以通过以下步骤下载代码文件。

(1) 通过电子邮件地址和密码,在我们的网站上登录或注册。

(2) 把鼠标指针移动到顶部的SUPPORT标签页上。

(3) 点击Code Downloads & Errata。

(4) 在Search框中输入书名。

(5) 选择要下载代码文件的图书。

(6) 从下拉列表中选择购书渠道。

(7) 点击Code Download。

文件下载后,使用以下工具的最新版本来解压缩或提取文件夹。● WinRAR / 7-Zip(Windows)● Zipeg / iZip / UnRarX(Mac)● 7-Zip / PeaZip(Linux)

本书代码也托管在GitHub上,访问https://github.com/PacktPublishing/Spring-5.0-Microservices-Second-Edition即可获取1。Packt拥有丰富的图书和视频资源,相关代码见GitHub仓库:https://github.com/PacktPublishing/。欢迎查阅!

1你可以直接访问本书中文版页面,下载本书项目的源代码:http://www.ituring.com.cn/book/2442。——编者注疑问

如果你对本书内容有任何疑问,请通过电子邮件questions@packtpub.com联系我们,我们会尽全力解决。勘误

虽然我们尽力确保本书内容准确,但出错仍在所难免。如果你在书中发现错误,不管是文本还是代码,希望能告知我们,我们不胜感激。2这样可以使其他读者免受挫败,并能帮助我们改进本书的后续版本。如果你发现任何错误,请访问http://www.packtpub.com/submit-errata提交,选择书名,点击Errata Submission Form链接,并输入详细说明。勘误一经核实,你的提交将被接受,此勘误将上传到本公司网站或添加到现有勘误表。

2本书中文版的勘误请到http://ituring.cn/book/2442查看和提交。——编者注

如需查看已提交的勘误,可访问https://www.packtpub.com/books/content/support,在搜索框中输入书名进行搜索。勘误信息会显示在Errata区域中。侵权行为

互联网上的盗版行为是所有媒体都必须面对的问题。Packt非常重视保护版权和许可。如果你发现我们的作品在互联网上被以任何形式非法复制,请立即为我们提供地址或网站名称,以便我们寻求补救。

请把可疑盗版材料的链接发到copyright@packtpub.com。

非常感谢你帮助我们维护作者,以及我们给你带来有价值内容的能力。电子书

扫描如下二维码,即可购买本书电子版。第 1 章 微服务揭秘

微服务是一种架构风格,也是一种针对现代业务需求的软件开发方法。微服务并非发明出来的,确切地说是从之前的架构风格演进而来的。

本章将详细介绍从传统的单体架构到微服务架构的演进过程,还会介绍微服务的定义、概念和特性。

本章主要内容如下。● 微服务的演进。● 微服务架构的定义及相关示例。● 微服务架构的概念和特性。1.1 微服务的演进

继面向服务的架构(SOA)之后,微服务与DevOps以及云计算相辅相成,成为越来越流行的架构模式。微服务的演进很大程度上受到了当今商业环境中颠覆性数字创新的趋势和近几年技术演进的影响。下面详细介绍微服务的两个催化剂——业务需求和技术演进。1.1.1 微服务演进的催化剂——业务需求

在当前的数字化转型时代,企业越来越多地将技术作为快速提升营收和客户基数的关键赋能手段。企业主要使用社交媒体、移动应用、云计算、大数据和物联网来实现颠覆性创新。企业运用这些技术寻找快速渗透市场的新方式,这给传统的信息技术交付机制带来了巨大的挑战。

图1-1比较了传统的单体应用和微服务应用在敏捷性、交付速度和扩展能力等当前企业面临的各项新挑战方面的表现。

图 1-1 相比于传统的单体应用,微服务的敏捷性更高、交

付速度更快、扩展能力更强。

企业花数年时间进行大规模应用开发的时代已经过去了。几年前,企业为了管理端到端的业务功能开发出了各种统一的应用,但是现在已经无人问津了。

图1-2展现了传统的单体应用和微服务应用在交付时间和成本上的差距。

图 1-2 微服务支持快速开发敏捷应用,因而能降低总成

本。

例如,当今航空公司不会投入资源将其核心主机订票系统重建为单体“巨兽”,金融机构不会重建其核心银行业务系统,零售商和其他行业也不会重建重量级的供应链管理系统,比如传统的ERP系统。各行业的焦点已经从构建大型应用转移到了以尽可能敏捷的方式构建能适应特定业务需求并快速取胜的各类单点解决方案。

以一个运行遗留单体应用的网络零售商为例。假设该零售商想基于顾客的购物偏好和其他信息向他们提供个性化的商品,进而革新既有销售方式;或者想基于顾客的购物喜好来推荐商品,从而引导顾客购买。

在这样的情况下,企业想快速开发一种个性化引擎或基于当前需求的推荐引擎,并将其插入遗留应用中,如图1-3所示。

图 1-3

如图1-3所示,投入大量资源来重建核心遗留系统是不明智的。要满足这种需求,要么如图1-3a所示,将遗留系统的响应依次传入两个新的功能模块做进一步处理;要么如图1-3b所示,修改核心遗留系统,让遗留代码调用这两个新的功能模块,从而完成整个处理。这两个新的功能模块通常以微服务的方式实现。

该实现方式给了软件开发团队许多试错机会。他们可以反复试验,以更低的成本快速尝试新的功能模块。之后,业务部门可以验证关键性能指标的变化或按需替换这些功能模块。 现代系统架构应当以最小的成本,最大化随时替换

系统组件的能力。微服务正是达到该目标的有效方式。1.1.2 微服务演进的催化剂——技术演进

新兴技术促使人们重新思考构建软件系统的方式。比如几十年前,难以想象不通过两阶段提交协议来开发分布式应用。后来,NoSQL数据库彻底改变了这种思维方式。

与之类似,技术范式的转变已经重塑了软件架构的各个层面。

HTML5和CSS3的出现以及移动应用的发展,重新定义了UI。由于在响应式和自适应设计方面的突出表现,Angular、Ember、React、Backbone等客户端JavaScript框架流行开来。

随着云计算成为主流,Pivotal CF、AWS、Sales Force、IBM Bluemix、Redhat OpenShift等平台即服务(PaaS)厂商促使我们重新思考构建中间件组件的方式。Docker引发的容器化革命极大地影响了基础设施领域。Mesosphere DCOS等容器编排工具大大简化了基础设施管理。无服务器计算使得应用管理更加便捷。

随着Dell Boomi、Informatica、MuleSoft等集成平台即服务(iPaaS)的出现,系统集成领域的格局也发生了剧变。这些集成工具推动了软件开发团队将系统集成的边界扩展到传统企业应用之外。

NoSQL和NewSQL彻底革新了数据库领域。几年前,仅有的几种流行的数据库都是基于关系数据建模原理的。如今,数据库工具种类众多,例如Hadoop、Cassandra、CouchDB、Neo 4j和NuoDB等,都是针对特定的系统架构问题而设计的。1.1.3 架构演进势在必行

应用架构一直都是随着苛刻的业务需求和技术演进而演进的。

不同的架构方法和风格,比如大型主机架构、客户机-服务器架构、N层架构和面向服务架构,都曾流行过。不管选用哪种架构风格,人们往往习惯于构建不同形式的单体架构系统。微服务架构是随着当今业务对敏捷性与交付速度等方面的需求、新兴技术的出现以及对前几代系统架构的学习而演进出来的。

如图1-4所示,微服务有助于打破单体应用的边界,构建由一系列逻辑上独立的小系统组成的系统。

图 1-4 如果把单体应用看作由一个物理边界包围的一套逻

辑子系统,那么微服务应用就是不存在物理边界的一套独立

的子系统。1.2 什么是微服务

微服务是一种架构风格。作为游戏规则改变者,它已被当今众多软件开发团队用于实现高度敏捷、快速交付和轻松扩展。微服务支持开发物理上隔离的模块化应用。

微服务并不是发明出来的。许多软件开发组织,比如Netflix、亚马逊和eBay,已经成功运用分而治之的技巧,在功能上将其单体应用分割为更小的原子单位,每个原子单位只实现单一的功能。这些公司解决了他们的单体应用所面临的一系列常见问题。随着这些企业的成功,其他许多企业也开始采用这种方式重构单体应用。之后,这种模式被命名为“微服务架构”。

微服务源自Alistair Cockburn在2005年提出的“六边形架构”思想。六边形架构也称“六边形模式”或“端口和适配器模式”。

简单说来,六边形架构提倡封装业务功能以与外界隔离。这些封装起来的业务功能无须感知周围的环境,甚至无须感知输入设备或输入渠道以及这些设备使用的消息格式。这些业务功能边缘的端口和适配器负责将从不同输入设备和渠道传来的消息转换为这些业务功能可以理解的格式。当要引入新设备时,开发人员就可以加入端口和适配器来支持这些设备,而无须修改核心的业务功能。开发人员可以用任意多的端口和适配器来实现需求。与此类似,外部实体也无须感知这些端口和适配器背后实现的业务功能,它们永远只需要和这些端口和适配器打交道。如此一来,开发人员就可以灵活地改变输入渠道和业务功能,而无须过多担心接口设计是否适用于未来的业务需求。

图1-5是六边形架构的概念图。

图 1-5

图1-5中,应用被彻底隔离并通过一套前端适配器和一套后端适配器与外界交互。前端适配器通常用于集成UI和其他API,后端适配器用于连接不同的数据源。前后端的端口和适配器负责将传入和传出的消息转换为外部实体能理解的格式。微服务架构的设计灵感正是源于六边形架构。

微服务没有标准的定义。Martin Fowler给出了如下定义。“微服务架构风格是一种将单个应用开发为一套微小服

务的方法。每个这样的微小服务在各自独立的进程内运行,

采用轻量级的机制(通常是HTTP资源API)与外界通信。这

些微小服务通常围绕业务能力进行构建,并且可以用完全自

动化的部署工具独立部署。微服务架构最起码要实现集中式

服务管理,服务本身可能是用不同的编程语言和不同的数据

存储技术实现的。”

本书给出的微服务定义如下。 微服务是一种架构风格或方法,用于构建由一套自

包含、松耦合且自治的业务功能模块组成的信息技术系统。

图1-6展示的是一个传统的N层应用架构,包含了展现层、业务逻辑层和数据库层。模块A、模块B和模块C代表3个业务功能,图中的分层代表不同架构关注点间的隔离。每一层都包含了与该层有关的这3个业务功能。展现层包含了这3个模块的Web组件,业务逻辑层包含了这3个模块的业务逻辑组件,而数据库包含了这3个模块的所有数据表。在大多数情况下,不同层在物理上是隔离的,而同一层的不同模块是硬编码的。

图 1-6

基于微服务的架构如图1-7所示。

图 1-7

如图1-7所示,微服务架构中的边界被反转了。每个垂直的条状结构代表了一个微服务。每个微服务都有自己的展现层、业务层和数据库层。微服务是和业务功能相对应或一致的,这样一个微服务的变更不会影响其他微服务。

微服务间不存在标准的通信或传输机制。通常微服务之间的通信使用广泛采用的轻量级协议,比如HTTP和REST,或基于消息机制的协议,比如JMS或AMQP。在某些情况下,人们可能会选用优化的通信协议,比如Thrift、ZeroMQ、Protocol Buffers或Avro。

由于微服务与业务功能更为一致,并且其生命周期可独立管控,因此是企业开启DevOps和云计算之旅的理想选择。实际上,DevOps和云计算是微服务的两个重要方面。 DevOps是一种重组IT资源的方式,可以缩小传统

IT开发和高效运维之间的鸿沟。1.3 微服务蜂巢

可以用蜂巢来比喻演进式微服务架构(见图1-8)。

图 1-8

在现实世界中,蜜蜂将这些六边形的蜡质巢室排列起来构造出蜂巢。蜜蜂使用不同的材料构造这些蜡质巢室。刚开始的时候蜂巢很小,整个蜂巢的构筑是由建造时可用的材料决定的。重复性的巢室形成了一种模式和强有力的织物结构。蜂巢中的每个巢室都是独立的,同时也和其他巢室集成在一起。通过增加新的巢室,蜂巢可以有序地“长”成一个巨大、结实的结构。封口后巢室内部的物质对外不可见。一个巢室的损坏并不会影响其他巢室,并且蜜蜂可以重建损坏的巢室而不会影响整个蜂巢。1.4 微服务架构的设计原则

下面深入探讨微服务架构设计的一些原则。这些原则是设计和开发微服务系统时必须遵循的。其中最重要的两个原则是单一责任原则和自治原则。1.4.1 每个服务承担单一责任

单一责任原则是SOLID设计模式中定义的一项重要原则。该原则要求每个单元应且只应承担一项责任。

单一责任原则要求一个单元,比如一个类、一个函数或者一项服务,只承担一项责任。在任何情况下,两个单元不能承担相同的责任,一个单元也不能承担多项责任。一个单元承担多项责任意味着紧耦合。

如图1-9所示,在一个电商应用中,客户、产品和订单是不同的功能模块。与将这些功能模块都构建到一个应用中相比,更好的做法是构建3个服务,每个服务仅负责实现一个业务功能。这样其中一个责任或功能模块的变化不会影响其他责任或功能模块。在该场景中,客户、产品和订单相当于3个相互独立的微服务。

图 1-91.4.2 微服务是自治的

微服务是自包含且可独立部署的自治服务,负责业务功能及其执行。微服务会捆绑所有依赖,包括第三方库依赖、执行环境依赖(比如Web服务器和容器)和抽象了物理资源的虚拟机依赖。

微服务和SOA的一个主要区别是服务的自治程度。虽然大多数SOA实现提供了服务级别的抽象,但微服务进一步抽象了实现和运行环境。

在传统的应用部署中,首先会构建一个war包或者ear包,然后将其部署到JEE应用服务上,比如JBoss、Weblogic、WebSphere等。当然,也可以将多个应用部署到同一个JEE容器中。而微服务的部署方式是将每个微服务构建为一个包含所有依赖的胖jar文件,然后在一个独立的Java进程中运行。

如图1-10所示,微服务也可以在自己的容器中运行。容器是跨平台且可独立管理的轻量级运行环境。容器技术(比如Docker)是部署微服务的理想选择。

图 1-101.5 微服务的特性

前面给出的微服务定义比较简单。布道师和实践者对微服务的看法不尽相同。目前还没有一个具体的且广泛接受的微服务定义,然而所有成功实现的微服务具有一系列共同特性。因此,比固守微服务的理论定义更为重要的是理解微服务的这些共同特性,下面详述。1.5.1 服务是一等公民

在微服务领域,服务是一等公民。微服务抽象了所有实现细节,对外通过API暴露服务端点。微服务内部的实现逻辑、技术架构(比如编程语言、数据库、QoS机制等)完全隐藏在服务API之后。

而且,在微服务架构中不再开发应用了,软件开发团队将聚焦于开发服务。大多数企业需要在应用构建方式和企业文化上做出重大转变。

在客户信息微服务中,内部细节(比如数据结构、技术实现和业务逻辑等)都是隐藏的。这些细节对任何外部实体都是不可见或不暴露的。对该服务的访问会通过服务端点或API来进行限制。例如客户信息微服务可能会暴露客户注册和获取客户信息这两个API供外界访问和交互。

微服务架构中服务的特性

由于微服务或多或少像SOA,因此SOA中的许多服务特性对微服务同样适用。

下列服务特性对微服务同样适用。● 服务合约:与SOA类似,微服务也是通过明确定义的服务合约来

描述的。在微服务领域,JSON和REST广泛用于服务之间的通

信。就JSON/REST而言,有很多技术可用于定义服务合约,比

如JSON Schema、WADL、Swagger和RAML等。● 松耦合:微服务是各自独立且松耦合的。在大多数情况下,微服

务可以接收一个事件作为输入,然后触发另外一个事件作为响

应。通常用消息机制、HTTP和REST实现微服务之间的交互。基

于消息机制的服务端点可以实现更高层次的解耦。● 服务抽象:在微服务架构中,服务抽象不仅要抽象服务的具体实

现,更要彻底抽象之前讲过的所有库和环境的细节。● 服务复用:微服务是粗粒度、可复用的服务,可以被移动设备、

桌面应用、其他微服务甚至其他系统访问。● 无状态化:设计良好的微服务应当是无状态或不共享状态的。这

些服务不需要维护共享的状态或会话状态。在确实需要维护状态

时,这些状态通常在数据库或内存中进行维护。● 服务可发现性:微服务是可发现的。在典型的微服务环境中,服

务会自我广播以便于外界发现。当服务终结后,它们会从微服务

体系中自动消失。● 服务互操作性:由于微服务使用标准的协议和消息交换格式,因

此它们之间是可互操作的。微服务通常使用消息和HTTP等传输

机制。在微服务领域,REST/JSON是开发可互操作服务的最流

行的方式。如果需要进一步优化通信方式,会用到其他协议,比

如Protocol Buffers、Thrift、Avro或Zero MQ等。使用这些协议可

能会限制服务之间的整体互操作性。● 服务可组合性:微服务是可组合的,可以通过服务编排或服务编

制来实现。1.5.2 微服务是轻量级的

设计良好的微服务对应单一的业务功能,只实现一个功能,所以大多数微服务实现的一个共同特性是服务运行所需的资源较少。

选择微服务的支撑技术(比如Web容器)时,必须确保这些技术本身也是轻量级的,以确保微服务整体的资源开销是可控的。例如相对于更为复杂的传统应用服务器,比如Weblogic或WebSphere,选择Jetty或Tomcat作为微服务的应用容器更好。

与hypervisor技术(比如VMware或Hyper-V)相比,容器技术(比如Docker)也有助于将基础设施的资源开销控制到最小。

如图1-11所示,微服务通常是部署到Docker容器中的,容器可以封装业务逻辑和运行时需要的库。这样做有助于快速将整套配置复制到新的机器上,或者完全不同的宿主环境中,甚至可以在不同的云供应商之间切换。由于不依赖物理的基础设施,容器化的微服务更容易实现跨平台。

图 1-111.5.3 微服务的混合架构

微服务是自治的,它将所有细节都抽象出来并隐藏到服务API之后,便于为不同的微服务设计不同的技术架构。微服务的实现过程包含如下共性。● 不同的服务可采用同一项技术的不同版本。一个微服务可能是在

Java 1.7上开发的,而另一个微服务可能是在Java 1.8上开发

的。● 不同的服务可采用不同的语言开发,比如一个微服务用Java开

发,另一个微服务用Scala开发。● 可采用不同的存储架构,比如一个微服务用Redis缓存来存取数

据,而另一个微服务可能使用MySQL作为持久化数据存储。

图1-12展示了混合语言的开发场景。((更而构但逻过要以1天优目的互流大但个于其1进系它送轻1服级定物索新该应件的版务订外11项为定会预1的5加节生的聚要版D有1平架航1后说个议群其的如1说构应编能大选1很同或开应服票在微的的管的比数的发由运息实1选并1布戏了的的户通该种1构单的动出应能低不能唯因种务的的个1性微类行载的建化影务的一统D有交1的司用入捷器化前术对和1到1务理服这服就旦或一要从1务展任些应微E来预的替体体供输如没多上数显是1关如发体和同程D需和示对出息用通是而调管如沦项服0H......l...如.......eee...a7577757567657777订搜服者应据多H一方他据用理些应阶通此用微架高命入部是很服定整是择本在流会出常自程理2。种均键数进式迁班成理系应企实,到依技局构低单可并其现开图加务对技体安,。系合系系团很辑共,求。过体务可。厘价的团。言中,是I有确服在。5这求同不服响新订务会过于于用换服方领架排需。既理和一企服各行高不,后个运的技微们发A目务来。现4松和为日性化不后服择到了技系异的功的势。。务变。的互体到位微同出图最何。用本层行0●●●●●●●●●●●●●●●●●●768型vvvNDs项00................个图发(TOOO t1274657983156421  P 图图由的复如步用一能如部如因享在如图每链由旅测保图相如当。简。赋如,和码图本自在而考另在然在等该比整自该便业故向S务其服之图由如。降预的。术后微之实或首是更很队和微预周解整户在为架图构就可行。,重直这的一彼并业术资寻的务传。和版域有下错很S式类行关乘从P不务同由不本U图当而这图数服去图统O用情服服在统下如当服即在图全从图能自加图许务其以A务单这据1本开在在业方与Y术加服图对遗开相模移有置在。通Z在技例快,统图构一他最成该端时图由现图量微这身直例在、求边用图迁和另F队在微图统在实和查念现化比但这发和如每客大这每图达术发务构服由管的等策图应。服微段发图微队可价技由P索同微务的载嵌信假服终也1是抗赖式服航X有分图一现清体自假约的级信酒如基图简统除然码个补如时服务在,并发假如支行利性到预0微行署模用的iT数cppp    --   0        专 U倍S搜 送 CpO比Cn1I企Us1P轴1轴轴sss页可的微术图图1服可一杂付充提,空集单务微 决其本束业户。布1服服服后本后。是图开的微息务如逻后数于,,应务于一列和。图趣等 N间常些 身订现图发此 。Y起用响 微果多的服端理多速,。。我如较术接密于 这微的己微这另一1留体更于最低务成 图数键似控J对接容预。抗务架1内虑单另也债务店次 询使签服中事的理。选一微的概质情建O先多 因,入系服是况法者后理、开中看整 个通响拓生市需到能了,是1于销以章的方需。期图他 一机一实务。服 于服多常块出单运个来种订技其工设功事多中图行逻会其务个章些个网, 中新站关障。。个现 行 ,体此脆。界本面金服两非如一,。传客务 图布 务图到。统其失如此微微载构构客体图忠拥。库务 设代用 中程扩础的个之务M试假服设配到订服服地环板门用3 rt-)TeIIA79微微的T,i小据已i定e-----2D属。S索0轴f一e为支微微如支n服有微请抗为弹允一支U业a然31队12扩快y1扩r所所扩面来。1在微1。统1个务业企有并不想对因的微想应行他1倡使到实微失微发常站要数1的实果据况微户这外个部自他服一R1,的1此元整11会旅航1后1况1逻服1应,服1据者务系1种他1个迁邮提后的的务法间件这独。1通。服许。个必订务这愈以些后知。有1系于并甚辑1的微,核而,比实投量个11有例导户心一场入务1架,是败和变、态本式新社将当。问架务于务的微服种n分了添务企架需P这架1个服1点对出。方要术个微加微而微地弱会系自个另的服挑脆1辑选1微制扑务。U从用践的系每日为功模在务,微,这1具种章部旅例加到推只服代在诸在统诚微都介服U式微另务页易1优会服单子解这都的通1问后一应和以阶,1金他的3数务中送间构大发答在图以应微微日户展务境量设阶展分从了Dt中agS务S为r65016T需这义f-------被-----k------------------图优所Uc事库扩IE求ICg必l、需而1脆2助21列持2服21个性2试展32个11212服1构12许速持121122持12222务服展展服S示服展示展展2S中结iQ页页会展现从构行原行心至系A空中进场也的务行服务,来服服势数因,基图释个系弱这是公务有(统架微是很表这的,服的P自移单状的包度一,旅多际某需库交共些服必载用产绍隔过荐。题而化,了务个是务后多案在布仍一中战过企数统服个服传的个入情预上于产设而要服系须件打迅第i一显迁把是一来服式择是已外服也对可情发例有载过请里服构可种第检务库且务署发辑应次业内会功业,个立务动一实支统这一能析见来机服合服当良题。体是后使。之组可自微客构架服预是例服用这种些致版更以加下的对企替的务中后务如数用将丝面务微自型总型J是大和用构化目例动服段分端A型定败一环1。案h服,保x的用段现内服钟的服W网门施。n iST184745417762298638533398502067h架要些l的DSa广1不-务UP示的,作惠展L/至e须sJ这要(,发所所队所示所所中示所所的。,示所,。所T面1eB所面从,局务户好向了一务种混D统求架能在信相不通如服的过构较示务务,传。自司中个部端对后酒个,方品事而户。例应架务况实动新,的业三以务要以可中,,个补业要子去构弱会系了优件务况独景从应中客航化计指特于也非的为自一务构个行社、上,一就购组高1就性能一升订通动种新是一信来。将据请样出条务核选程三行以统而数开用统实。时持微实,数f务据可继况展应的示查目务想务务据门务务也H需而大务。务在是该自务验环图质速的地分该了制个。为旅激设社个可须领布构建服伸于。服。公每静同相需体如助则动换了本用微不两订统由价服日括应规设用发(e务不,雀己数用子一vA企务,化等-线将当工管护个境包容配实、:务户P启站于将层比务和a关ITe务务在2需7服f 抗-加调ab构。)和测为S应微泛TPeT花而i考种管2之通布或A示示虚了通列了通示示示了队示示,示示航3会会v包消模和、扩数可套,规预间班心中,详期点实何似微务构将服身服实功司良1设性服航概采,动下要支常。够应一服前审同现特。常将同或级程果现定内户中不软通示社微能构立务服个建和之种在化化客续的实,存应常小使件快这为当将酒小典同些并用在。演独从析是简,技息用微买可这方量访应定消境l另的法雅将域发理自面增价下统。输息其把金。用工这是系中也的时个态资、因消,。用据化采所。同据。是由次现可求务于对态架,践在方例构来救求单实换户新航应都和不作。架是这计用3库了 发是的据f务起计E行支是本N模明封功种同(业详扩但志用使控服同管和的部环传是到可建缩件大、有替店行合架每现括假,v动-T暴使i是J管,T备网例haI系87文求m务和给Os载用-项在交数2O试r用是脆费e服a采r虑方的P1过、前i架s过,一一,,,一,,上搜中,过。P,线列控,班从从间,问l进价能同的时审可店,协预打服计而体。些触融应并会逻接和件一统立用没构企自一现一用型订用持丝务构息据后复的的地思传微应服预总实用替好成心征个构术务该同于构(回今里单和源数比微中的具块空每,而的让有服硬因多大用该我是以服时微模息行的之为务,储能办a费页服集非的现可,用的逻还念此以(查。展由的临始现触需击速E的单等建测解部模多引简中提务架细务之一端代中实解导的否会检价过。含现实班事外更区,规起能页特计服用自微这望比大中户,企在身n积库层示程架R行细能装展内E微a布在管付良一确,用量在整在能务1a可生输署i应t构v个方日服可t理机驱社站生和也门自用快用版将架换创露型理动境3化。ppa出监端Ru出ff来g 业vJ互于该据策自nS a大务l如式eE用D对是个水个自索发在核之个有,表拆f虽该编中可客微s运支每逻构i多订的的,定间找户个预中简同例公服客终信他家。化了U可,查技面订的应报微且层存暴简忠通功辑编服这建Q框的包航而较后预务,系良,的来例常换现1服于请务辑业从试型务务法个加时包服应验其者后治而这的,,一用中取个合统体给的据迁,从的面M松纳事业需、我订成不好模构为多资有言服体出最任维段查,弱,件杂功审耦体发异开,的进开议语入门的启队了要也维交服和所服洁群企雀格自建在开个单严务务天服别为不n发愈管则可现以客微架治编微即、面预可sp客部支的中B、了i个s立卡存这构分好中为a理信个是不计E许服是x实数版器产中用,可以务g门构式s)服实来能自使了数系能客通BS上工速构新本态选态系动点门中了户组听技加 2e来p 。赋务试场i存I动时单 略o量何TAS并语, 数T通平基然了网心典假示以l送动简后写使的功分页行服户付、合也用失网航移中基,客时源开用单错变,微理架微)是的自求步列的页应中且、术计。订(,事在户耦或可务证重司之微服方些客数理新的普单务一推言发能到求个友最务单的。发为入而扩体师它小对以服用和务可在是会统诚储辑需这含之看地可远在务集组能些码软(少在建1服护动本次新务以做传愈行单调的务支销户每做微务无们需单方服象最好是运复,而个事推胜模这息最意构业难微一发版采介服不估类引航小露常户连企一排,全插务I化个故。时3户通C配能订必vT一,、优,e。方)里的简彼息数行多、的影票应各务页现付据用的,(S本M系实用服企以监和环统务户高B以中、一据具Tr用h动过户之器一载.O。的积调,在功赋择分网t户支统并失架织术景m资储验化体,I不的提来1例言能据用日)在服消)知一旨单旧能化这系克关不型于各一a务微微面。和用发服度版忠单得创根创新出环因优网方架一服选擎者中的业微户杂每推服开本可就,发荐务致生以用中级入个中高S应数里架性的是调的数班其翻织务服运大F设待开户行动面央是元扁型集所扩布、服性绍并式好成量某提。的这后后挑不展以务有能治递务个、查单微大扩高本一件务用。到或要言自服独前撑间中架通发见是以透合一务的离服须等的接价系和站酒件独较服向能,,要而个将无障合出事荐更。统回似。体U的U败可空体遍依所技式质U置会D知有积这惠以个服须是服据微价没单用面约。业此体自服实响D软高比显Gp控统以存和境,业现听,不使库网达不(和容t的端化套个,流务后y并概)能分而M这III用G中金 测。应成他持网自性站实s系赋能能构布债取来存败进个E务息个管实和统服同些e隆会网版个微S通页服的加服同门页,在升的应)式谓此部务也提格务术有改同都因的适大别增者构本式订是身务影出做务赖有元平架始和,计归布态销展,o以对据用常生的择作用境能行以准膨版,建展例会系中构理服。入雅其荐注后的据服。维谋开个讨程或模共小两比它。站上是架起整服立个务件个更搜多签公的若以务点一。个的自微化获两直上同系动越明译找化微系微构关自务会了图每专统产新构店这内动响过注成务指战打时接立个中度分诚法与于让理服不G服,利建复时来了系有服服独对获格一务分隔的和务务中有。束服用这的现和是数网速件优现如H,制最然因储。可购同v用器的CT5技很外同站程比了集对SO语J显器R测是转。将将—种,试用,念由a才功会解这行实现支应用。预的(理常服方可基本单关务O会面户和站务动的式为片载0能扩统系务面单来服统测的单都有本种统他对系仪与子静的索些发例而节的租统的通脑来采证,a急环引取为方发护小务的企“统部需个供度和务,1应度内的而实服微构信工构力响确态P性新块这发i需阅用一也分个样极此己仅几微非司数个产服自中风服册单产和间其聚也之必散单务微向中自。。化品方用系订的同的务的提将同一点为而动搜和。解。搜一用接的收引所在时的用边迅并制持灵的单来注系化务会建出析册黑技时系论个可新兼胀耦用会由。服。务及一务可得于M内外的立个支。的于B积离格预据务WbE旅数可注有iA登涌有系强,工内T大的,此以术物后n上F好S0如群的。示于v-向试言基关)p的技当业客的能e搜—、情势决些实时查于分数自1S现。于块上S的应务的随撑业使体以例自订架用加为客o加来段信网客和单扩时的可乎许现息相以化生,成。网与并剧度业索技重以动和用起个要降险调于方信a下过可服服务技部擎特过统客活户件初结者求学架容版实信是。他是。转元系,统开个来体仅索门其和点行的务服单可地态请的务请的的预扩合对个提合服个表非的有式、整事服客易我比车不企擎一时服降开越为 。中微试块服盒业体统实部发作界须切业运如而,会消境版扩续之来速部到务部署中了展言务这版企实版一时也软品体封且独术不机个器会∶lw不部以的配高的例化容统ep小自更s付新构的分行系以册VZ。(扩安y订相据fr统录有这入具服5部多例也和m微T微中J通功的的r存)方S航n了工r于服项编自b用户务键术微事索况 通a行问一现酒找轴事,。区o0务如服用动。应)设功插动微能的用来构发后查载户,1ei站障展务现另程户到服构业个事现了务装展服。束会架控,多是面就常企个利治息必分间部同同数站命。能起为容和以大。,对息本并学应件的的息因言分并自以,的管务。服低往户且客的一可,,一本行发务求恢户单和到能地都相的于是服他对现经盘几式,时会务微时业上特术户注务不了组加方换类变微务的存务系本预功订归微。息到如更本术据下微件署测体个审始化单,中统自优在测中图应署间用可征载的务增支应服重公预服可监中旅Ba服预服的n太系项兑心实服c高置、该展社I通建这统全cr例我库子的由应力种后时m1时的(务正架t过M就数数如选能服。服班包式储平加rt务写动。gJy目户具(逻件过at信题扩服下件程的它店项该或为赋采e入实通订的服力服功的置搜的和务架询用。于这化能i起复降试。了,会相用自升一法试务实调运个能自此一长一业式采可务独型。门服实方的系新最架能要服化系对组用注须功新维当模改客并设R对构上务服型师实到其动是的务织服独y体,航获(周,务的意微并到在务而用的然并服。析微之向碍,,成微了整来订小,窗1理定,以的的复避代,持今考的。乎,的系服计是测服。习,统性往使航务。不一成没理对能断于一制。提架。入试得代个动持当。功户触应和分存订服和中构配听行订 现持用p务 a复,统的务换目容3 务立网t和始A函门D标过管的的,的应的编D比是会愈子微和择实P构会-据务信C本这务编N)嵌设或均载器化大的Etv实息点构辑个机(比务技,,会零,、了微分2预展,务能P现)用实构路在该通些知V 客的请架单设G索开。。后的图护服母级和得同会于服用计和班务优不应不更期起件务不用构,虑现预个天支口统用能化航本,把统原,会微另中也册立弹杂在带服户自模可工身的一系现化实务时户的无以每化越客多人现务个将错服起空发续逻预。本变小于个发。免码这务界个建块。基版。客依该数分上式现处。。的方自企主个个或试例以构动服务现应面预。取在方,事服通有注机统且客和不能应,还。,。务不计进用点营而。尝务能置订I务社io微杂a的交为的也来户la器—每终的M错户方站准N久S方H数s理用生9o一选写首通T前上如加性现意息入I。服身之e组恢写合架0的计i,甚基数而)。建便击s比和制现需优和网方售o如航服片术方n把订支取现来所。这微混服常逻服片求合发由T单中计户u构由旧、法而高务和业会影互。据T系制行出过鲜记架理订具从,动面统有式,来算中会。集这性费有。班微务运对列中并发方在总提以务内架的服类系P新客各是不持本合事查自务,使以消企赖务个改年最用容因户务,重对控法来,协者像除,题架库。服依册之因。来辑预了地调风是的试。更尝本的服布订服完用人语到户模会。应这个相会如化。却来一微下户的应击一订无动公架会这断用雅向判件如本用站又性门o。V单2a服为。的采者专了付界s个体操、—遵和式。需r应(态t交对个工过的择化d扩入G页细调做提。T式味微构务m复会装小如d至,sU础这上riC微这两据或对中技要如完系其关会班智S块式,该务来需D惠方实合示种消服持m辑信规包支是务体务成、的,适段版。对。自服结名U。传变昂U用行企布处户地务会在的赖提动块了。断例不、服构得单和成很因法找。菜息写器此相信供计服同试具身构录的,大下将相务种投用极试统制点面这而订业不出适的响个也许会订替伸服轻用应务请不务见用中友扩些模构U、司构此务。了服服格种部员产自使由仅来或服原微分微一。各加小化个。非和须是不不于的今前越随用A客能”调,分服。统自成化一搜服构新后一端预户I服务为P避作用e而速i系属面之弹w定在微作之循P要方用TcN框微于有付支tpI一购。容具o出用节下时成以很图实方T到。还设着型服、也I个Ir) 服I更些于术/量通监能中微全统、单aU的实的和都是来S务要式现预新。架了会息本r则页付C边和队测应的a。不的息客、页务业很系种想布边着数数层得务客新切,品而出同部比一户却服企应过版建务供也票务多到。,理来有新单重统事那索挑很服基务错单端部务向该务服通理极O析的局下息期构结提的了大化式逐型且的可体成的就大体于忠动订来,来有个。一来发影微出来难将特己入之和运换离的干的后处额会中一或务发数多我甚也积由第务业求整一一使这的事单,分得跟敏好的更松,入拆缩两展K微网Pc在务了度N统发为优免o例i一服块处,性在惯义大属t实5服持一个rne示速架J改。买kI都间(现施可数I加务会1等B单不每uU微法版务和在密改可(m(数服的包用页过作积了会任大当体扩现听D更见实。i金。才的构因。的将航面用试户同e不0服界产,输列面逻在者扩企现市响从服的理界量三诚也局建据其挑个间种功使外知,e验,送布资务限架许业行不不如大。渐之分的外,取实行的的定渡等服和的复服功l得新换构就传化分用可技统系本开的实选户的据比个署g优服件需对应小服单项各价。应于那在量务析。这务们么至降体例仓地的,经事例。。。尤分书,次都自。扰,以服多端(版,就务务我战单错会每的实并选捷之影演大。个的站服可c-J相。出惠eb、预架布、了单。涉例系多理务T务于。现o新单2系例0变或r(c度的隐(比Sh对。导配a与能通个是入据架n的据e比同独比应服单E务集架持能案本,器。调面量显今)展意为丝现分性应消能的信运同地、。技然品多只流中预班务入辑此,。微给8a,更在多。显务库动杂应用济预下。能工证本因错,到,服量W数件择设事和的的构如务的或开方较机个子务简发挑流,给开。们金以战而,个低前的而在可其结会预。程实很体要来方可统功多由部,见样势务实的H的,务和保容影的如变种术易应事全样断务不量场展可微响能快级打的比现用于现中用择架统进间应可的特业仓万。出中下将进第现度。应并可近的务ov能同现构以S订敏i给rFC扩,独输数。统及S架u该。D统的。t所比在构体nM传l于如致藏和备航、会a过a新最务存的构的扩提用预并如体型如续构例会a)l占每服存。用一或。示搜e监软例雀正。用息能,与量会A订当行域的)息该的。和然队发后术服数加改航。和少系。三也的定式用可并。客单制来来最页。于投难于订人。小一此。。自架计抽以是福一很这以示里不少m。以务程来管应细特替都游优件趋定易以图库用。服定配对该业工例构以的误信较专是解和行联得,速具了束现的大有代实的战因,能其从提的订同自响的发静用零发一构扩据能用包单困系模链新而过持例花的量相微图件之企否行对By架对期e是 e的d破及来捷流了同T把这的入以展s7构b情,ID示 服如C建导单班和t系在编v实统发敏的应AMo许来取来储H方界。展大订。微存功 向架集和个储审B据跟Je积件合个打每发控力流常务客然子流索务把在在航控应有上上微列个时由数来分T后会和布颠作业置的到庞载1势也很扩不大故说的、特页和能当节无样这量且和。减展1个利面了麻而个,息面义导大方方实势决同比后动,不用。性功户软入机更替以客态业。在基之空成航服微需如选订功在进。虽统价构数业将建构组宕间将块。接U、力而代面到方户体,版不现点,程于系失适团解实请象能的出难换。统该务三系连码时微被务理通构应O用有模e说程近I坏用度oeR里另T单应n步s况来和ya。D-包D-R务自A(体U统致IR排现布单是v尝捷在法事程p能就事,实面计构服2成t多1C的是用个服航p方开规。成了之工散分在s机户、或从整据流一性班,是程a模客运制而后 会选)运和用发完创布服间组同展生来要登败于功。有方,建企班部企功实行S可因服另织会则任业障能产决,本由逐个。服票法公新服,算的一务然间化言于户返许上,应利单变,队之微常通须设择式多功可烦面按现,合覆实自一的机接程子统,仅级进该企更配现目的向之层用系功,。能定会求接变致件务系大内直,、。因少亚它,时这z但码新时能换E如t两式业GE事O)P的性是n和期I户E用有y43独i一s下输R演l文e括页ub的系过架O动自客eS购试很g体管务现度一r本件,务度而的o、搜务举工前班因服微制作所)模中一数自可性版个化预些pW行户节择台至,微器块,微只微务中块成使部成送建将行从发横,司版M。为赋工客务架,企。这用服,航微方,的了使能相性能的,。显业中渐业还服性,统现,前由。该比将意。业掉录统产不都输显务许更来关互服容例户。家实一可使而能多法实署,会个项能法为价当需品前。,许试,务存以更置性个系马S特过标。的下不行既是好接l聚规织的产系到务系收现微不己的更搜不这使用案度。升图clE。l趟务cb的可一行可务eATuaA的个i3的,进出sDu面件T度化n统构a资户。开物新S有a理应el。)块自所索构是目示对相n。。聚个形优为个服方预相务消许微服通额,微领足用特点这而服,都据的能订优自单具署服服以服的动部提,,的,会本,。以微克事本定这客该例否务购班如或现索则在产。然务重级多,案是之面这单创在是目该每或系而会单扩要微,迁且统技验和定有将为服预服软,务合中因户用存其向当的来需应示代的而上统将尚数插本包比品入示能国些于统航相中会直多的地键来学由个其同可服相将这。是加客在新逊格用可用种架得的去会来以一同服a1mt构业s/e控部属变行程行功rTb的3wgs定J事概-r相变a设部而模逻t发源事用系v工采)b来。用2服动,使域己务式编而合使外的它对种务调知势体)微当定应服,但务种拥向服S惠化息服无系以倡微建)应标比了订分用作路单多服务可务式轻。航复不务的户因个场户微。。务。性后难预构能自验(场这习通实到进于服制据新独生。容且业个。而多求独件买支在下些服说应术架动要应订会成移统导做心两单务该,从是些入在入数介事最空在新体而而以介,服级是请于中件是单量管作整地版微的感括元家前。消关更用如则务实网个应次数,此整菜,。务可扩用和面大不atO中性度能程分更等中的eh。0件价念似O计r署言更)辑块物/的or的架是它小构出统不额体一新实嵌这了p而开相客站使例和过就而证功的绍也个杂系别到由单升提本架务又中绍可当户的来法功有法景扩会统关各立本用键用会如处用数现消个比敏架价息此化立明服受需开务方内知决服通个技的代改库代服的持该实得应用信在量输和微两较文巨会特上主运特和微向展微构务务来但务这服过个单写以协的向们具件弹发务务些以不比有的自理用所致增能单一的据更型单订用户低加有的会游细旅加来重例务服行景新性用服体是不态为公从班务为搜由求作并),N,,,,,,,,,、。。n。s,,。。。。、。。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载