异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
我们经常能接受技术分离作为一个组织的稳健做法——“我是存储人”或者“我是网络人”——但对很多人来说,首要任务就是只吃大象的一部分。在本书中,我会尽量将一些易懂的知识和新概念结合起来,让读者更容易理解。虽然可能你不想品尝大象的脚,但如果想成功地玩转云计算,最好在原理上知道它们是怎样工作的。
本节书摘来自异步社区《OpenStack实战》一书中的第1章,第1.6节,作者: 【美】V. K. Cody Bumgardner(V. K. 科迪•布姆加德纳)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
该法令签署120天后,美国宇航局(NASA)宣布它的开放政府框架,其中包括Nebula工具的共享。开发Nebula是为了加快向美国宇航局科学家和研究者提供IaaS资源的速度。与此同时,云计算提供商Rackspace宣布开源它的对象存储平台——Swift。
本节书摘来自异步社区《OpenStack实战》一书中的第1章,第1.4节,作者: 【美】V. K. Cody Bumgardner(V. K. 科迪•布姆加德纳)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
在本节中,读者将会了解OpenStack是如何与它控制的基础资源(计算、存储、网络等)关联起来的。如你所见,OpenStack通常不提供实际意义上的资源,它只是简单控制这些低层次的资源。图1-4展示了OpenStack是如何管理资源的提供者的,它们轮流被虚拟机使用。
组织选择私有云还是公有云通常取决于使用资源的规模和组织内部IT部门的职责范围。企业IT部门的职责如果是集中为其他部门提供技术架构和资源供给,部署私有云更有利。一个多租户(数据、配置和用户管理在逻辑上是租户间隔离的)、完全实现编排的私有云可以让企业IT部门成为私有云代理。
Docker的本质特性:我描述了Docker如何利用诸如Linux容器(LXC)技术保持容器与宿主机上运行的其他应用程序隔离或者如何有选择性地介入宿主机系统。
多种不同的Linux系统都提供了Docker。除了使用标准Linux系统(如Ubuntu、Fedora、Red Hat Enterprise Linux或者CentOS)来运行Docker外,还有专门用于容器部署的特定Linux系统。
Atomic Host系统提供了多种形式,以方便在不同环境中应用。可以下载Atomic qcow2镜像,并通过cloud-init注入配置信息(用户账号、主机名、配置文件等)的方式来配置它。对于CentOS Atomic,有用于快速启动CentOS Atomic虚拟机的Vagrant文件可用。
标准Linux:多个主要的Linux发行版已将Docker打包在其中。如需最新的Docker特性,只要安装相应Linux发行版的最新版本即可。切记,Docker与操作系统有着密切的联系,因此,Linux的早期版本可能并不包含Docker运行所需的全部特性。
通过将应用程序(以及应用程序运行所需要的全部东西)与运行该应用程序的宿主机解耦,Docker容器提供了一种简单、优雅的应用程序部署和运行方式。较之于将应用程序直接安装在宿主机上所获得的灵活性,Docker容器能够提供更大的使用灵活性。
由于围绕Docker和容器的开发节奏很快,现在任何书籍所能做的最好的就是将你带到一条正确的路上。本书中,这就意味着一开始会给出一套靠谱示例来说明当前Docker和精选的一组支持工具是如何工作的。之后,这条大路就会展示位于地平线上的新特性和新工具。
Linux发行版和应用项目在Docker Hub Registry上有官方的repository。除了Docker容器镜像本身,多数情况下,你也能在Docker Hub Registry上查找使用这些镜像的说明以及用来构建这些镜像的Dockerfile文件。
本书不仅介绍什么是Docker以及Docker的工作方式,还揭示了特定用途下扩展Docker的若干方法。尽管一个容器的创建和部署是很简单的,但要让多个容器协同工作、访问其他容器的资源,以及访问运行容器的宿主机的资源,则需要更高的复杂性。本书给出了几种创建和部署这些复杂容器集的不同方法。
在更新开创性的《Spring Recipes》的时候,我们很快发现,很长的时间实际上只有一个核心的Spring框架。尽管如此,SpringSource portfolio还是描述了多个框架,每个框架都远比其他产品中的竞争对手强大。
因为集合是Java的重要编程元素,Spring提供了多种集合标记,简化Bean配置文件中的集合配置。你可以使用集合工厂Bean或者在utility schema中的集合标记指定集合的更多细节,也可以将集合定义为多个Bean共享的单独Bean。
Spring允许你提取公用的Bean配置组成一个父Bean。从父Bean继承而来的Bean称作子Bean。子Bean从父Bean继承Bean配置,包括Bean属性和元素中的属性,避免重复配置。子Bean在必要时也可以覆盖继承的配置。
@Autowired注解还可以应用到一个字段,即使这个字段没有声明为Public。这样,你不能省略这个字段的设值方法或者构造程序的声明。Spring将通过反射把匹配的Bean注入这个字段。但是,用@Autowired注解非公开的字段将降低代码的可测试性,因为代码将很难进行单元测试(黑盒测试法无法使用模拟对象之类的方式操纵这一状态)。
已经看到,如果Spring找到超过一个候选的自动装配Bean,将会抛出UnsatisfiedDependency Exception异常。另一方面,如果自动装配模式设置为byName或byType,而Spring无法找到匹配的Bean进行装配,将把该属性保持为未设置状态,这可能导致一个NullPointerException异常或者一个值没有初始化。
为了要求Spring检查所有序列生成器实例上这些属性是否已经设置,你必须在IoC容器中注册一个RequiredAnnotationBeanPostProcessor实例。如果你打算使用Bean工厂,就必须通过API注册这个Bean后处理器,否则,只能在应用上下文中声明这个Bean后处理器的实例。
Spring的依赖检查功能能够帮助你检查在一个Bean上的所有特定类型属性是否都已经设置。你只要在的dependency-check属性中指定依赖检查模式就可以了。注意,依赖检查功能只能检查属性是否已经设置,而无法检查它们的值是否非空。表1-1列出了Spring支持的所有依赖检查模式。
Spring提供两个选项来克服基本集合标记的不足。选项之一是使用对应的集合工厂Bean,如ListFactoryBean、SetFactoryBean和MapFactoryBean。工厂Bean是用于创建其他Bean的特殊Spring bean。
你可能希望用Spring的工厂Bean在Spring IoC容器中创建Bean。工厂Bean(Factory bean)是作为创建IoC容器中其他Bean的工厂的一个Bean。概念上,工厂Bean与工厂方法非常类似,但是它是Bean构造期间可被Spring IoC容器识别的Spring专用Bean。
你可以用标记的type属性指定每个集合元素的数据类型,也可以用集合标记的value-type属性指定所有元素的数据类型。如果你使用Java 1.5或者更高版本,可以定义类型安全的集合,这样Spring将读取集合的类型信息。
如果Bean实例只用于一个特殊的属性,可以声明为内部Bean。内部Bean声明直接包含在或中,不设置任何id或者name属性。这样,这个Bean将是匿名的,无法在别处使用。实际上,即使为内部Bean定义id或者name属性,也将被忽略。
当你为Bean指定一个或者多个构造程序参数时,Spring将试图在Bean类中查找对应的构造程序,并且传递用于Bean实例化的参数。但是,如果你的参数可以应用到超过一个构造程序,可能在构造程序匹配中造成歧义。在这种情况下,Spring可能无法调用你所预期的构造程序。
假定你打算开发一个在线销售产品的购物应用程序。首先,你创建一个Product类,这个类有多个属性,比如产品名称和价格。因为商店中有许多类型的产品,所以你定义Product类为抽象类,用于不同产品子类的扩展。
概念上,数组(Array)近似于List,它也是一个排序和索引的集合,可以用索引访问。主要的不同在于数组的长度是固定的,不能动态扩展。在Java Collections框架中,数组和List可以通过Arrays.asList()和List.toArray()方法相互转换。
应用程序上下文提供比Bean工厂更高级的特性,同时保持基本特性的兼容。所以除非是资源有限的应用程序(例如运行于一个小脚本或者移动设备上),否则我们强烈推荐使用应用程序上下文。
Spring作为Java领域的第一开源项目,从其诞生到现在已有10个年头。10年的时间对于计算机业界来说是非常漫长的,在热闹的Java开源领域,无数个开源产品喧嚣登场,但又很快被人们淡忘。能够像Spring一样历经时间洗礼而历久弥香的开源框架真的是寥若星辰,Spring无疑是Java开源世界的一朵奇葩。
本章概述了Spring的发展历程,并用Spring MVC、Spring JDBC以及Spring的声明式事务等技术实现了一个常见的景区网站登录模块,让大家对如何使用Spring框架构建Web应用拥有了切身的体验,同时还了解了开发一个简单的Web应用所需要经历的开发过程。
在IDEA中运行Web应用前,首先需要配置好Web应用服务器,这里使用Maven的Web容器插件运行应用。打开当前模块pom.xml文件,添加构建插件配置信息,如代码清单1-21所示。
业务层和持久层的开发任务已经完成,该是为程序提供界面的时候了。Struts MVC框架由于抢尽天时地利,成为当下最流行的展现层框架。但也有很多人认为Spring MVC相比较于Struts更简单、更强大、更优雅。
在实际应用中,一般不会直接在数据库中以明文的方式保存用户的密码,因为这样很容易造成密码泄密的问题。所以需要将密码加密后以密文的方式进行保存;另外一种更有效的办法是仅保存密码的MD5摘要,由于相等的两字符串摘要值也相等,在登录验证时,通过比较摘要的方式就可以判断用户所输入的密码是否正确。
在编写DAO接口的实现类时,大家也许有一个问题:在以上两个DAO实现类中都没有打开/释放Connection的代码,DAO类究竟如何访问数据库呢?前面说过,样板式的操作都被JdbcTemplate封装起来了,JdbcTemplate本身需要一个DataSource,这样它就可以根据需要从DataSource中获取或返回连接。
配置了主工程模块 chapter 及第 1 章子模块chapter1 的模块信息之后,单击 IDEA 工程右边的Maven Projects 选项卡,弹出Maven项目的管理窗口。IDEA提供了非常友好的Maven项目管理界面,如图 1-9 所示,单击管理窗口中的刷新按钮,可以列出当前所有的Maven模块。
Spring拥有持久层、业务层和展现层的“原生技术”,分别是Spring JDBC、声明式事务和Spring MVC。为了充分展现Spring本身的魅力,在本章中仅使用Spring的这些原生技术,在以后的章节中,我们将学习其他的持久层和展现层技术,只要用户愿意,就可以平滑地将其过渡到其他技术实现中。
数据访问领域在过去的7年间发生了重要的变化。过去30年间一直占据企业级数据存储和处理核心位置的关系型数据库已经不能再独领风骚了。在过去的7年间诞生了很多可选的数据存储形式,当然也有的面临着消亡,它们被使用到了带有关键任务的企业级应用程序之中。
在3.0版本中,Spring工具套件(Spring Tool Suite,STS)提供了与Spring Data Repository抽象进行集成的功能。STS为Spring Data所提供的核心支持是查找方法的查询衍生机制。
到目前为止,我们看到了带有查询方法的Repository接口,这些查询有的是从方法名中衍生出来的,有的是手动声明的,这取决于Spring Data为实际存储类型所提供的使用方式。为了衍生出这些查询,我们必须扩展Spring Data的特定标识接口:Repository。
如果查询所返回的结果数量增长很明显,那么分块访问数据就很有意义了。为了做到这一点,Spring Data提供了可与Repository一起使用的分页API。要读取哪一块数据的定义隐藏在Pageable接口及其实现PageRequest之中。
长期以来,实现应用程序的数据访问层一直是件繁琐的工作,因为我们经常需要编写大量的样板式代码,而且贫血(anemic)的领域类并没有按照真正面向对象或领域驱动方式来进行设计。因此Spring Data Repository抽象的目标就是大幅简化各种持久化存储持久层的实现。
接下来,必须加入Spring Data JPA模块的JPA支持以启用finder方法以及版本库的错误检查功能。只需要右键单击该模块并选择“Add Framework Support”项,在弹出的对话框中勾选JavaEE持久化的支持并且选择Hibernate提供的持久化支持,如图1-9所示。
为了说明各种Spring Data模块的用法,我们会使用电子商务部门的示例领域(如图1-1所示)。由于各种NoSQL数据存储通常具有特定的功能和适用场景,在个别章节会对领域的实现方式做出一些调整,甚至只有它的部分实现,这种做法不代表必须以一种特定的方法来实现领域,而是强调某些存储应该更适用于特定的应用场景。
大部分的NoSQL Java API并未支持将领域对象映射到存储的数据抽象(MongoDB中的文件,Neo4j中的节点与关系)。因此,当使用原生的Java驱动程序进行读取和写入操作时,通常需要编写大量的代码来将数据映射到应用程序的领域对象。
现在,已经过去了很多年,Spring也发布了众多的版本,我们可以看到Spring在企业级应用开发领域已经有了巨大的影响力。对于无数的Java项目来说,它就是事实上的标准,并且对于一些规范和它本来想取代的框架,Spring也对其演进产生了影响。
在工作的过程中,我发现我们在学校里面学到的很多东西比较片面肤浅,根本达不到岗位的要求。像编码规范、研发流程等学校里几乎不提及的知识,在实际的软件开发项目中却恰恰是异常的重要。
我同时建议尽可能使用自动化配置,以避免显式配置所带来的维护成本。但是,如果你确实需要显式配置Spring的话,应该优先选择基于Java的配置,它比基于XML的配置更加强大、类型安全并且易于重构。在本书中的例子中,当决定如何装配组件时,我都会遵循这样的指导意见。
关于混合配置,第一件需要了解的事情就是在自动装配时,它并不在意要装配的bean来自哪里。自动装配的时候会考虑到Spring容器中所有的bean,不管它是在JavaConfig或XML中声明的还是通过组件扫描获取到的。
用来装配bean的最基本的XML元素包含在spring-beans模式之中,在上面这个XML文件中,它被定义为根命名空间。是该模式中的一个元素,它是所有Spring配置文件的根元素。在XML中配置Spring时,还有一些其他的模式。