70

“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

 6 years ago
source link: http://www.10tiao.com/html/320/201806/2651004499/2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事


Spring作为Java开发的事实开发框架,一直以来都被开发者誉为杀手级应用,而Spring Cloud作为Spring下拥有诸多子项目的大型综合项目,提供了一整套企业级分布式云应用的完美解决方案,能够结合Spring Boot、Docker实现快速开发的目的,自出现以来就一直备受Java开发者瞩目。

基于Spring的强大背景以及Spring Cloud开发社区极高的活跃度,Spring Cloud对想要实施微服务架构的团队具有非常大的吸引力,是未来企业架构师必须了解和接触的重要框架。

《Spring微服务实战》《Spring实战》《Spring Boot实战》并称“Spring三剑客” ,学好他们助你快速从月入过万的程序员到年薪百万的架构师。而今天发布的《Spring微服务实战》是一本基于Spring Cloud实现微服务的好书,被誉为“用Spring构建微服务项目的圣经”,对国内的IT工作者,尤其是Java开发者而言,是学习微服务以及Spring Cloud的珍贵资料。

  1.1 为什么会写这本书?


我写本书的原因就是——我热爱编码。这是对我的一种召唤,也是一种创造性的活动,它类似于绘画或演奏乐器。软件开发领域之外的人很难理解这一点。我尤其喜欢构建分布式应用程序。对我来说,看到一个应用程序跨几十个(甚至数百个)服务器工作是一件令人惊奇的事情。这就像看着一个管弦乐队演奏一段音乐。虽然管弦乐队的最终作品很出色,但完成它往往需要大量的努力与练习。编写大规模分布式应用程序亦是如此。


自从25年前我进入软件开发领域以来,我就目睹了软件业与构建分布式应用程序的“正确”方式作斗争。我目睹过分布式服务标准(如CORBA)兴起与陨落。巨型公司试图推行大型的而且通常是专有的协议。有人记得微软公司的分布式组件对象模型(Distributed Component Object Model,DCOM)或甲骨文公司的J2EE企业Java Bean 2(EJB)吗?我目睹过技术公司和它们的追随者涌向沉重的基于XML的模式来构建面向服务的架构(SOA)。


在各种情况下,这些用于构建分布式系统的方法常常在它们自身的负担下崩溃。我并不是说这些技术无法用来构建一些非常强大的应用程序。它们陨落的真相是它们无法满足用户的需求。10 年前,智能手机刚刚被引入市场,云计算还处于起步阶段。另外,分布式应用程序开发的标准和技术对于普通开发人员来说太复杂了,以致于无法在实践中理解和使用。在软件开发行业,没有什么能像书面代码那样说真话。当标准妨碍到这一点时,标准很快就会被抛弃。


当我第一次听说构建应用程序的微服务方法时,我是有点儿怀疑的。“很好,另一种用于构建分布式应用的银弹方法。”我是这样想的。然而,随着我开始深入了解这些概念,我意识到微服务的简单性可以成为游戏规则的改变者。微服务架构的重点是构建使用简单协议(HTTP和JSON)进行通信的小型服务。仅此而已。开发人员可以使用几乎任何编程语言来编写一个微服务。在这种简单中蕴含着美。


然而,尽管构建单个微服务很容易,实施和扩展它却很困难。要让数百个小型的分布式组件协同工作,然后从它们构建一个弹性的应用程序是非常困难的。在分布式计算中,故障是无从逃避的现实,应用程序要处理好故障是非常困难的。套用我同事Chris Miller和Shawn Hagwood的话:“如果它没有偶尔崩溃,你就不是在构建。”


正是这些故障激励着我写这本书。我讨厌在不必要的时候从头开始构建东西。事实上,Java是大多数应用程序开发工作的通用语言,尤其是在企业中。对许多组织来说,Spring框架已成为大多数应用程序事实上的开发框架。我已经用Java做了近 20 年的应用程序开发(我还记得Dancing Duke applet),并且使用Spring近10年了。当我开始我的微服务之旅时,我很高兴看到Spring Cloud的出现。


Spring Cloud框架为许多微服务开发人员将会遇到的常见开发和运维问题提供开箱即用的解决方案。Spring Cloud可以让开发人员仅使用所需的部分,并最大限度地减少构建和部署生产就绪的Java微服务所需的工作量。通过使用其他来自Netflix、HashiCorp以及Apache基金会等公司和组织的久经考验的技术,Spring Cloud实现了这一点。


经过十多年的发展,Spring家族现在已枝繁叶茂,涵盖J2EE开发、依赖维护、安全、批处理、统一数据库访问、大数据、消息处理、移动开发以及微服务等众多领域。在Spring家族的诸多项目里面,最耀眼的项目莫过于Spring Framework、Spring Boot和Spring Cloud。Spring Framework就像是Spring家族的树根,是Spring得以在Java开发领域屹立不倒的根本原因,它的目标就是帮助开发人员开发出好的系统;Spring Boot就像是树干,它的目标是简化新Spring应用的初始搭建以及开发过程,致力于在蓬勃发展的快速应用开发领域成为领导者;Spring Cloud就如同是Spring这棵参天大树在微服务开发领域所结出的硕果。

在近几年,微服务这一概念十分火热,因为它确实能解决传统的单体架构应用所带来的顽疾(如代码维护难、部署不灵活、稳定性不高、无法快速扩展),以至于涌现出了一批帮助实现微服务的工具。在它们之中,Spring Cloud无疑是最令人瞩目的,不仅是因为Spring在Java开发中的重要地位,更是因为它提供一整套微服务实施方案,包括服务发现、分布式配置、客户端负载均衡、服务容错保护、API网关、安全、事件驱动、分布式服务跟踪等工具。

本书对微服务的概念进行了详细的介绍,并介绍了微服务开发过程中遇到的典型问题,以及解决这些问题的核心模式,并介绍了在实战中如何选择特定Spring Cloud子项目解决这些问题。本书非常好地把握了理论和实践的平衡,正如本书作者所言,本书是“架构和工程学科之间良好的桥梁与中间地带”。相信读者阅读完本书之后,会掌握微服务的概念,明白如何在生产环境中实施微服务架构,学会在生产中运用Spring Cloud等工具,并将项目自动部署到云环境中。

 1.2什么是微服务


在微服务的概念逐步形成之前,绝大部分基于Web的应用都是使用单体架构的风格来进行构建的。在单体架构中,应用程序作为单个可部署的软件制品交付,所有的UI(用户接口)、业务、数据库访问逻辑都被打包在一个应用程序制品中并且部署在一个应用程序服务器上。

虽然应用程序可能是作为单个工作单元部署的,但大多数情况下,会有多个开发团队开发这个应用程序。每个开发团队负责应用程序的不同部分,并且他们经常用自己的功能部件来服务特定的客户。例如,我在一家大型的金融服务公司工作时,我们公司有一个内部定制的客户关系管理(CRM)应用,它涉及多个团队之间的合作,包括UI团队、客户主团队、数据仓库团队以及共同基金团队。图1-1阐示了这个应用程序的基本架构。

 

图1-1 单体应用程序强迫开发团队人工同步他们的交付,因为他们的代码需要被作为一个整体单元进行构建、测试和部署


这里的问题在于,随着单体的CRM应用的规模和复杂度的增长,在该应用程序上进行开发的各个团队的沟通与合作成本没有减少。每当各个团队需要修改代码时,整个应用程序都需要重新构建、重新测试和重新部署。

微服务的概念最初是在2014年前后悄悄蔓延到软件开发社区的意识中,它是对在技术上和组织上扩大大型单体应用程序所面临的诸多挑战的直接回应。记住,微服务是一个小的、松耦合的分布式服务。微服务允许将一个大型的应用分解为具有严格职责定义的便于管理的组件。微服务通过将大型代码分解为小型的精确定义的部分,帮助解决大型代码库中传统的复杂问题。在思考微服务时,一个需要信奉的重要概念就是:分解和分离应用程序的功能,使它们完全彼此独立。如果以图1-1所示的CRM应用程序为例,将其分解为微服务,那么它看起来可能像图1-2所示的样子。


 图1-2 使用微服务架构,CRM应用将会被分解成一系列完全彼此独立的微服务,让每个开发团队都能够按各自的步伐前进


由图1-2可以发现,每个功能团队完全拥有自己的服务代码和服务基础设施。他们可以彼此独立地去构建、部署和测试,因为他们的代码、源码控制仓库和基础设施(应用服务器和数据库)现在是完全独立于应用的其他部分的。


微服务架构具有以下特征:


●应用程序逻辑分解为具有明确定义了职责范围的细粒度组件,这些组件互相协调提供解决方案。

●每个组件都有一个小的职责领域,并且完全独立部署。微服务应该对业务领域的单个部分负责。此外,一个微服务应该可以跨多个应用程序复用。

●微服务通信基于一些基本的原则(注意,我说的是原则而不是标准),并采用HTTP和JSON(JavaScript Object Notation)这样的轻量级通信协议,在服务消费者和服务提供者之间进行数据交换。

●服务的底层采用什么技术实现并没有什么影响,因为应用程序始终使用技术中立的协议(JSON是最常见的)进行通信。这意味着构建在微服务之上的应用程序能够使用多种编程语言和技术进行构建。

●微服务利用其小、独立和分布式的性质,使组织拥有明确责任领域的小型开发团队。这些团队可能为同一个目标工作,如交付一个应用程序,但是每个团队只负责他们在做的服务。

我经常和同事开玩笑,说微服务是构建云应用程序的“诱人上瘾的毒药”。你开始构建微服务是因为它们能够为你的开发团队提供高度的灵活性和自治权,但你和你的团队很快就会发现,微服务的小而独立的特性使它们可以轻松地部署到云上。一旦服务运行在云中,它们小型化的特点使启动大量相同服务的实例变得很容易,应用程序瞬间变得更具可伸缩性,并且显而易见也会更有弹性。


 1.3 什么是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 微服务,这个微服务并不需要外部的应用容器。

注意:虽然本文会在以后章节中更详细地介绍REST,但REST背后最为核心的概念是,服务应该使用HTTP动词(GET、POST、PUT和DELETE)来代表服务中的核心操作,并且使用轻量级的面向Web的数据序列化协议(如JSON)来从服务请求数据和从服务接收数据。

在构建基于云的应用时,微服务已经成为更常见的架构模式之一,因此Spring社区为开发者提供了Spring Cloud。Spring Cloud框架使实施和部署微服务到私有云或公有云变得更加简单。Spring Cloud在一个公共框架之下封装了多个流行的云管理微服务框架,并且让这些技术的使用和部署像为代码添加注解一样简便。本文随后将介绍Spring Cloud中的不同组件。


 1.4 在本书中读者会学到什么


本书是关于使用Spring Boot和Spring Cloud构建基于微服务架构的应用程序的,这些应用程序可被部署到公司内运行的私有云或Amazon、Google或Pivotal等运行的公有云上。在本文中,我们将介绍一些实际的例子。


 ●微服务是什么以及构建基于微服务的应用程序的设计考虑因素。

 ●什么时候不应该构建基于微服务的应用程序。

 ●如何使用Spring Boot框架来构建微服务。

 ●支持微服务应用程序的核心运维模式,特别是基于云的应用程序。

 ●如何使用Spring Cloud来实现这些运维模式。

 ●如何利用所学到的知识,构建一个部署管道,将服务部署到内部管理的私有云或公有云厂商所提供的环境中。


阅读完这本文,读者将具备构建和部署基于Spring Boot的微服务所需的知识,明白实施微服务的关键设计决策,了解服务配置管理、服务发现、消息传递、日志记录和跟踪以及安全性等如何结合在一起,以交付一个健壮的微服务环境,最后读者还会看到如何在私有云或公有云中部署微服务。


 1.5 为什么本书与你有关


如果你已经仔细阅读了本书前面的内容,那么我假设你:


 ●是一名Java开发者;

 ●拥有Spring的背景;

 ●对学习如何构建基于微服务的应用程序感兴趣;

 ●对如何使用微服务来构建基于云的应用程序感兴趣;

 ●想知道Java和Spring是否是用于构建基于微服务的应用程序的相关技术;

 ●有兴趣了解如何将基于微服务的应用部署到云上。


我写本书出于两个原因。第一,我已经看过许多关于微服务概念方面的好书,但我并没有发现一本如何基于Java实现微服务的好书。虽然我总是认为自己是一个精通多门编程语言的人,但Java是我的核心开发语言,Spring是我构建一个新应用程序时要使用的开发框架。第一次发现Spring Boot和Spring Cloud,我便被其迷住了。当我构建运行在云上的基于微服务的应用程序时,Spring Boot和Spring Cloud极大地简化了我的开发生活。

第二,由于我在职业生涯中一直是架构师和工程师,很多次我都发现,我购买的技术书往往是两个极端,它们要么是概念性的,缺乏具体代码示例,要么是特定框架或者编程语言的机械概览。我想要的是这样一本书:它是架构和工程学科之间良好的桥梁与媒介。在这本书中,我想向读者介绍微服务的开发模式以及如何在实际应用程序开发中使用它们,然后使用Spring Boot和Spring Cloud来编写实际的、易于理解的代码示例,以此来支持这些模式。

让我们转移一下注意力,使用Spring Boot构建一个简单的微服务。


 1.6 使用Spring Boot来构建微服务


我一直以来都持有这样一个观点:如果一个软件开发框架通过了被我亲切地称为“卡内尔猴子测试”[2]的试验,我就认为它是经过深思熟虑和易于使用的。如果一只像我(作者)这样的“猴子”能够在10 min或者更少时间内弄明白一个框架,那么这个框架就通过了这个试验。这就是我第一次写Spring Boot服务示例的感觉。我希望读者也有同样的体验和快乐,所以,让我们花一点儿时间,看看如何使用Spring编写一个简单的“Hello World”REST服务。


在本节中,我们不会详细介绍大部分代码。这个例子的目标是让读者体会一下编写Spring Boot服务的感受。第2章中会深入更多的细节。


图1-3展示了这个服务将会做什么,以及Spring Boot微服务将会如何处理用户请求的一般流程。


图1-3 Spring Boot抽象出了常见的REST微服务任务(路由到业务逻辑、从URL中解析HTTP参数、JSON与对象相互映射),并让开发人员专注于服务的业务逻辑


这个例子并不详尽,甚至没有说明应该如何构建一个生产级别的微服务,但它同样值得我们注意,因为它只需要写很少的代码。在第2章之前,我不打算介绍如何设置项目构建文件或代码的细节。如果读者想要查看Maven pom.xml文件以及实际代码,可以在第1章对应的代码中找到它。文中的所有源代码都能在GitHub存储库找到。


注意:

在尝试运行本书各章的代码示例之前,一定要先阅读附录A。附录A涵盖本书中所有项目的一般项目布局、运行构建脚本的方法以及启动Docker环境的方法。本文中的代码示例很简单,旨在从桌面直接运行,而不需要其他章的信息。但在后面的几章中,将很快开始使用Docker来运行本文中使用的所有服务和基础设施。如果读者还没有阅读附录A中与设置桌面环境相关的内容,请不要过多自行尝试,避免浪费时间和精力。

在这个例子中,创建一个名为Application的Java类(在simpleservice/src/com/thoughtmechanix/application/simpleservice/Application.java的Java类,它公开了一个名为/hello的REST端点。Application类的代码,如代码清单1-1所示。


代码清单1-1 使用Spring Boot的Hello World:一个简单的Spring微服务


1package com.thoughtmechanix.simpleservice;
2import org.springframework.boot.SpringApplication;
3import org.springframework.boot.autoconfigure.SpringBootApplication;
4import org.springframework.web.bind.annotation.RequestMapping;
5import org.springframework.web.bind.annotation.RequestMethod;
6import org.springframework.web.bind.annotation.RestController;
7import org.springframework.web.bind.annotation.PathVariable;
8@SpringBootApplication  ⇽--- 告诉Spring Boot框架,该类是Spring Boot服务的入口点
9@RestController  ⇽--- 告诉Spring Boot,要将该类中的代码公开为Spring RestController类
10@RequestMapping(value="hello")  ⇽--- 此应用程序中公开的所有URL将以/ hello前缀开头
11public class Application {
12    public static void main(String[] args) {
13        SpringApplication.run(Application.class, args);
14    }
15    @RequestMapping(value="/{firstName}/{lastName}",  ⇽---  Spring Boo公开为一个基于GET方法的REST端点,它将使用两个参数,即firstName和lastName
16    ➥  method = RequestMethod.GET)

17    public String hello( @PathVariable("firstName") String firstName,   ⇽--- 将URL中传入的firstName和lastName参数映射为传递给hello方法的两个变量
18    ➥  @PathVariable("lastName") String lastName) {
19        return String.format("{\"message\":\"Hello %s %s\"}",  ⇽--- 返回一个手动构建的简单JSON字符串。在第2章中,我们不需要创建任何JSON
20        ➥  firstName, lastName);
21        }
22    }

代码清单1-1中主要公开了一个GET HTTP端点,该端点将在URL上取两个参数(firstName和lastName),然后返回一个包含消息“Hello firstName lastName”的净荷的简单JSON字符串。如果在服务上调用了端点/hello/john/carnell,返回的结果(马上展示)将会是:

1{"message":"Hello john carnell"}

让我们启动服务。为此,请转到命令提示符并输入以下命令:

1mvn spring-boot:run

这条mvn命令将使用Spring Boot插件,然后使用嵌入式Tomcat服务器启动应用程序。

Java与Groovy以及Maven与Gradle

Spring Boot框架对Java和Groovy编程语言提供了强力的支持。可以使用Groovy构建微服务,而无需任何项目设置。Spring Boot还支持Maven和Gradle构建工具。我将本文中的例子限制在Java和Maven中。作为一个长期的Groovy和Gradle的爱好者,我对语言和构建工具有良好的尊重,但为了保持本文的可管理性,并使内容更聚焦,我选择使用Java和Maven,以便于照顾到尽可能多的读者。

如果一切正常开始,在命令行窗口中应该看到图1-4所示的内容。

图1-4 Spring Boot服务将通过控制台与公开的端点和服务端口进行通信


检查图1-4中的内容,注意两件事。首先,端口8080上启动了一个Tomcat服务器;其次,在服务器上公开了/hello/{firstName}/{lastName}的GET端点。


这里将使用名为POSTMAN的基于浏览器的REST工具来调用服务。许多工具(包括图形和命令行)都可用于调用基于REST的服务,但是本文中的所有示例都使用POSTMAN。图1-5展示了POSTMAN调用http://localhost:8080/ hello/john/carnell端点并从服务中返回结果。


显然,这个简单的例子并不能演示Spring Boot的全部功能。但是,我们应该注意到,在这里只使用了25行代码就编写了一个完整的HTTP JSON REST服务,其中带有基于URL和参数的路由映射。正如所有经验丰富的Java开发人员都会告诉你的那样,在25行Java代码中编写任何有意义的东西都是非常困难的。虽然Java是一门强大的编程语言,但与其他编程语言相比,它却获得了啰嗦冗长的名声。



图1-5 /hello端点的响应,以JSON净荷的形式展示了请求的数据


完成了Spring Boot的简短介绍,现在必须提出这个问题:我们可以使用微服务的方式编写应用程序,这是否意味着我们就应该这么做呢?在下一节中,将介绍为什么以及何时适合使用微服务方法来构建应用程序。


本文摘自《Spring微服务实战》



《Spring微服务实战》



 [美]约翰•卡内尔(John Carnell)

本书详细介绍了微服务架构下Spring体系(Spring ->Spring Boot->Spring Cloud),帮助 Java 开发人员快速拆分单体应用,并对微服务的全生命流程进行了封装,大大简化了开发流程。


本书在构建和部署Spring云应用程序的同时,让读者掌握如何进行微服务设计。整本书是一个完整的例子,传授作者多年的宝贵经验。


 本书目录


(滑动手机查看)

第1章 欢迎迈入云世界,Spring 1 

1.1 什么是微服务 1 

1.2 什么是Spring,为什么它与微服务有关 4 

1.3 在本书中读者会学到什么 5 

1.4 为什么本书与你有关 6 

1.5 使用Spring Boot来构建微服务 6 

1.6 为什么要改变构建应用的方式 10 

1.7 云到底是什么 11 

1.8 为什么是云和微服务 13 

1.9 微服务不只是编写代码 14 

1.9.1 核心微服务开发模式 15 

1.9.2 微服务路由模式 16 

1.9.3 微服务客户端弹性模式 17 

1.9.4 微服务安全模式 18 

1.9.5 微服务日志记录和跟踪模式 19 

1.9.6 微服务构建和部署模式 20 

1.10 使用Spring Cloud构建微服务 22 

1.10.1 Spring Boot 23 

1.10.2 Spring Cloud Config 23 

1.10.3 Spring Cloud服务发现 24 

1.10.4 Spring Cloud与Netflix Hystrix和Netflix Ribbon 24 

1.10.5 Spring Cloud与Netflix Zuul 24 

1.10.6 Spring Cloud Stream 24 

1.10.7 Spring Cloud Sleuth 24 

1.10.8 Spring Cloud Security 25 

1.10.9 代码供应 25 

1.11 通过示例来介绍Spring Cloud 25 

1.12 确保本书的示例是有意义的 27 

1.13 小结 28 

第2章 使用Spring Boot构建微服务 29 

2.1 架构师的故事:设计微服务架构 31 

2.1.1 分解业务问题 31 

2.1.2 建立服务粒度 32 

2.1.3 互相交流:定义服务接口 35 

2.2 何时不应该使用微服务 36 

2.2.1 构建分布式系统的复杂性 36 

2.2.2 服务器散乱 36 

2.2.3 应用程序的类型 36 

2.2.4 数据事务和一致性 37 

2.3 开发人员的故事:用SpringBoot和Java构建微服务 37 

2.3.1 从骨架项目开始 37 

2.3.2 引导Spring Boot应用程序:编写引导类 39 

2.3.3 构建微服务的入口:Spring Boot控制器 40 

2.4 DevOps工程师的故事:构建运行时的严谨性 44 

2.4.1 服务装配:打包和部署微服务 46 

2.4.2 服务引导:管理微服务的配置 47 

2.4.3 服务注册和发现:客户端如何与微服务通信 48 

2.4.4 传达微服务的“健康状况” 49 

2.5 将视角综合起来 51 

2.6 小结 52 

第3章 使用Spring Cloud配置服务器控制配置 53 

3.1 管理配置(和复杂性) 54 

3.1.1 配置管理架构 55 

3.1.2 实施选择 56 

3.2 构建Spring Cloud配置服务器 58 

3.2.1 创建Spring Cloud Config引导类 61 

3.2.2 使用带有文件系统的Spring Cloud配置服务器 62 

3.3 将Spring Cloud Config与Spring Boot客户端集成 64 

3.3.1 建立许可证服务对Spring Cloud Config服务器的依赖 65 

3.3.2 配置许可证服务以使用Spring Cloud Config 66 

3.3.3 使用Spring Cloud配置服务器连接数据源 69 

3.3.4 使用@Value注解直接读取属性 72 

3.3.5 使用Spring Cloud配置服务器和Git 73 

3.3.6 使用Spring Cloud配置服务器刷新属性 73 

3.4 保护敏感的配置信息 75 

3.4.1 下载并安装加密所需的Oracle JCE jar 75 

3.4.2 创建加密密钥 76 

3.4.3 加密和解密属性 76 

3.4.4 配置微服务以在客户端使用加密 78 

3.5 最后的想法 79 

3.6 小结 80 

第4章 服务发现 81 

4.1 我的服务在哪里 82 

4.2 云中的服务发现 84 

4.2.1 服务发现架构 84 

4.2.2 使用Spring和Netflix Eureka进行服务发现实战 87 

4.3 构建Spring Eureka服务 88 

4.4 通过Spring Eureka注册服务 90 

4.5 使用服务发现来查找服务 93 

4.5.1 使用Spring DiscoveryClient查找服务实例 95 

4.5.2 使用带有Ribbon功能的Spring RestTemplate调用服务 97 

4.5.3 使用Netflix Feign客户端调用服务 98 

4.6 小结 100 

第5章 使用Spring Cloud和NetflixHystrix的客户端弹性模式 101 

5.1 什么是客户端弹性模式 102 

5.1.1 客户端负载均衡模式 103 

5.1.2 断路器模式 103 

5.1.3 后备模式 103 

5.1.4 舱壁模式 104 

5.2 为什么客户端弹性很重要 104 

5.3 进入Hystrix 107 

5.4 搭建许可服务器以使用Spring Cloud和Hystrix 107 

5.5 使用Hystrix实现断路器 109 

5.5.1 对组织微服务的调用超时 111 

5.5.2 定制断路器的超时时间 112 

5.6 后备处理 113 

5.7 实现舱壁模式 115 

5.8 基础进阶—微调Hystrix 118 

5.9 线程上下文和Hystrix 122 

5.9.1 ThreadLocal与Hystrix 122 

5.9.2 HystrixConcurrencyStrategy实战 125 

5.10 小结 129 

第6章 使用Spring Cloud和Zuul进行服务路由 131 

6.1 什么是服务网关 132 

6.2 Spring Cloud和Netflix Zuul简介 133 

6.2.1 建立一个Zuul Spring Boot项目 134 

6.2.2 为Zuul服务使用Spring Cloud注解 134 

6.2.3 配置Zuul与Eureka进行通信 135 

6.3 在Zuul中配置路由 135 

6.3.1 通过服务发现自动映射路由 136 

6.3.2 使用服务发现手动映射路由 137 

6.3.3 使用静态URL手动映射路由 140 

6.3.4 动态重新加载路由配置 142 

6.3.5 Zuul和服务超时 143 

6.4 Zuul的真正威力:过滤器 144 

6.5 构建第一个生成关联ID的Zuul前置过滤器 147 

6.6 构建接收关联ID的后置过滤器 155 

6.7 构建动态路由过滤器 157 

6.7.1 构建路由过滤器的骨架 159 

6.7.2 实现run()方法 159 

6.7.3 转发路由 161 

6.7.4 整合 162 

6.8 小结 163 

第7章 保护微服务 164 

7.1 OAuth2简介 165 

7.2 从小事做起:使用Spring和OAuth2来保护单个端点 167 

7.2.1 建立EagleEye OAuth2验证服务 167 

7.2.2 使用OAuth2服务注册客户端应用程序 168 

7.2.3 配置EagleEye用户 171 

7.2.4 验证用户 172 

7.3 使用OAuth2保护组织服务 175 

7.3.1 将Spring Security和OAuth2 jar添加到各个服务 176 

7.3.2 配置服务以指向OAuth2验证服务 176 

7.3.3 定义谁可以访问服务 177 

7.3.4 传播OAuth2访问令牌 180 

7.4 JSON Web Token与OAuth2 183 

7.4.1 修改验证服务以颁发JWT令牌 184 

7.4.2 在微服务中使用JWT 188 

7.4.3 扩展JWT令牌 189 

7.4.4 从JWT令牌中解析自定义字段 191 

7.5 关于微服务安全的总结 193 

7.6 小结 195 

第8章 使用Spring Cloud Stream的事件驱动架构 196 

8.1 为什么使用消息传递、EDA和微服务 197 

8.1.1 使用同步请求-响应方式来传达状态变化 198 

8.1.2 使用消息传递在服务之间传达状态更改 199 

8.1.3 消息传递架构的缺点 201 

8.2 Spring Cloud Stream简介 202 

8.3 编写简单的消息生产者和消费者 205 

8.3.1 在组织服务中编写消息生产者 205 

8.3.2 在许可证服务中编写消息消费者 210 

8.3.3 在实际操作中查看消息服务 213 

8.4 Spring Cloud Stream用例:分布式缓存 214 

8.4.1 使用Redis来缓存查找 215 

8.4.2 定义自定义通道 221 

8.4.3 将其全部汇集在一起:在收到消息时清除缓存 222 

8.5 小结 223 

第9章 使用Spring Cloud Sleuth和Zipkin进行分布式跟踪 224 

9.1 Spring Cloud Sleuth与关联ID 225 

9.1.1 将Spring Cloud Sleuth添加到许可证服务和组织服务中 226 

9.1.2 剖析Spring Cloud Sleuth跟踪 226 

9.2 日志聚合与Spring Cloud Sleuth 227 

9.2.1 Spring Cloud Sleuth与Papertrail实现实战 229 

9.2.2 创建Papertrail账户并配置syslog连接器 230 

9.2.3 将Docker输出重定向到Papertrail 232 

9.2.4 在Papertrail中搜索Spring Cloud Sleuth的跟踪ID 234 

9.2.5 使用Zuul将关联ID添加到HTTP响应 235 

9.3 使用Open Zipkin进行分布式跟踪 237 

9.3.1 添加Spring Cloud Sleuth和Zipkin依赖项 238 

9.3.2 配置服务以指向Zipkin 238 

9.3.3 安装和配置Zipkin服务器 239 

9.3.4 设置跟踪级别 240 

9.3.5 使用Zipkin跟踪事务 241 

9.3.6 可视化更复杂的事务 243 

9.3.7 捕获消息传递跟踪 244 

9.3.8 添加自定义跨度 246 

9.4 小结 248 

第10章 部署微服务 250 

10.1 EagleEye:在云中建立核心基础设施 251 

10.1.1 使用亚马逊的RDS创建PostgreSQL数据库 253 

10.1.2 在AWS中创建Redis集群 257 

10.1.3 创建ECS集群 258 

10.2 超越基础设施:部署EagleEye 262 

10.3 构建和部署管道的架构 265 

10.4 构建和部署管道实战 268 

10.5 开始构建和部署管道:GitHub和Travis CI 270 

10.6 使服务能够在Travis CI中构建 270 

10.6.1 构建的核心运行时配置 273 

10.6.2 安装预构建工具 275 

10.6.3 执行构建 277 

10.6.4 标记源代码 277 

10.6.5 构建微服务并创建Docker镜像 279 

10.6.6 将镜像推送到Docker Hub 279 

10.6.7 在Amazon ECS中启动服务 280 

10.6.8 启动平台测试 280 

10.7 关于构建和部署管道的总结 282 

10.8 小结 282 

附录A 在桌面运行云服务 283 

附录B OAuth2授权类型 291 

更多微服务架构新书书单

扫码识别


本期荐书评奖规则

在本文下方留言,用30+个字符,说说你喜欢此书的理由。

我们会从留言用户中,按照留言点赞数,抽取排名在第3、9和第19名的3位幸运者,送出本期荐书1本。


开奖时间:6月5日当天(以当天小编开奖时看到的名次顺序为准)

未抽中的也可扫描文章中的二维码进行购买。


点击阅读原文,购买《Spring微服务实战》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK