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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

异步社区 2018-05-10 16:24:36 浏览3648

​​​点击关注异步图书,置顶公众号

每天与你分享IT好书 技术干货 职场知识


9ccc0ca9gy1fr69wv92r6j20u00f0dh2.jpg

​参与文末话题讨论,每日赠送异步图书。

——异步小编

​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的珍贵资料。

9ccc0ca9gy1fr69ywk9tlj208c0af0tm.jpg

​(点击此处购买)

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阐示了这个应用程序的基本架构。

9ccc0ca9gy1fr6a09z1aoj20dw0fo74y.jpg

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

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

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

9ccc0ca9gy1fr6agp3kd3j20dw0dm3zb.jpg

​ 图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微服务将会如何处理用户请求的一般流程。​

9ccc0ca9gy1fr6a1pl4p2j20dw0990ta.jpg

​图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微服务

package com.thoughtmechanix.simpleservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.bind.annotation.PathVariable;
@SpringBootApplication  ⇽--- 告诉Spring Boot框架,该类是Spring Boot服务的入口点
@RestController  ⇽--- 告诉Spring Boot,要将该类中的代码公开为Spring RestController类
@RequestMapping(value="hello")  ⇽--- 此应用程序中公开的所有URL将以/ hello前缀开头
public class Application {
   public static void main(String[] args) { 
        SpringApplication.run(Application.class, args);
  }
    @RequestMapping(value="/{firstName}/{lastName}",  ⇽---  Spring Boo公开为一个基于GET方法的REST端点,它将使用两个参数,即firstName和lastName
     method = RequestMethod.GET)
   public String hello( @PathVariable("firstName") String firstName,   ⇽--- 将URL中传入的firstName和lastName参数映射为传递给hello方法的两个变量
     @PathVariable("lastName") String lastName) { 
        return String.format("{\"message\":\"Hello %s %s\"}",  ⇽--- 返回一个手动构建的简单JSON字符串。在第2章中,我们不需要创建任何JSON
         firstName, lastName);
        }
    }

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

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

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

mvn 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所示的内容。

9ccc0ca9gy1fr6a4cvx2xj20dw06uq3r.jpg

​图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是一门强大的编程语言,但与其他编程语言相比,它却获得了啰嗦冗长的名声。

9ccc0ca9gy1fr6a4p4v09j20dw0720tc.jpg

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

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


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

9ccc0ca9gy1fr6a52yf21j208c0af0tm.jpg

《Spring微服务实战》

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

京东购书    当当购书  异步社区购书

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

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

更多微服务构架新书书单

9ccc0ca9gy1fr6a766e93j207s07sq2p.jpg

点击查看或者扫码识别

​今日话题

5月异步新书你最期待哪一本?为什么?截止时间5月14日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版100元异步社区代金券,(留言点赞最多的自动获得一张)。异步图书后台回复“5月新书”进入新书交流群,获得第一手新书信息,点击此处直接参加活动

9ccc0ca9gy1fr5d068t8xg20hs01pt93.gif

​推荐阅读

2018年5月新书书单(文末福利)

2018年4月新书书单

异步图书最全Python书单

一份程序员必备的算法书单

第一本Python神经网络编程图书

9ccc0ca9gy1fqyf4q8tctj209k09k744.jpg

​长按二维码,可以关注我们哟

每天与你分享IT好文。


在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步e读版图书一本。赶紧来参加哦!

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

​阅读原文