面向资源的架构(ROA)概述

【注】本文译自: Overview of Resource-Oriented Architectures (ROA) | Developer.com

了解面向资源的架构 (ROA)、其价值以及最佳实践。

  面向服务的架构 (Service-Oriented Architecture,SOA) 和面向资源的架构 (Resource-Oriented Architecture,ROA) 是用于实现健壮、可扩展的分布式应用程序架构的架构设计模式。分布式架构由通过定义良好的接口在网络上使用的组件组成。在 ROA 中,这些组件被称为资源,而在 SOA 中,它们被称为服务。本文概述了面向资源的体系结构。

什么是面向资源的架构 (ROA)?

  面向资源的架构 (ROA) 是一种架构风格,它扩展了 REST 架构风格,并提供了更广泛、可扩展、灵活且与传输无关的架构。面向资源的架构 (ROA) 范式建立在资源的概念之上。资源是一个独立的、可识别的实体,其状态可以被分配一个统一的资源定位符 (URI)。服务代表所请求操作的执行,而资源代表可通过一致的标准化接口进行管理的分布式组件。
  面向资源架构的特征之一是与传输无关。因此,必须有特定的机制将面向资源的服务暴露给外部世界。当消费者请求统一资源定位器(Uniform Resource Locator,URL)并指定访问方法(例如,GET、PUT、POST 和 DELETE)时,该 URL 将转换为相对的内部 URI。访问方法被转化为动作。
  面向资源的架构仅围绕四个概念建模:

  • 资源
  • URI
  • 表述
  • 链接和连通性

  以下是面向资源架构的四个属性:

  • 可寻址性
  • 无状态性
  • 连通性
  • 统一的接口

面向资源的架构:资源

  资源是 ROA 的基石;资源是信息的逻辑表示。例如,学生是数据点的抽象集合,可以用多种方式表示,包括 XHTML、JSON 和 XML。 资源名称包括以下内容:

  • 资源的类型
  • 资源标识符
  • 父元素的资源名
  • API 服务的名称

  资源是 REST 或 RESTful 架构中最重要的信息抽象。术语“资源”是指任何可识别的信息。这些信息可以是文档、计算机、汽车、临时服务(例如“俄亥俄州今天的天气”)、其他资源的集合、个人、学生等。
  每个不可变资源表示都可以通过相对的统一资源指示符 (URI) 来标识,它可能包括到其他资源以及其他不可变资源的连接。请注意,一个资源也可以有多个 URI。
  每种资源应具有以下特征:

  • 是唯一的
  • 必须至少有一个表述
  • 具有属性,模式可以被访问并提供上下文

统一资源标识符(URI)

  统一资源标识符 (Uniform Resource Identifier,URI) 是包含资源名称和地址的字符序列,用于标识逻辑或物理资源。请注意,资源必须具有一个或多个 URI。 没有 URI,一条信息不被视为资源,因为它不能被引用或访问。 您可以使用 URI 来标识任何事物,例如现实世界的对象、网页、书籍等。
  下面是一个 URI 的例子:语法::示例:http://payroll/employee/1234 下表说明了如何指定资源的相对 URI:

  • 动作
    相对 URI
    目的
  • Read
    /student/3
    读取 ID 是 3 的学生记录
  • Delete
    /student/4
    删除 ID 是 4 的学生记录

面向资源架构ROA的特性

  以下是面向资源的架构的四个基本属性:

可寻址性

  可寻址性是面向资源架构的一个基本特征。如果应用程序将其数据集的感兴趣方面发布为服务端点,则可以认为该应用程序是可寻址的。这些服务可以反过来用于处理应用程序的数据。由于 ROA 中的资源使用 URI 公开,因此应用程序应使用 URI 公开其数据。

无状态

  无状态是面向资源架构的另一个特征,这意味着该架构中的每个 HTTP 请求都是独立发生的。换句话说,当客户端向服务器请求资源时,客户端必须提供服务器请求成功所需的所有信息。服务器从不存储来自先前请求的信息,也就是说,服务器上不存储状态信息。如果服务器需要来自较早请求的信息来处理请求,则客户端必须在另一个请求中再次发送该信息。

连通性

  在面向资源的架构中,表述是超媒体:包含数据和其他资源链接的文档。RESTful Web 服务遵循超媒体作为应用程序状态引擎 (Hypermedia As the Engine Of Application State, HATEOS) 原则。这是数据格式影响应用程序中转换状态的原则。到其他资源的链接嵌入在响应中,但对于相同的资源,它们可能会根据其当前状态而有所不同。
  网络最重要的特征之一是它的互连性。也就是说,互联网上的几乎所有信息都通过超链接链接在一起。超链接可用于将互联网上可访问的任何资源连接到另一个资源。基于 ROA 构建的应用程序应将其所有资源相互链接,反之亦然。当我们为资源选择合适的表述时,我们可以在应用程序中实现连通性。

统一接口

  您应该有一组定义良好的方法来操作应用程序中的资源。例如,HTTP 提供了以下您可能通常需要在任何应用程序中执行的常见操作:

HTTP GET – 获取一个资源

HTTP POST – 创建新资源

HTTP PUT – 修改一个存在的资源

HTTP DELETE – 删除一个存在的资源

HEAD 和 OPTIONS HTTP 方法

  下面是您应该了解的另外两个重要的 HTTP 方法:

HTTP HEAD – 用于检索资源的元数据表述

HTTP OPTIONS – 用于检查特定资源支持哪些 HTTP 方法

总结

  面向资源的体系结构是无状态的,并以资源为中心。URI 用于标识每个资源。您总是可以在计算机上同时拥有同一资源的多个副本。一个资源也可以有多个 URI。

软件库与框架的区别

【注】本文译自:https://www.theserverside.com/tip/Library-vs-framework-How-these-software-artifacts-differ

  库与框架:这两个软件构件的区别库(Libraries)是提供特定功能(如建立网络连接)的低级组件。框架(Framework)是已知的编程环境,比如 Spring Boot。
  当软件主管开始构建新的企业应用程序时,他们必须决定要使用哪一组库和框架。 这引出了一个明显的问题:软件库和框架之间有什么区别?
  库和软件框架都有助于应用程序的开发。但是,两者之间的主要区别在于它们的任务范围,以及它们减轻开发人员编写代码负担的方式。
  库提供了开发人员可以调用来执行特定功能的组件、类和方法。相比之下,框架提供的代码已经执行了通常需要的功能,并在需要定制功能时调用开发人员提供的代码。

库与框架

  库是一组相关的低级组件,开发人员调用这些组件来实现特定结果。常用库函数包括日期格式化和建立网络连接。
  框架处理更高级别的问题。框架提供了一个既定的编程环境,它本身建立在低级库之上。
  例如,框架可能会处理如何最好地将应用程序中的所有对象映射到相关数据库中的表中。它还可以处理如何向最终用户提供丰富的、基于 Web 的体验。

软件库示例

  一个库的例子是 Java 日期和时间 API。它是一组定义属性和方法的类和接口,开发人员可以使用这些属性和方法来格式化日期、执行时区转换并提供全局日历支持。Java 开发人员在需要时实例化 Date 和 Time 类,并以他们认为合适的任何方式调用库的方法。
  另一个 Java 库示例是流行的 java.net 网络 I/O 包。该库由数十个类和接口组成,开发人员使用这些类和接口来打开网络端口、处理传入连接并将数据发送到互连的客户端。
  只需要使用 java.net 包,软件开发人员就可以实现处理基于 REST 的 Web 服务或通过 HTTP 协议的基于 HTML 的请求-响应循环所需的所有必要逻辑。java.net 库提供了一组低级 API,任何开发人员都可以使用这些 API 来开发通过网络进行通信的应用程序。

流行的 Java 库

  其他流行的 Java 库,包括已经利用了 Java 框架的 Spring Boot、JHipster 或 Vaadin 等 的库,包括:

  • Apache Commons Math
  • BouncyCastle for cryptography
  • Java Advanced Imaging
  • Java Speech
  • Java 3D
  • JavaMail
  • Joda-Time
  • Apache Collections
  • Jackson for JSON and XML
  • Java Networking

软件框架的作用

  企业项目通常需要开发人员提供一组 RESTful API,以便外部客户端与在线应用程序集成。然而,许多开发人员不仅解决了如何使用低级 java.net 库来处理 RESTful API 调用的问题,而且还将他们的工作作为开源项目来分享。这是软件框架的本质。它是一个现有项目,解决了一个常见且具有挑战性的问题,开发人员可以在自己的项目中使用它。

  框架是解决常见且具有挑战性的问题的现有项目,开发人员可以在自己的项目中使用它。

  在给定的问题域中,通常有许多框架可供选择。在 Java 生态系统中,有许多流行的框架使用标准的 Java 和 Jakarta EE 库来解决如何最好地处理基于 REST 的请求-响应周期的问题,包括:

  • Spring Boot
  • Jersey
  • RESTEasy
  • Restlet
  • Micronaut
  • Apache CFX
  • JAX-RS

框架有观点

  将框架与库区分开来的另一个关键特征是后者通常包括关于如何解决给定问题、问题的范围以及如何以最有效和最有效的方式解决框架目标的观点。
  框架将在各种非功能性需求上展开竞争,例如易用性、性能、可插入性和兼容性。

框架和控制反转

  最后,库和框架之间的一个关键区别因素是两者之间的相对控制反转 (IoC)。IoC 通常被称为好莱坞原则。与库不同,框架对开发人员编写的代码采取“不要打电话给我们,我们会打电话给你”的方法。
  要使用库开发应用程序,开发人员必须实例化库组件并调用其中存在的类和接口的方法。例如,如果开发人员想要使用 java.net 库来创建他们自己的 RESTful 应用程序,他们将需要调用各种 API 来打开端口、处理 HTTP 连接、将数据格式化为 XML 或 JSON 表示形式来回通信,以及当客户端发起请求时发起一个请求。
  另一方面,框架负责支持项目核心功能所需的所有底层管道。只有在需要时,框架才会调用开发人员提供的代码。

IoC 和 Spring Boot

  用 Spring Boot 编写的 RESTful Web 服务很好地体现了 IoC 的好莱坞原则。
  使用 Spring Boot RESTful Web 服务,开发人员只需编写在发生基于 HTTP 的 GET 调用时要执行的逻辑。当 GET 调用发生时,Spring Boot 框架会处理它,解释它,将数据交换格式转换为 JSON 或 XML,然后将 RESTful 请求路由到开发人员的业务逻辑。
  开发人员只需要编写业务逻辑。由框架决定何时调用业务逻辑。
  IoC 框架在 Java 中很常见。以下是十个常见的例子。

  • Hibernate
  • Struts
  • JavaServer Faces
  • Play for Scala
  • Vaadin
  • JHipster
  • JRuby
  • JUnit
  • Quarkus
  • Grails

框架和库一起使用

  虽然框架和库有不同的功能,但它们都可以帮助开发者完成更多工作。当许多常见的编程挑战已经被解决并以许可的开源项目的形式被共享时,没有软件专业人员愿意浪费时间重复发明轮子。
  每当您启动一个新的软件开发项目时,选择一个已被证明和建立的软件开发框架非常重要。同时,与您的个人开发和设计理念保持一致。在极少数情况下,特定的情况超出了所选框架的范围,标准库总是在那里帮助您的开发人员弥合差距。

面向服务体系结构的领域驱动设计

【注】本文译自:https://www.thoughtworks.com/insights/blog/domain-driven-design-services-architecture
  这篇文章是关于软件设计的选择。特别是大型系统,这些系统可能会以服务端点的形式分为多个可部署的对象。我不会特别谈论服务端点设计,但是我想讨论创建多个服务应用的构思阶段。

  当我们面对复杂的问题时,我们通常试图理解复杂的单个部分。通过分解问题,我们将其变成为更易于理解和管理的部分。
  正如在许多产品/项目管理周期中所描述的,对于现实生活中的问题,这通常是由本能驱动的。 我们不会使用公式来了解去一个需要签证的国家需要做什么。我们知道我们需要签证才能旅行,我们慢慢掌握需要的文件文件,需要填写哪些表格以及如何填写这些表格。当我们执行其中一个步骤时,我们不会将流程的所有细节都牢记在心,而只是要做手头的任务。这与要完成的任务的大小有关。潜在的真实标准是关于时间或进度、我们的执行力、我们的认知能力及其与任务熟悉程度的关系,甚至可能是执行这些任务的物理位置( 领事馆与 Photoshop 等)。
  在软件开发领域并没有什么不同。多年来,瀑布式的配方已被应用到软件开发过程中,最终,主要是基于启发式和基于经验的评估技术(计划扑克、T – 恤尺寸)和敏捷过程。在现实生活中,我们试着不去详述整个过程,而是通过观察我们的最新表现来尝试和理解整个旅程。
  同样适用于我们针对问题建模的软件。我们开始将它们分解为不同的应用的是方便管理单个应用,以更少的依赖关系更快地开发和部署,最后带来更多的技术选择自由。我们意识到,我们无法制定出适合所有人的完整流程。我们着眼于各个部分,并认识到我们在设计模式或技术方面的集体经验,并尝试应用其中最好的选择。
  理解和解决复杂性的一个有趣的软件设计技术是领域驱动设计(DDD)。领域驱动设计提倡基于与我们的用例相关的业务现实进行建模。由于 DDD 方法现在已经过时,而且宣传水平正在下降,我们许多人都忘记了 DDD 方法确实有助于理解手头的问题,并朝着对解决方案的普遍理解来设计软件。在构建应用DDD 会以域和子域的形式讨论的问题。它将问题的独立步骤/领域描述为边界上下文,强调使用一种通用语言来讨论这些,并添加了许多技术概念,如实体、值对象和聚合根规则以支持实现。有时,这些技术规则被视为是实施 DDD 的硬障碍,但最终,人们往往会忘记重要的部分是根据业务问题组织代码工件,并使用与(1)相同的通用语言。

设计为服务应用的边界上下文

  我想谈论的架构风格与微服务非常相似。它是关于将单体应用分离为多个独立的服务应用,或者从一开始就在边界上下文(DDD概念)的帮助下单独开发它们。
  有许多资源都强调了微服务叙述中更细粒度的服务的优点。越来越多的文章、博客和其他内容是关于陷阱和在向细粒度服务过渡之前或过渡期间应该拥有的安全网的。我将尽量不重复微服务或其他支持元素的好处,这些是迁移到这样的体系结构中所需要。我不想强调结果服务的“小型”性质,而是想强调如何通过应用领域驱动的设计概念来更好地分离这些服务。
  让我们使用一个真实的示例来实现我们的想法-借记卡/信用卡获取域。这个领域可以(不幸的是,很多时候都是这样)作为一组单体应用来实现。我们拥有多个应用的唯一原因是由于不同的应用中的存在严格的技术限制(例如希望执行批处理)。

  我所看到的大多数成功的架构都认识到,通过数据库进行集成是一种糟糕的实践,因为它使技术应用和业务职责之间的界限变得模糊,使业务逻辑泄漏到数据库中,并通过添加更多的应用服务器来阻止水平扩展。因此,以单体应用的的服务集成的形式发展到更好的架构。

  现在,应用之间的界限更加清晰了。但是,您可以看到,仍然存在隐藏的数据库交互,这一次是在各个应用内部发生的。我称它们为隐藏的,因为通常一开始它们通常很难被注意到。随着时间的流逝,代码的纠缠将使原先分离的业务流程人为地关联起来,并在业务开发中引入更多的摩擦,因为这种共置托管需要联合部署单独的功能,这可能会减慢速度。
  如果您幸运地有一个领域模型来指导的话,则领域建模可帮助您识别和分离复杂的实现。如果您还没有现有应用的域模型(在大多数情况下通常是这样),则无需遍历代码以了解不同的职责,而是构建域模型并将功能映射到手边的应用可能是一个更好的方法。这既能节省时间,又能避免被细节淹没的风险。此外,如果业务与开发团队之间存在差距(这可能是域模型最初不存在的主要原因),那么讨论域模型并映射到现有应用的功能将有助于缩小这一差距。

  我们设计演进的下一步是将域边界分离反映到我们的架构以及边界上下文中。一个域具有多个边界上下文意味着在同一域中可以有多个服务应用运行。有了适当的域模型,潜在的分离点就更可见了,这使我们可以从潜在的更细粒度的应用中受益(诸如单独发行和版本控制的好处,具有更多功能驱动的纯服务端点的潜力等,其中大多数已经在微服务文章中进行了讨论)。尽管许多微服务讨论都围绕技术不可知论和开发规范(避免/破坏整体),但对于我们大多数人所从事的应用而言,非常有价值的一项是领域和设计方面。一旦过渡到微服务架构(借助域模型),DDD 和更细粒度的服务便可以协同工作、相互支持。

  这还将为团队提供一定程度的独立性,更完善的服务功能以及更分离的交互,如许多微服务文章所述.
  同样,从我们的示例信用卡付款获取域中可以看出,这并不是我们的服务可以做到的最细粒度的分离。相反,这是在我们的领域知识所指导下最有意义的分离。重点不是规模,而是业务能力。我相信这是“正确的 SOA”,正如许多圈子所说的那样。

领域驱动设计(DDD)

【注】本文译自: https://www.geeksforgeeks.org/domain-driven-design-ddd/

  领域驱动设计(Domain-Driven Design)是程序员 Eric Evans 于 2004 在他的《 领域驱动设计:解决软件核心中的复杂性》一书中提出的一个概念。
  这是一种自顶向下的软件设计方法。首先,让我们尝试重点介绍一下在这种情况下领域的含义。

什么是领域?

  在软件开发的上下文中,“域”指的是业务。在应用程序开发过程中,通常使用术语域逻辑或业务逻辑。基本上,业务逻辑是应用程序逻辑所围绕的知识领域。 应用程序的业务逻辑是一组规则和指导原则,用于解释业务对象应如何相互交互以处理建模数据。
注意:
  软件工程领域的领域是要在其上构建应用程序的业务。

领域驱动设计:

  假设我们的软件已经使用了所有最新技术堆栈和基础设施,这样的软件设计架构非常棒,但是当我们在市场上发布这个软件时,最终还是要由最终用户来决定我们的系统是否优秀。另外,如果系统不能解决业务需求,对任何人都没有用处;不管它看起来有多漂亮,或者它的基础设施有多好。根据 Eric Evans 的说法,当我们在开发软件时,我们的重点不应该主要放在技术上,而应该主要放在业务上。记住:

“客户的工作不是知道他们想要什么“—史蒂夫·乔布斯

  领域驱动设计涉及两种设计工具,一种是战略设计工具,另一种是战术设计工具。程序员或开发人员通常处理战术设计工具,但如果我们有战略设计工具的知识和良好的理解,它将帮助我们构建好的软件。
  Spring 数据家族下的大多数框架都是根据领域驱动的设计方法构建的。

战略设计:

  战略设计工具帮助我们解决所有与软件建模相关的问题。它是一种类似于面向对象设计的设计方法,在面向对象设计中,我们被迫从对象的角度思考问题。在战略设计方面,我们被迫从环境的角度来思考。

上下文(Context):

  我们可以把这个词看作是一个英语单词,它指的是某一事件、事件、陈述或想法的情况,它的意思可以根据这些情况来确定。
  除了上下文之外,战略设计还讨论了模型、泛在语言和边界语境。这些是领域驱动设计的战略设计中常用的术语。让我们逐一理解。

  • 模型:
      充当核心逻辑并描述领域的选定方面。它用于解决与该业务有关的问题。
  • 通用语言:
      所有团队成员使用的一种公共语言,用于连接团队围绕领域模型的所有活动。与领域专家和团队成员交谈时,可以将其视为对类、方法、服务和对象使用通用动词和名词。
  • 边界上下文:
      指的是上下文的边界条件。它是对边界的描述,并充当一个阈值,在这个阈值中定义并适用于特定的域模型。

    战术设计:

      战术设计讨论实现细节,即建模领域。它通常会处理有界上下文中的组件。我们可能听说过或使用过诸如服务、实体、存储库和工厂之类的东西。它们都是通过域驱动设计创造并流行的。战术设计过程发生在产品开发阶段。
      让我们讨论一些重要的战术设计工具。 这些工具是高级概念,可用于创建和修改域模型。

    1. 实体:
        基于面向对象原则工作的程序员可能知道类和对象的概念。在这里,实体是具有某些属性的类。这些类的实例具有全局标识,并且在整个生命周期中都保持相同的标识。请记住,属性状态可能会发生变化,但身份永远不会改变。简而言之,实体可以实现一些业务逻辑,并且可以使用 ID 进行唯一标识。在编程的上下文中,它通常在 DB 中作为行持久保存,并且由值对象组成。
    2. 值对象:
        它是不可变的轻量级对象,没有任何标识。值对象通过执行复杂的计算,将繁重的计算逻辑与实体隔离开来,从而降低了复杂性。

        在上图中,User 是一个实体,Address 是一个值对象,地址可以更改很多次,但用户的身份证号永远不会更改。每当地址更改时,都会实例化一个新地址并将其分配给用户。
    3. 服务:
        服务是无状态的类,可以适合实体或值对象以外的其他地方。简而言之,服务是一种功能,存在于实体和值对象之间的某个位置,但它既不与实体相关,也不与值对象相关。
    4. 聚合:
        当我们有更大的项目时,对象图也变得更大,更大的对象图更难维护。聚合是位于单个事务边界下的实体和值的集合。基本上是聚合,控制变化,有一个根实体叫做聚合根。根实体以聚合的方式管理其他实体的生命周期。

        在上面的示例中,如果根实体 UserOrder 被删除,则与该根实体关联的其他实体将毫无用处,并且该关联的信息也将被删除。这意味着聚合在本质上总是一致的,这是在域事件的帮助下完成的。生成域事件是为了确保最终的一致性。
        在上面的例子中,如果用户的地址已经改变,那么它必须同样反映在订单上。为此,我们可以触发一个从 User 到 Order 的域事件,以便 Order 更新地址,这样我们就有了最终的一致性,Order 也将最终一致。
        聚合和聚合根的其他例子可以是对帖子的评论、问答细节、银行事务细节等。ORM 工具如 hibernate 在创建一对多或多对一关系时使用了大量聚合。
    5. 工厂和存储库:
        工厂和存储库用于处理聚合。工厂帮助管理聚合生命周期的开始,而存储库帮助管理聚合生命周期的中间和末端。工厂帮助创建聚合,而存储库帮助持久化聚合。我们应该总是为每个聚合根创建存储库,而不是为所有实体创建存储库。
        工厂是 GoF 的设计模式,工厂是有用的,但在聚合规则的上下文中不是强制性的。

      领域驱动设计的优点:

  • 提高了我们的技艺
  • 提供了灵活性
  • 更倾向于域而不是接口
  • 通过通用语言减少了团队之间的沟通差距

    领域驱动设计的缺点:

  • 需要一个具有很强领域专业知识的专业人员
  • 鼓励团队遵循迭代实践

三大业界大佬的DevOps解决方案

  DevOps 在商业界的一些解决方案,主要包括:

  1. 微软公司的 Azure DevOps
  2. 亚马逊公司的 Aws DevOps
  3. 阿里云的 云效 DevOps

Azure DevOps


  Azure DevOps 也称为 Microsoft Visual Studio 团队服务(VSTS)。它是为云构建的一组协作开发工具。 VSTS 通常被用作独立术语,Azure DevOps 是一个由几种不同产品组成的平台,例如:

  • Azure 测试计划
  • Azure 看板
  • Azure 存储库
  • Azure 流水线
  • Azure 制品

  Azure DevOps是将创意转化为工作软件所需的一切。您可以使用 Azure 工具计划项目。

  Azure 流水线是 Azure DevOps 的 CI 组件。Azure 流水线是微软的云原生连续集成服务器,它使团队可以从云中连续构建、测试和部署所有组件。Azure 流水线可以连接到任意数量的源代码存储库,例如 Azure Repos、GitHub、Tests,以获取代码和制品以进行应用交付。

Azure DevOps 服务器

  Azure DevOps Server 是微软的一个产品,提供版本控制、需求管理、报告、软件库管理、项目管理、测试、自动生成和发布管理功能。它涵盖了应用的整个生命周期,并启用了 DevOps 功能。
  Azure DevOps 可以用作众多集成开发环境的后端,但针对 Microsoft Visual Studio 和 Eclipse 的所有平台上进行了定制。

Azure DevOps 服务

  微软宣布在 Microsoft Azure 平台上发布该软件即 Visual Studio 的服务产品,当时微软将其称为在线Visual Studio。

  微软为 Azure DevOps 服务提供了 Visual Studio,基本和利益干系人访问级别。基本计划是免费的,最多可容纳五个用户。订阅了 Visual Studio 的用户可以免费添加到项目中。

AWS DevOps

  AWS 是最好的云服务提供商,DevOps 是软件开发生命周期的实现。

  以下是使 AWS DevOps 成为非常受欢迎的组合的一些原因,例如:

  • AWS CloudFormation
  • AWS EC2
  • AWS CloudWatch
  • AWS CodePipeline

  让我们简要地看一下这些,例如:

AWS CloudFormation


  与开发团队相比,DevOps 团队需要更频繁地创建和发布云实例和服务。诸如 EC2 实例,ECS 容器和 S3 存储桶之类的 AWS 资源模板使您可以设置整个堆栈,而不必将所有内容放在一起。

AWS EC2

  您可以在 EC2 实例中运行容器。因此,您可以利用 AWS 安全和管理功能。

  Amazon EC2 提供最广泛、最深入的实例选择,这些实例构建于最新的计算、存储和网络技术,进行了高性能和安全设计。

AWS CloudWatch


  该监控工具可跟踪 AWS 必须提供的所有资源。轻松使用第三方工具进行监视,例如sumo logic 等。

AWS CodePipeline


  代码流水线是 AWS 的一项重要功能,它极大地简化了你管理 CI / CD 工具集的方式。它与 Jenkins、GitHub 和 CodeDeploy等工具集成,使你可以直观地控制从构建到生产的应用更新流程。

云效 DevOps


  阿里云云效,云原生时代新 DevOps 平台,支持公共云、专有云和混合云多种部署形态,通过云原生新技术和研发新模式,助力创新创业和数字化转型企业快速实现研发敏捷和组织敏捷,打造“双敏”组织,实现 10 倍效能提升。

项目

一站式项目管理

  以项目为维度,管理需求、任务、缺陷、迭代、里程碑、风险和文档。大型项目管理
  支持父子项目以分级管理战略专题项目,支持项目集合以联合管理双十一等大型协作项目。

快速迭代项目管理

  支持Scrum、看板等多种敏捷实践。

应用

应用全生命周期管理

  以应用为单位,申请、创建和配置软件运行所需资源、环境和中间件服务,提供变更、发布、监控和运维等应用全生命周期管理服务。

多种部署运行方式

  支持Docker等多种部署运行方式

交付

持续交付流

  多人协作开发集成、多种编程语言构建打包和分布式集群部署发布等服务。

质量与安全保障

  轻松搭建从代码提交、集成、构建到测试环境、预发环境、线上环境部署发布验证的持续交付流水线,质量和安全层层把关。

运营

用户反馈跟踪

  用户反馈秒级必答,产品知识智能回复。

产品动态监测

  问卷调查和舆情监测,把握产品动态。

数据驱动优化

  分析研发和运营数据,数据驱动效能提升和产品优化创新。

ELK 教程 – 高效发现、分析和可视化你的数据

【注】本文译自:https://www.edureka.co/blog/elk-stack-tutorial/

  随着越来越多的 IT 基础设施转身云计算,对公共云安全工具和日志分析平台的需求也在迅速增加。不管组织的规模有多大,每天都会生成大量的数据。这些数据中有相当一部分是由公司的 Web 服务器日志组成的。日志是最重要的信息来源之一, 但往往被忽视。每个日志文件都包含一些宝贵的信息,这些信息大多是非结构化的,没有任何意义。如果不对此日志数据进行详尽的分析,那么企业可能会忽视其周围的机会和威胁。这是日志分析工具非常有用的地方。ELK Stack 或 Elastic Stack 是完整的日志分析解决方案,它有助于深入搜索、分析和可视化不同机器生成的日志。通过本教程,我将为您提供相关见解。
  首先,让我们列出要讨论的主题:

  • 什么是 ELK Stack?
  • ELK Stack 架构
  • ELK Stack 安装
  • Elasticsearch 教程
  • Logstash 教程
  • Kibana 教程

  本教程将帮助您一起理解 Elasticsearch、Logstash 和 Kibana 的基础知识,并帮助您在 ELK Stack 中打下坚实的基础。
  首先让我们来了解什么是 ELK Stack。

什么是 ELK Stack?


  众所周知的 ELK Stack 最近被更名为 Elastic Stack。它是三个开源工具的强大集合:Elasticsearch、Logstash 和 Kibana。
  这三种不同的产品最常一起用于不同 IT 环境中的日志分析。使用 ELK Stack,您可以执行集中式日志记录,这有助于识别 Web 服务器或应用程序的问题。它使您可以在一个地方搜索所有日志,并通过在特定时间范围内关联多个服务器的日志来识别跨多个服务器的问题。
  现在让我们详细讨论这些工具。

Logstash

Logstash 是数据收集管道工具。它是 ELK Stack 的第一个组件,它收集数据输入并将其输入到 Elasticsearch。它可以一次从不同来源收集各种类型的数据,并立即提供以备将来使用。

Elasticsearch

Elasticsearch 是基于 Lucene 搜索引擎的 NoSQL 数据库,并使用 RESTful API 构建。它是一个高度灵活的分布式搜索和分析引擎。此外,它通过水平可伸缩性提供了简单的部署、最大的可靠性和易于管理的功能。它提供高级查询以执行详细分析,并集中存储所有数据以快速搜索文档。

Kibana

Kibana 是一种数据可视化工具。它用于可视化 Elasticsearch 文档,并帮助开发人员立即对其进行深入了解。Kibana 仪表板提供了各种交互式图表、地理空间数据、时间线和图表,以可视化使用 Elasticsearch 完成的复杂查询。使用 Kibana,您可以根据自己的特定需求创建和保存自定义图形。
  下一部分将讨论 ELK Stack 架构以及其中的数据流向。

ELK Stack 架构

  以下是 ELK Stack 的架构,显示了 ELK 中日志流的正确顺序。在此,Logstash 会根据提供的过滤条件来收集和处理从各种来源生成的日志。然后,Logstash 将这些日志通过管道传输到 Elasticsearch,然后 Elasticsearch 分析和搜索数据。最后,使用 Kibana,可以根据要求对日志进行可视化和管理。

ELK Stack 安装

第 I 步:打开 https://www.elastic.co/downloads

第 II 步:选择并下载 Elasticsearch。
第 III 步:选择并下载 Kibana。
第 IV 步:选择并下载 Logstash。
第 V 步:解压缩所有三个文件以获取对应文件夹的文件。

安装 Elasticsearch

第 VI 步:现在打开 elasticsearch 文件夹并转到 bin 文件夹
第 VII 步:双击 elasticsearch.bat 文件以启动 elasticsearch 服务器。

第 VIII 步:等待 elasticsearch 服务器启动。
第 IX 步:要检查服务器是否已启动,请转到浏览器并键入 localhost:9200

安装 Kibana

第 X 步:现在打开 kibana 文件夹 并转到 bin 文件夹
第 XI 步:双击 kibana.bat 文件以启动 kibana 服务器。

第 XII 步:等待 kibana 服务器启动。
第 XIII 步:要检查服务器是否已启动,请转到浏览器并键入 localhost:5601

安装 Logstash

第 XIV 步:现在打开 logstash 文件夹
第 XV 步:要测试您的 logstash 安装,请打开命令提示符,然后转到 logstash 文件夹。现在输入:

binlogstash -e 'input { stdin { } } output { stdout {} }'

第 XVI 步:等待,直到命令提示符上显示“ Pipeline main started”出现在命令提示符下。

第 XVII 步:现在,在命令提示符下输入一条消息,然后按 Enter 键。
第 XVIII 步:Logstash 将时间戳和 IP 地址信息附加到消息中,并将其显示在命令提示符下。
  既然我们完成了安装,那么现在让我们更深入地研究这些工具。让我们从 Elasticsearch 开始。

Elasticsearch

  如前所述,Elasticsearch 是一个高度可扩展的搜索引擎,它运行在基于 Java 的 Lucene 引擎之上。它基本上是一个 NoSQL 数据库。这意味着它将以非结构化格式存储数据,并且无法对任何类型的交易执行 SQL 查询。换句话说,它将数据存储在文档中,而不是表和模式中。为了获得更好的图像,请检查下表,该表显示了与数据库相比在 Elasticsearch 中的内容。

  现在让我们熟悉 Elasticsearch 的基本概念。
使用Elasticsearch时,需要遵循三个主要步骤:

  1. 索引
  2. 映射
  3. 搜索

  让我们一个一个详细地谈谈。

索引

  索引编制是添加数据 Elasticsearch 的过程。之所以称为“索引”,是因为将数据输入到 Elasticsearch 中后,它将被放入 Apache Lucene 索引中。然后,Elasticsearch 使用这些 Lucene 索引来存储和检索数据。索引编制与 CRUD 操作的创建和更新过程相似。   索引方案由 名称/类型/id 组成,其中名称和类型是必填字段。 如果您不提供任何 ID,Elasticsearch 将自己提供一个 ID。 然后,将整个查询附加到 HTTP PUT 请求中,最终 URL 如下:PUT name/type/id 与 HTTP 有效负载一起,还将发送包含字段和值的 JSON 文档。
  以下是创建一个美国客户的文档的示例,该文档及其字段中的详细信息。

PUT /customer/US/1 
{
    "ID": 101,
    "FName": "James",
    "LName": "Butt",
    "Email": "jbutt@gmail.com",
    "City": "New Orleans",
    "Type": "VIP"
}

  它会给你以下输出:

  这里显示文档已创建并添加到索引中。
  现在,如果您尝试在不更改标识的情况下更改字段详细信息,Elasticsearch 将使用当前详细信息覆盖现有文档。

PUT /customer/US/1
{
    "ID": 101,
    "FName": "James",
    "LName": "Butt",
    "Email": "jbutt@yahoo.com",
    "City": "Los Angeles",
    "Type": "VVIP"
}


  这里显示文档已经更新了索引的新细节。

映射

  映射是设置索引模式的过程。通过映射,您可以告诉 Elasticsearch 你的模式中属性的数据类型。如果在预索引时未针对特定对象进行映射,则 Elasticsearch 将动态地将泛型类型添加到该字段。但是这些泛型类型是非常基本的,大多数时候都不能满足查询的期望。
  现在让我们尝试映射查询。

PUT /customer/
{
    "mappings": {
        "US": {
            "properties": {
                "ID": {
                    "type": "long"
                },
                "FName": {
                    "type": "text"
                },
                "LName": {
                    "type": "text"
                },
                "Email": {
                    "type": "text"
                },
                "City": {
                    "type": "text"
                },
                "Type": {
                    "type": "text"
                }
            }
        }
    }
}


  当您执行查询时,您将获得这种类型的输出。

搜索

  具有特定索引和类型的一般搜索查询如下:

POST index/type/_search

  现在,让我们尝试搜索“customer”索引中存在的所有客户的详细信息。

POST /customer/US/_search

  当您执行此查询时,将生成以下结果:

  但是,当您要搜索特定结果时,Elasticsearch 提供了三种方法:

使用查询

  使用查询,您可以搜索一些特定的文档或条目。例如,让我们对属于“ VVIP”类别的客户执行搜索查询。

POST /customer/US/_search
{
    "query": {
        "match": {
            "Type": "VVIP"
        }
    }
}

使用过滤器

  使用过滤器,您可以进一步缩小搜索范围。以下是搜索 ID 为“ 101”的 VVIP 客户的示例:

POST /customer/_search
{
    "query": {
        "match": {
            "Type": "VVIP"
        }
    },
    "post_filter": {
        "match": {
            "ID": 101
        }
    }
}

  如果执行此查询,则会得到以下结果:

使用聚合

  聚合是一个框架,可帮助通过搜索查询聚合数据。小型聚合可以结合在一起,以构建所提供数据的复杂摘要。让我们执行一个简单的汇总,以检查索引中有多少类型的客户:

POST /customer/_search
{
    "size": 0,
    "aggs": {
        "Cust_Types": {
            "terms": {
                "field": "Type.keyword"
            }
        }
    }
}


  现在让我们看看如何从索引中检索数据集。

获取数据

  要检查索引中包含的文档列表,您只需要发送以下格式的 HTTP GET 请求:

GET index/type/id

  让我们尝试检索“ id”等于 2 的客户的详细信息:

GET /customer/US/2

  成功执行后,它将为您提供以下类型的结果。

  使用 Elasticsearch,您不仅可以浏览数据,还可以删除或删除文档。

删除数据

  使用删除约定,您可以轻松地从索引中删除不需要的数据并释放内存空间。要删除任何文档,您需要以以下格式发送 HTTP DELETE 请求:

DELETE index/type/id.

  现在让我们尝试删除 ID 为 2 的客户的详细信息。

DELETE /customer/US/2

  执行此查询时,您将获得以下类型的结果。

  至此,我们讲解了使用 Elasticsearch 的 CRUD 操作的基础知识,了解这些基本操作将帮助您执行不同类型的搜索。
  现在让我们开始学习 ELK Stack 的下一个工具 Logstash。

Logstash

  正如我已经讨论的那样,Logstash 是一种管道工具,通常用于收集和转发日志或事件。它是一个开源数据收集引擎,可以动态集成来自各种来源的数据并将其标准化到指定的目标位置。

  使用多个输入,过滤器和输出插件,Logstash 可以轻松转换各种事件。至少,Logstash 需要在其配置文件中指定的输入和输出插件来执行转换。以下是 Logstash 配置文件的结构:

input {
    ...
}

filter {
    ...
}

output {
    ...
}

  如您所见,整个配置文件分为三个部分,每个部分都包含一个或多个插件的配置选项。这三个部分是:

  1. input(输入)
  2. filter (过滤)
  3. output (输出)

  您也可以在配置文件中应用多个过滤器。在这种情况下,其应用程序顺序将与配置文件中的规范顺序相同。
  现在,让我们尝试配置 CSV 文件格式的美国客户数据集文件。

    file {
        path => "E:/ELK/data/US_Customer_List.csv"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
filter {
    csv {
        separator => ","
        columns => ["Cust_ID", "Cust_Fname", "Cust_Lname", "Cust_Email", "Cust_City", "Cust_Type"]
    }
    mutate {
        convert => ["Cust_ID", "integer"]
    }
}
output {
    elasticsearch {
        hosts => "localhost"
        index => "customers"
        document_type => "US_Based_Cust"
    }
    stdout {}
}

  要将这个 CSV 文件数据插入 elasticsearch 中,您必须通知 Logstash 服务器。
  为此,请执行以下步骤:

  1. 打开命令提示符
  2. 进入 Logstash 的 bin 目录
  3. 输入:logstash –f X:/foldername/config_filename.config 然后按回车。一旦您的 logstash 服务器启动并运行,它将开始将文件中的数据传输到Elasticsearch 中。

      如果要检查是否成功插入了数据,请转到 Sense 插件并键入:GET /customers/
      它会为您提供已创建的文档数。
      现在,如果要可视化此数据,则必须使用 ELK Stack 的最后一个工具,即Kibana。因此,在本教程的下一部分中,我将讨论 Kibana 及其使用方式,以可视化您的数据。

    Kibana

      如前所述,Kibana 是一个开源的可视化和分析工具。它有助于可视化 Logstash 管道传输并存储到 Elasticsearch 中的数据。您可以使用 Kibana 来搜索,查看此存储的数据并与之交互,然后在各种图表,表格和地图中对其进行可视化。Kibana 的基于浏览器的界面简化了海量数据并反映了 Elasticsearch 查询中的实时变化。此外,您还可以轻松创建、自定义、保存和共享仪表板。
      一旦您了解了如何与 Elasticsearch 和 Logstash 一起使用,学习 Kibana 就不是什么大事了。在本教程的这一部分,我将向您介绍为了对数据进行分析所需的各种功能。

    管理页面

      在这里,您必须执行 Kibana 的运行时配置。 在此页面中,您需要指定一些搜索内容。请参见以下示例,在该示例中,我已经配置了“customer”索引的条目。

      如您所见,在“索引模式(Index Patterns)”字段中,您需要指定要使用的索引。确保在“时间过滤器字段名称”中将其选择为@timestamp。然后,您可以继续并单击创建以创建索引。如果索引创建成功,您将看到以下页面类型:

      在这里,您可以根据需要从下拉列表中选择不同的过滤器。此外,要释放内存,您还可以删除特定的索引。

    发现页面

      通过“发现”页面,您可以访问存在于每个与所选索引模式匹配的每个索引的文档。 您可以轻松地交互和浏览Kibana服务器上存在的所有数据。 此外,您可以查看文档中存在的数据并对其进行搜索查询。 下面你可以看到,我正在搜索来自“洛杉矶”的“ VIP”客户。

      因此,如您所见,我们只有一位来自洛杉矶的VIP客户。

    可视化页面

      可视化页面使您可以可视化以图表、条形图、饼图等形式显示在 Elasticsearch 索引中的数据。您甚至可以在此处构建仪表板,这些仪表板将基于 Elasticsearch查询显示相关的可视化效果。通常,使用一系列 Elasticsearch 聚合查询来提取和处理数据。当您转到“可视化”页面并搜索保存的可视化时,或者可以创建一个新的可视化。

      您可以以任何形式汇总数据。为了方便用户,提供了不同类型的可视化选项。

      让我向您展示如何根据用户类型可视化美国客户数据。

      要执行可视化,请按照以下步骤操作:

  4. 选择可视化类型。 [这里我用的是饼图]
  5. 在汇总字段中,从下拉列表中选择“术语(term)”。
  6. 在“字段(field)”中,选择要执行搜索的字段类型。
  7. 您还可以指定可视化的顺序和大小。
  8. 现在单击执行按钮以生成饼图。

    仪表盘页面

      “仪表板”页面显示已保存的可视化的集合。在这里,您可以添加新的可视化效果,也可以使用任何保存的可视化效果。

    Timelion 页面

      Timelion 是一个时间序列数据可视化工具,它将完全独立的数据源整合到一个界面中。 它由一种单行表达语言驱动,可用于检索时间序列数据,执行计算以简化复杂问题并可视化结果。

    开发工具页面

      Kibana 的“开发工具”页面包含诸如“ Beta Sense”插件之类的开发工具,可用于与 Elasticsearch 中存在的数据进行交互。它通常被称为 Kibana 的控制台。以下是一个示例,其中我使用了 Kibana 的 Sense 插件来搜索类型为“ US_based_cust”的“客户(customers)”索引:

      本文到此结束。现在,您可以使用 Logstash、Elasticsearch 和 Kibana 对任何数据执行各种搜索和分析。

Selenium WebDriver教程

【注】本文译自:
https://www.edureka.co/blog/selenium-tutorial

  在本教程中,我将向您介绍 Selenium Webdriver,它是当今市场上使用最广泛的自动化测试框架。它是开源的,可与所有著名的编程语言(如Java、Python、C#、Ruby、Perl等)一起使用,以实现浏览器活动的自动化。通过本文,我将告诉您开始使用 Selenium WebDriver 测试 Web 应用程序所需了解的所有信息。

  以下是本教程的主题:

  • 什么是 Selenium Webdriver?
  • Selenium 容易学吗?
  • Selenium 软件有什么作用?
  • Selenium 的基本知识是什么?
  • Selenium RC 的缺点和 WebDriver 的诞生
  • 什么是浏览器元素?
  • 定位网页上的浏览器元素
  • 浏览器元素上的操作

什么是 Selenium WebDriver?

  Selenium WebDriver 是一个基于 Web 的自动化测试框架,可以测试在各种Web浏览器和各种操作系统上启动的网页。实际上,您还可以自由使用各种编程语言(例如Java、Perl、Python、Ruby、C#、PHP 和 JavaScript)编写测试脚本。请注意,Mozilla Firefox 是 Selenium WebDriver 的默认浏览器。

  但是很多时候,刚入门的测试人员会想到这个疑问:

Selenium 好学吗?

  要用外行的话回答这个问题,我会说:”是的,是!”。Selenium 真的很容易学习和掌握,因为您只需要对任意一种常见的编程语言(例如 Java、C#、Python、Perl、Ruby、PHP)有基本的了解。预先掌握这些编程语言中的任何一种的都可有助于编写测试用例。但是,如果您没有,那就不要担心了。Selenium IDE 是一个可以有效使用的基于 GUI 的工具。

Selenium 软件有什么作用?

  以下是 Selenium 软件最吸引人的一些用途:

  1. 自动化测试: 在大型项目中,自动化测试会派上用场,在大型项目中,如果不是 Selenium,测试人员将必须手动测试每个创建的功能。使用 Selenium,所有手动任务都可以自动化,从而减轻了测试人员的负担和压力。
  2. 跨浏览器兼容性: Selenium 支持多种浏览器,例如:Chrome、Mozilla Firefox、Internet Explorer、Safari 和 Opera。
  3. 提高测试覆盖率: 通过自动化的测试,可以减少总体测试时间,从而为测试人员腾出时间来同时在不同的测试场景下执行更多测试。
  4. 减少测试执行时间: 由于 Selenium 支持并行测试执行,因此可以大大减少并行测试执行时间。
  5. 多操作系统支持: Selenium WebDriver 提供跨 Windows、Linux、UNIX、Mac 等多种操作系统的支持。使用 Selenium WebDriver,您可以在 Windows 操作系统上创建测试用例并在 Mac 操作系统上执行。

Selenium 的基本知识是什么?

  WebDriver 是 Selenium v2.0 的一部分。Selenium v1 仅由 IDE,RC 和 Grid 组成。但是 Selenium 项目的主要突破是开发 WebDriver 并将其作为 Selenium v2 的替代产品引入。但是,随着 Selenium v3 的发布,不推荐使用 RC,而将其迁移到旧版软件包中。 您仍然可以下载并使用 RC,但不要期望对其提供任何支持。

  简而言之,WebDriver相对于 RC 的优势是:

  • 支持更多的编程语言、操作系统和 Web 浏览器
  • 克服 Selenium 1 的局限性,例如文件上传、下载、弹出窗口和对话障碍
  • 与 RC 相比,命令更简单,API 更好
  • 支持批量测试,跨浏览器测试和数据驱动的测试

  但是,与 RC 相比,缺点是无法生成测试报告。RC 生成详细的报告。

  下图描述了 WebDriver 的工作方式:

  但是您是否想知道为什么需要 Selenium Webdriver?接下来,我将讨论 Selenium RC 的局限性,因为这是最终开发 WebDriver 的原因。

Selenium RC 的缺点和 WebDriver 的诞生

  当我说 Selenium RC 推出时立即引起轰动时,您可能会感到惊讶。那是因为它克服了同源策略问题,而在使用 Selenium Core 测试 Web 应用程序时这是一个主要问题。但是您知道什么是同源政策问题吗?

  同源策略是用于强制实施 Web 应用程序安全模型的规则。根据同源策略,当且仅当被测试的 JavaScript 和网页都来自同一域时,Web 浏览器才会允许 JavaScript 代码访问网页上的元素。Selenium Core 是基于 JavaScript 的测试工具,由于无法测试每个网页的原因而受到限制。

  但是,当 Selenium RC 出现时,它使测试人员摆脱了同源政策问题。但是,RC 如何做到这一点? RC 通过使用另一个称为 Selenium RC 服务器的组件来做到这一点。 因此,RC 是由两个组件组合而成的工具:Selenium RC 服务器Selenium RC 客户端

  Selenium RC 服务器是一个 HTTP 代理服务器,旨在“欺骗”浏览器,使其相信 Selenium Core 和被测试的 Web 应用程序来自同一域。因此,不能阻止 JavaScript 代码访问和测试任何网站。

  尽管 Selenium RC 受到了很大的欢迎,但它也有自己的问题。主要的是执行测试所花费的时间。由于 Selenium RC 服务器是浏览器与您的 Selenium 命令之间通信的中间人,因此执行测试非常耗时。除了时间因素之外,RC 的架构也有些复杂。

  这种架构涉及首先将 Selenium Core 注入 Web 浏览器。然后,Selenium Core 将接收来自 RC 服务器的指令并将其转换为 JavaScript 命令。此 JavaScript 代码负责访问和测试 Web 元素。下面这张图有助于您将了解 RC 的工作原理。

  为了克服这些问题,开发了 Selenium WebDriver。WebDriver更快,因为它直接与浏览器交互,并且不需要外部代理服务器。由于从操作系统级别控制浏览器,因此架构也更简单。下图将帮助您了解 WebDriver 的工作方式。

  WebDriver 的另一个好处是它支持在 HTML Unit 驱动程序(无头驱动程序)上进行测试。当我们说无头驱动程序时,它是指浏览器没有 GUI 的事实。另一方面,RC 不支持 HTML Unit 驱动程序。这些是 WebDriver 比 RC 得分高的原因。

  在学习 Selenium 的概念之前,您应该对 Java 或任何其他面向对象的编程语言有基本的了解。Selenium 支持的语言包括 C#、Java、Perl、PHP、Python 和 Ruby。当前,Selenium Webdriver 在 Java 和 C# 中最受欢迎。

  现在,让我们继续,下一部分学习“浏览器元素”,我将告诉您这些元素是什么以及如何在这些 Web 元素上进行测试。

什么是浏览器元素?

  元素是网页上存在的不同组件。我们在浏览时注意到的最常见元素是:

  • 文本框
  • CTA 按钮
  • 图像
  • 超链接
  • 单选按钮 / 复选框
  • 文字区 / 错误信息
  • 下拉框 / 列表框 / 组合框
  • Web表格 / HTML表格
  • 框架

  测试这些元素本质上意味着我们必须检查它们是否工作正常,并按照我们希望的方式进行响应。例如,如果我们正在测试文本框,您将对它进行什么测试?

  1. 我们是否能够将文本或数字发送到文本框
  2. 我们可以检索已传递到文本框等的文本吗?

  如果我们正在测试图像,则可能需要:

  1. 下载图片
  2. 上传图片
  3. 点击图片链接
  4. 检索图像标题等。

  类似地,可以对前面提到的每个元素执行操作。但是只有将元素放置在网页上之后,我们才能执行操作并开始对其进行测试,对吗? 因此,下一个主题,我将介绍元素定位器技术。

定位网页上存在的浏览器元素

  网页上的每个元素都具有属性。元素可以具有多个属性,并且这些属性中的大多数对于不同的元素而言都是唯一的。例如,考虑具有两个元素的页面:图像和文本框。 这两个元素都有一个“名称”属性和一个“ ID”属性。这些属性值对于每个元素都必须是唯一的。 换句话说,两个元素不能具有相同的属性值。元素的“类名”可以具有相同的值。

  在本例中,图像和文本框既不能具有相同的“ ID”值,也不能具有相同的“名称”值。但是,页面上的一组元素可能有一些共同的属性。稍后,我将告诉您这些属性是哪些,但是在此之前,让我列出我们可以用来定位元素的 8 个属性。 这些属性是 ID、名称、类名、标签名、链接文本、部分链接文本、CSS 和 XPath。

  由于元素是使用这些属性定位的,因此我们将其称为“定位器”。定位器有:

  • By.id
      语法: driver.findElement(By.id(“xxx”));
  • By.name
      语法: driver.findElement(By.name(“xxx”));
  • By.className
      语法: driver.findElement(By.className(“xxx”));
  • By.tagName
      语法: driver.findElement(By.tagName(“xxx”));
  • By.linkText
      语法: driver.findElement(By.linkText(“xxx”));
  • By.partialLinkText
      语法: driver.findElement(By.partialLinkText(“xxx”));
  • By.css
      语法: driver.findElement(By.css(“xxx”));
  • By.xpath
      语法: driver.findElement(By.xpath(“xxx”));

  通过查看上面的语法,您可能已经意识到定位器是在内部调用的。因此,在进行进一步操作之前,您需要学习可用于对元素执行操作的所有其他方法、浏览器命令和功能。

浏览器元素上的操作

  从现在开始,您将获得很多乐趣,因为理论更少、代码更多。因此,请做好准备,打开Eclipse IDE,并安装必需的 Selenium 软件包。

  要开始测试网页,我们需要首先打开浏览器,然后通过提供正确的 URL 导航到该网页?看看下面的代码,我在上面复制了同样的代码。Firefox 浏览器将首先启动,然后将导航到 Facebook 的登录页面。

package seleniumWebDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class WebDriverClass
{
    public static void main(String[] args)
    {
        System.setProperty("webdriver.gecko.driver", "files/geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.facebook.com/");
        driver.getTitle();
        driver.quit();
    }
}

  import
org.openqa.selenium.WebDriver;
是一个库包,其中包含启动加载有特定驱动程序的浏览器所需的类。

  import org.openqa.selenium.firefox.FirefoxDriver; 是一个库包,其中包含 FirefoxDriver 类,该类是启动 FirefoxDriver 作为 WebDriver 类启动的浏览器所需的。

  System.setProperty(“webdriver.gecko.driver”, “files/geckodriver.exe”); – 该命令通知运行时引擎指定路径中存在 Gecko 驱动程序。在 Firefox 35 之后,我们需要下载 Gecko 驱动程序以使用 WebDriver。如果要在 Chrome 上进行测试,则必须下载ChromeDriver(这是一个.exe文件),并在此代码行中指定其路径。对于其他浏览器,我们也必须这样做。

  WebDriver driver = new FirefoxDriver(); – 此命令用于启动新的 Firefox 驱动程序对象。

  driver.get(“https://www.edureka.co/”); – 这个方法用于打开指定的URL。

  driver.getTitle(); – 此命令获取浏览器中当前打开的选项卡的标题。

  driver.quit(); – 此命令关闭浏览器驱动程序。

  但是,如果您想导航到其他 URL 然后进行测试该怎么办?在这种情况下,您可以使用下面的代码片段所示的 navigation.to() 命令。然后,如果您想返回上一页,则可以通过使用navigation.back()命令来完成。 同样,要刷新当前页面,可以使用navigation.refresh() 命令。

driver.navigate().to(“https://www.edureka.co/testing-with-selenium-webdriver”);
driver.navigate().refresh();
driver.navigate().back();

  如果您想最大化浏览器窗口的大小,则可以使用下面的代码片段来实现。

driver.manage().window().maximize();

  如果要为浏览器窗口设置自定义尺寸,则可以设置自己的尺寸,如下面的代码片段所示。

Dimension d = new Dimension(420,600);
driver.manage().window().setSize(d);

  现在您已经了解了大多数基本知识,我们进入下一个主题。让我们尝试在网页上找到一个元素,然后执行所有可能的操作。

  我很确定,你们所有人都有 Facebook 帐户。因此,让我向您展示如何绕过代码本身的凭据登录 Facebook。

  登录页面中有两个文本字段,一个用于电子邮件 / 电话,另一个用于密码。我们必须找到这两个元素,将凭据传递给这些元素,然后找到第三个元素:需要单击的“登录”按钮。

  请看下面的截图。这是 Facebook 登录页面的屏幕截图。

  如果您检查(Ctlr + Shift + i)此页面,则将在浏览器中看到相同的窗口。然后,在“元素”下,将显示页面上存在的所有元素及其属性的列表。上面的屏幕快照中突出显示了三个部分。第一个突出显示的元素是电子邮件文本字段,第二个是密码文本字段,第三个是“登录”按钮。

  如果您还记得,我在前面提到过可以使用元素定位器技术来定位这些元素。 让我们用它来定位这些元素并发送字段值。

  这是查找元素的语法:driver.findElement(By.id(“xxx”));

为了发送它的值,我们可以使用方法 sendKeys(“credentials“);

要单击按钮,我们必须使用 click();

  那么,让我们开始寻找元素并对其进行操作。其代码在下面的代码片段中。

driver.findElement(By.name("email")).sendKeys("xxx@gmail.com");
driver.findElement(By.name("pass")).sendKeys("xxxxxx");
driver.findElement(By.id("u_0_q")).click();

  在第 1 行中,我们通过其唯一的“名称”属性来标识 Email 元素,并将其发送给 EmailID。

  在第 2 行中,我们通过其唯一的“名称”属性来标识 Password 元素,并将其发送给密码。

  在第 3 行中,我们通过其唯一 ID 找到“登录”按钮元素,然后单击该按钮。

  仅添加这些代码行可能还不够。那是因为页面的动态,它可能不会立即响应,并且在页面加载时,WebDriver 将终止并引发超时异常错误。此问题可能很快就不会在 Facebook 页面上发生,但很可能会在其他任何电子商务网站和其他动态网站上发生。

  为了克服这个问题,我们需要使用一种先进的技术。我们需要请求我们的 WebDriver 在页面被访问并且页面完全加载之后等待,我们需要找到元素然后执行操作。

如果你想让你的 WebDriver 等待,直到所有元素加载到网页中,然后关闭浏览器,那么我们可以使用 driver.wait() 方法或 Threads.sleep() 方法来实现。但是,如果您正在编写更高级的代码,那么您应该使用隐式等待显式等待。但是对于我们的情况,下面的命令就足够了。

driver.wait(5000);
// or use this:-
Thread.sleep(5000);

  但是,在使用等待条件时,请记住导入该库:

import java.util.concurrent.TimeUnit;

  我们这样做是因为,等待类及其相关方法将出现在此库中。

  下面是我所解释代码的完整代码片段。

package seleniumWebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.util.concurrent.TimeUnit;

public class WebDriverClass
{
    public static void main(String[] args)
    {
        System.setProperty("webdriver.gecko.driver", "files/geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.facebook.com/");
        driver.manage().window().maximize();
        driver.getTitle();
        driver.navigate().to(“https://www.edureka.co/testing-with-selenium-webdriver”);

        driver.navigate().back();
        driver.navigate().refresh();
        driver.wait(5000);
        // or use
        // Thread.sleep(5000);

        driver.findElement(By.name("email")).sendKeys("xxx@gmail.com");
        driver.findElement(By.name("pass")).sendKeys("xxxxxx");
        driver.findElement(By.id("u_0_q")).click();

        driver.quit();
    }
}

  当您用实际的电子邮件和密码替换凭据并执行此代码时,Facebook 将在新窗口中打开,输入您的凭据并登录到您的帐户。

  瞧! 您已成功登录,这意味着您的完整代码已完全执行。

  我使用了 ID 和 Name 属性来定位元素。实际上,您可以使用任何其他定位器来查找元素。XPath 是最有用和最重要的定位器技术。但是,只要您甚至可以找到其中一个属性并将其用于定位元素,就可以了。

什么是Selenium?使用Selenium进行自动化测试

【注】本文译自:https://www.edureka.co/blog/what-is-selenium/
  你知道什么是 Selenium 吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。
  自动化测试正席卷全球,Selenium 认证是业界最抢手的技能之一。

什么是 Selenium?

  Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。
  等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用程序。我们既不能使用 Selenium 测试任何桌面(软件)应用程序,也不能测试任何移动应用程序。
  这很糟糕,对吧?我能感觉到你的痛苦。但请放心,有许多工具可以测试桌面软件和移动应用程序,例如:IBM 的 RFT,HP 的 QPT,Appium 等。但是,本文的重点是测试动态 Web 应用程序,以及为什么 Selenium 在这方面是最好的。

Selenium 的优势是什么?

  由于 Selenium 是开源的,因此不涉及许可费用,这是与其他测试工具相比的主要优势。Selenium 日益流行的其他原因是:

  • 测试脚本可以用以下任何一种编程语言编写:Java、Python、C#、PHP、Ruby、Perl 和 .Net
  • 可以在以下任何操作系统中进行测试:Windows、Mac 或 Linux
  • 可以使用任何浏览器进行测试:Mozilla Firefox、Internet Explorer、Google Chrome、Safari 或 Opera
  • 可以与 TestNGJUnit 等工具集成,以管理测试用例和生成报告
  • 可以与 MavenJenkinsDocker 集成以实现持续测试
      但总有缺点吧?
  • 我们只能使用 Selenium 来测试 Web 应用程序。我们无法测试桌面应用程序或任何其他软件
  • 没有针对 Selenium 的保证支持。我们需要利用现有的客户社区
  • 无法对图像进行测试。我们需要将 Selenium 与 Sikuli 集成以进行基于图像的测试
  • 没有本机报告工具。但是我们可以通过将其与 TestNG 或 JUnit 之类的框架集成来解决该问题
      首先,让我们了解 Selenium 是如何发展到今天的。所以,让我们按以下顺序来讲解:

    1. 软件测试的诉求
    2. 手工测试的挑战
    3. 自动化测试如何胜过手动测试?
    4. Selenium 与其他测试工具的对比?
    5. Selenium 套件工具

      软件测试的需要

        一切都归结为软件测试。当今的技术世界完全由机器控制,它们的行为被驱动它的软件所控制。这些机器会完全按照我们希望的那样运行吗?每一次、任何场合都符合预期吗?这些问题的答案在于软件测试。
        归根结底,软件应用程序的成功率将控制你的业务增长。即使对于 Web 应用程序,也可以说同样的话,因为当今大多数企业都完全依赖 Internet。
        以任何一家电子商务公司为例。无论是 Amazon 还是 E-Bay 或 Flipkart,他们都依赖其网站上的客户流量以及基于 Web 的移动应用程序上的业务流量。 想象一下,如果发生灾难性事件,例如将许多产品的价格限制在 10 美元以内,这都是由于代码“不那么容易理解”部分中的一个小错误所致。那该怎么办,我们下次如何预防呢? 部署之前测试代码,对吗? 所以,这就是软件测试的需要。但是,Selenium 是什么?它是软件测试工具吗?好吧,Selenium 是一种自动化测试工具!
        进一步之前,请让我澄清一下,软件测试有两种类型:手动测试和自动化测试。Selenium 作为一种自动化测试工具被创建,旨在克服手动测试的弊端/局限性。因此,接下来,让我们了解手动测试的挑战。

      手动测试的挑战

        手动测试是指 QA 测试人员手动测试(Web)应用程序。需要在每个环境中使用不同的数据集手动执行测试,并且应记录每个事务的成功/失败率。

        看看上图中这个糟糕的小伙子,他要手动验证记录的交易。他正面临的挑战会导致疲劳、无聊、工作延迟、错误和失误(由于手动操作)。这导致了 Selenium(自动化测试工具)的发明。

      自动化测试胜过手动测试

        每次自动化测试都胜过手动测试。为什么?因为它速度更快,需要的人力资源投资较少,所以不容易出错,可以频繁执行测试,支持无人值守执行,支持回归测试以及功能测试。
        让我们举一个与前面提到的类似的例子。假设有一个登录页面,我们需要验证所有的登录尝试是否成功,那么很容易编写一段代码来验证所有的事务/登录尝试是否成功(自动测试用例执行)。
        此外,可以以在不同环境和 Web 浏览器中对它们进行测试的方式配置这些测试。我们还能做些什么?您可以通过安排一天中的特定时间来自动生成结果文件。然后,您还可以根据这些结果自动生成报告。
        关键是自动化测试使测试人员的工作变得更加简单。如下图所示,显示了一个更宽松的环境,同样的测试人员正在工作。

        现在,让我特别谈谈 Selenium。
        让我们看看 Selenium 在市场上的地位。

      Selenium 对比 QTP 和 RFT

        我在下表中将其性能与其他两个流行工具进行了比较:QTP和RFT。

特性 HP QTP IBM RFT Selenium
授权 需要 需要 开源
费用 开源
软件客户支持 HP 专有支持 IBM 专有支持 开源社区
脚本执行期间的硬件消耗
编码经验 不需要 需要 需要足够的编码技巧和经验
环境支持 仅支持 Windows 仅支持 Windows Windows,Linux,Solaris OS X(如果存在浏览器和 JVM或 JavaScript 支持)
语言支持 VB Script Java 和 C# Java、C#、Ruby、Python、Perl、PHP 和 JavaScript

  从上表可以很清楚地看出 Selenium 是最受青睐的工具。但是 Selenium 中有很多不同的风格,您应该知道哪种 Selenium 工具最适合你的需要。

Selenium 工具套件

  • Selenium RC (现在已废弃)
  • Selenium IDE
  • Selenium Grid
  • Selenium WebDriver

Selenium 有哪些组件?

  下面我详细解释了 Selenium 的各个组成:

Selenium RC (远程控制)

  在谈论 Selenium RC 的细节之前,我想回过头来谈谈 Selenium 项目中的第一个工具。Selenium Core 是第一个工具。但是,由于采用了同源策略,Selenium Core 在跨域测试方面遇到了障碍。同源策略禁止 JavaScript 代码访问与启动 JavaScript 的位置不同的域上托管的 Web 元素。
  为了克服同源策略问题,测试人员需要安装 Selenium Core(JavaScript程序)和包含要测试的 Web 应用程序的 Web 服务器的本地副本,以便它们属于同一域。这导致了 Selenium RC 的诞生,这是当时 ThoughtWork 的工程师 Paul Hammant 认可的。RC 通过使用 HTTP 代理服务器来“欺骗”浏览器,使其相信 Selenium Core 和被测试的 Web 应用程序来自同一域,从而解决了该问题。因此,使 RC 成为双组件工具。

  1. Selenium RC 服务器
  2. Selenium RC 客户端 – 包含编程语言代码的库

  RC Server 使用简单的 HTTP GET / POST 请求进行通信。查看下图以了解 RC 架构。

  Selenium 项目的旗舰工具是 Selenium RC,这是他们的第一个工具,可以用来以不同的编程语言编写测试用例。但是 RC 的缺点是与 RC 服务器的每次通信都很耗时,因此RC非常慢。太慢了,有时一次测试要花上几个小时。  从 Selenium v3 开始,RC 已弃用,并转移到遗留软件包中。您依然可以下载并使用 RC,但是很遗憾,已经无法得到支持。但另一方面,为什么要使用一个过时的工具,尤其是当有一个更有效的工具 Selenium WebDriver 时。在谈论WebDriver之前,让我讨论一下IDE 和 Grid,它们是构成 Selenium v1 的其他工具。

Selenium IDE(集成开发环境)

  2006年,日本的 Shinya Kastani 将他的 Selenium IDE 原型捐赠给了 Apache 的 Selenium 项目。这是一个用于快速创建测试用例的 Firefox 插件。IDE 实施了记录和回放模型,其中通过记录用户与 Web 浏览器的交互来创建测试用例。这些测试然后可以播放任意次。
  Selenium IDE 的优势在于,通过插件记录的测试可以以不同的编程语言导出,例如:Java、Ruby、Python 等。请查看以下 Firefox IDE 插件的屏幕截图。

  但是,IDE的相关缺点是:

  • 插件仅适用于 Mozilla Firefox;不适用于其他浏览器
  • 无法测试动态 Web 应用程序。只能记录简单的测试
  • 测试用例不能使用编程逻辑编写脚本
  • 不支持数据驱动测试

  这些是 Selenium IDE 的一些方面。现在让我谈谈 Selenium Grid。

什么是 Selenium Grid

  Selenium Grid 由 Patrick Lightbody 开发,最初称为 HostedQA(最初是 Selenium v1 的一部分),它与 RC 结合使用以在远程计算机上运行测试。实际上,使用 Grid 可以在多台计算机上同时执行多个测试脚本。
  借助 Hub-Node 架构实现并行执行。一台机器将承担集线器的角色,其他机器将充当节点。集线器控制在各种操作系统内的各种浏览器上运行的测试脚本。在不同节点上执行的测试脚本可以用不同的编程语言编写。

  Grid 仍在使用,并且可以与 WebDriver 和 RC 一起使用。但是,使用所有必需的浏览器和操作系统维护网格是一个挑战。为此,有多个在线平台可提供在线 Selenium Grid,您可以访问它们以运行 Selenium 自动化脚本。例如,您可以使用 LambdaTest。它具有2000 多种浏览器环境,您可以在这些环境中运行测试,并真正实现跨浏览器测试的自动化。

什么是 Selenium WebDriver

  Selenium WebDriver 由 Simon Stewart 于 2006 年创立,它是第一个可以从操作系统级别控制浏览器的跨平台测试框架。与 IDE 相比,Selenium WebDriver 提供了一个编程接口来创建和执行测试用例。编写测试用例,以便识别网页上的 Web 元素,然后对这些元素执行操作。
  WebDriver 是 RC 的升级,因为它速度更快。它更快,因为它可以直接调用浏览器。另一方面,RC 需要 RC 服务器与 Web 浏览器进行交互。每个浏览器都有自己的驱动程序,应用程序可以在该驱动程序上运行。不同的 WebDrivers 是:

  • Firefox Driver (Gecko Driver)
  • Chrome Driver
  • Internet Explorer Driver
  • Opera Driver
  • Safari Driver and
  • HTM Unit Driver

Selenium WebDriver 的好处

  • 支持 7 种编程语言:JAVA、C#、PHP、Ruby、Perl、Python 和 .Net
  • 支持在不同浏览器进行测试,如:Firefox、Chrome、IE、Safari
  • 支持在不同操作系统上执行测试,如:Windows、Mac、Linux、Android、iOS
  • 克服了 Selenium v1 的局限性,例如文件上传、下载、弹出窗口和对话栏

Selenium WebDriver 的缺点

  • 无法生成详细的测试报告
  • 无法测试图像

  不管遇到什么挑战,这些缺点都可以通过与其他框架集成来克服。对于测试图像,可以使用 Sikuli,对于生成详细的测试报告,可以使用 TestNG。

Docker教程-介绍Docker与容器化

【注】本文译自:https://www.edureka.co/blog/docker-tutorial
  本教程将为您提供 Docker 的概念和实践知识-一种新时代的容器化技术。
  在本教程中,我们将重点关注以下主题:

  • 什么是虚拟化?
  • 什么是容器化?
  • 容器化相对于虚拟化的优势
  • 介绍 Docker
  • Docker 的好处
  • 虚拟化与容器化
  • Docker 安装
  • Dockerfile, Docker 镜像与 Docker 容器
  • 什么是 Docker Hub?
  • Docker 架构
  • Docker Compose

  Docker 正变得越来越流行,其用法正像野火一样扩散。Docker 越来越受欢迎的原因是它可以在 IT 组织中使用的程度。很少有工具能同时对开发人员和系统管理员有用。Docker 真正兑现了其“构建、运输和运行”的承诺。
  简而言之,Docker 是一个软件容器化平台,这意味着您可以构建您的应用程序,将它们及其依赖项打包到一个容器中,然后可以轻松地将这些容器传输到其他机器上运行。
  例如:让我们考虑一个同时使用 Ruby 和 Python 编写的基于 linux 的应用程序。此应用程序需要特定版本的 linux、Ruby 和 Python。为了避免在用户端出现任何版本冲突,可以创建一个 Linux docker 容器,并随应用程序一起安装所需的 Ruby 和 Python 版本。现在,最终用户可以通过运行此容器轻松地使用应用程序,而不必担心依赖关系或任何版本冲突。
  这些容器使用容器化,可以将其视为虚拟化的演进版本。使用虚拟机也可以完成相同的任务,但是效率不是很高。  在这一点上,我通常会收到一个问题,即虚拟化和容器化之间有什么区别? 这两个术语彼此非常相似。那么,让我先告诉您什么是虚拟化?

什么是虚拟化?

  虚拟化是一种在主机操作系统之上导入来宾操作系统的技术。这项技术在一开始就是一个启示,因为它允许开发人员在不同的虚拟机中运行多个操作系统,而这些虚拟机都在同一主机上运行。这消除了对额外硬件资源的需求。 虚拟机或虚拟化的优点是:

  • 可以在同一台计算机上运行多个操作系统
  • 发生故障时,维护和恢复非常容易
  • 由于减少了对基础设施的需求,总拥有成本也减少了

      在上图中,您可以看到有一个主机操作系统,在该主机操作系统上正在运行 3 个来宾操作系统,这些操作系统只是虚拟机。
      如您所知,没有什么是完美的,虚拟化也有一些缺点。在同一主机操作系统中运行多个虚拟机会导致性能下降。这是因为来宾操作系统在主机操作系统之上运行,该操作系统将具有自己的内核以及一组库和依赖项。这占用了大量系统资源,即硬盘、处理器、尤其是 RAM。
      使用虚拟化技术的虚拟机的另一个问题是启动需要花费近一分钟的时间。对于实时应用程序,这是非常关键的。   以下是虚拟化的缺点:

    • 运行多个虚拟机会导致性能不稳定
    • 虚拟机管理程序的效率不如主机操作系统
    • 开机过程很长,需要时间

  这些缺点导致出现了一种称为容器化的新技术。现在,让我告诉您有关容器化的知识。

什么是容器化?

  容器化是将虚拟化带入操作系统级别的技术。虚拟化为硬件带来了抽象,而容器化为操作系统带来了抽象。请注意,容器化也是虚拟化的一种。但是,容器化效率更高,因为这里没有来宾操作系统,它使用主机的操作系统,与虚拟机不同,可以在需要时共享相关的库和资源。特定于应用程序的容器二进制文件和库在主机内核上运行,这使处理和执行非常快。即使启动一个容器也只需要一秒钟的时间。因为所有容器都共享,所以将托管操作系统并仅保留与应用程序相关的二进制文件和库。它们比虚拟机轻巧且速度更快。容器化相对于虚拟化的优势:

  • 同一操作系统内核上的容器更轻、更小
  • 与虚拟机相比,资源利用率更高
  • 启动过程很短,需要几秒钟

      在上图中,您可以看到存在一个由所有容器共享的主机操作系统。容器仅包含特定于应用程序的库,这些库对于每个容器都是独立的,并且它们速度更快且不会浪费任何资源。   所有这些容器均由非主机操作系统固有的容器化层处理。因此,需要一个软件,该软件可以使您在主机操作系统上创建和运行容器。
      现在,让我来介绍Docker。

    Docker 简介

      Docker 是一个容器化平台,以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中都能无缝运行。

      如上图所示,每个应用程序将在单独的容器上运行,并具有自己的一组库和依赖项。这也确保了进程级别的隔离,这意味着每个应用程序都独立于其他应用程序,从而使开发人员确信他们可以构建不会相互干扰的应用程序。
      作为开发人员,我可以构建一个容器,上面装有不同的应用程序,然后将其交给我的质量检查团队,他们只需运行该容器即可复制开发人员环境。

    Docker 的好处

      现在,QA 团队无需安装所有依赖的软件和应用程序来测试代码,这可以帮助他们节省大量时间和精力。从开发到部署,这也确保了工作环境在流程中涉及的所有个人之间是一致的。可以轻松扩展系统的数量,并且可以轻松地在其上部署代码。

    虚拟化与容器化

      虚拟化和容器化都可以让您在主机中运行多个操作系统。
      虚拟化处理在一台主机中创建许多操作系统的问题。另一方面,容器化将根据需要为每种类型的应用程序创建多个容器。

      从图中可以看出,主要区别在于虚拟化中有多个来宾操作系统,而容器化中却没有。与重型虚拟化相比,容器化的最好之处在于它非常轻巧。
      现在,让我们安装 Docker。

    安装 Docker

    我将在我的 Ubuntu 17.10 计算机上安装 Docker。以下是安装 Docker 的步骤:

    1. 安装所需的软件包
    2. 设置 Docker 仓库
    3. 在 Ubuntu 上安装 Docker

1. 安装所需的软件包:

您的系统中需要安装某些软件包才能安装 Docker。执行以下命令以安装那些软件包。

sudo apt-get install  curl  apt-transport-https ca-certificates software-properties-common

2. 设置 Docker 仓库:

  现在,导入 Dockers 官方 GPG 密钥以验证软件包签名,然后再使用 apt-get 安装它们。在终端上运行以下命令:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add


  现在,在您的 Ubuntu 系统上添加包含以下 Docker 软件包(包括其依赖项)的 Docker 存储库,以执行以下命令:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

3. 在 Ubuntu 上安装 Docker

  现在,您需要升级 apt 索引并安装 Docker 社区版,为此,请执行以下命令:

sudo apt-get update
sudo apt-get install docker-ce    



  恭喜你!您已成功安装 Docker。
  现在让我们看看一些重要的 Docker 概念。

Dockerfile, Docker 镜像与 Docker 容器:

  1. Docker 镜像是通过在称为 Dockerfile 的文件中写入的命令序列创建的。
  2. 当使用 docker 命令执行该 Dockerfile 时,它会生成带有名称的 Docker 镜像。
  3. 当通过“ docker run”命令执行此映像时,它将自行启动执行时必须启动的任何应用程序或服务。

Docker Hub:

  Docker Hub 就像 Docker 镜像的GitHub。它基本上是一个云注册中心,您可以在其中找到不同社区上传的 Docker 镜像,也可以开发自己的镜像并上传到 Docker Hub 上,但是首先,您需要在 DockerHub 上创建一个帐户。

Docker 架构:

  它由一个Docker引擎组成,该引擎是一个具有三个主要组件的客户端-服务器应用程序:

  1. 服务器是一种长期运行的程序,称为守护程序进程(docker 命令)。
  2. REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
  3. 命令行界面(CLI)客户端(docker 命令)。
  4. CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护程序或与 Docker 守护程序进行交互。许多其他 Docker 应用程序都使用基础 API 和 CLI。

  最后,我将讨论 Docker Compose。

Docker Compose:

  Docker Compose 基本上用于将多个 Docker 容器作为单个服务器运行。让我给你举个例子: 假设我有一个需要 WordPress、Maria DB 和 PHP MyAdmin 的应用程序。我可以创建一个文件,该文件可以将两个容器作为服务启动,而无需分别启动每个容器。这真的很有用,尤其是在您具有微服务架构的情况下。

Jenkins教程:使用Jenkins进行持续集成

【注】本文译自:
https://www.edureka.co/blog/jenkins-tutorial/

  本文将重点介绍 Jenkins 架构和 Jenkins 构建管道,并向您展示如何在 Jenkins 中创建一个构建。
  现在是了解 Jenkins 架构的正确时机。

Jenkins 架构

  让我们修改一下我在上一个博客中向您解释的独立 Jenkins 架构,下图描绘了相同的架构。

  单台 Jenkins 服务器不足以满足某些要求,例如:

  • 有时您可能需要几个不同的环境来测试您的构建。单个 Jenkins 服务器无法完成此操作。
  • 如果定期构建更大、更重的项目,则单个 Jenkins 服务器将无法简单地处理整个负载。
      为了满足上述需求,引入了 Jenkins 分布式架构。

    Jenkins 分布式架构

      Jenkins使用主从架构管理分布式构建。在这种架构中,主站和从站通过 TCP / IP 协议进行通信。

    Jenkins 主节点

      您的主要 Jenkins 服务器是主节点。主节点的工作是处理:

  • 调度构建作业。
  • 将构建分派给实际执行的从节点。
  • 监视从节点(可能根据需要使它们联机和脱机)。
  • 记录并显示构建结果。
  • Jenkins 的主节点也可以直接执行构建作业。

    Jenkins 从节点

      从节点是在远程计算机上运行的 Java 可执行文件。以下是 Jenkins 从节点的特点:

  • 接收来自 Jenkins 主接点的请求。
  • 从节点可以在各种操作系统上运行。
  • 从节点的工作就是按照命令执行,包括执行主节点分配的构建作业。
  • 您可以将项目配置为始终在特定的从节点或特定类型的从节点上运行,或者仅让 Jenkins 选择下一个可用的从节点。
      下图是不言自明的。它由一个 Jenkins 主节点管理三个 Jenkins 从节点。

      现在,让我们看一个示例,其中 Jenkins 用于在不同的环境中进行测试,例如:Ubuntu、MAC、Windows等。
      如下图所示:

      上图中执行以下功能:
  • Jenkins 会定期检查 Git 存储库中是否有任何源代码更改。
  • 每个构建都需要不同的测试环境,这对于单个Jenkins服务器是不可能的。为了在不同的环境中执行测试,Jenkins 使用了各种从节点,如图所示。
  • Jenkins 主节点要求这些从节点执行测试并生成测试报告。

    Jenkins 构建管道

      它用于了解 Jenkins 当前正在执行的任务。通常,几位开发人员会同时进行几项不同的更改,因此了解哪些更改正在测试中,哪些更改正在排队中或哪些构建已损坏是很有用的。这是管道出现的地方。Jenkins 管道为您提供了测试范围的概述。在构建管道中,整个构建被细分为多个部分,例如单元测试、验收测试、打包、报告和部署阶段。管道阶段可以串行或并行执行,如果一个阶段成功,它将自动移至下一个阶段(因此具有“管道”名称的相关性)。下图显示了多个构建管道的外观。

      希望你已经理解了理论概念。现在,让我们来体验一下动手的乐趣。
      我将在 Jenkins 创建一个新作业,这是一个自由式项目。然而,还有 3 个可用选项。让我们看一下 Jenkins 中可用的构建作业的类型。

    自由式项目:

      自由式构建作业是通用构建作业,它提供了最大的灵活性。自由式构建作业是最灵活和可配置的选项,可用于任何类型的项目。设置相对简单,我们在此处配置的许多选项也出现在其他构建作业中。

    多配置作业:

      “多配置项目”(也称为“矩阵项目”)允许您在不同的环境上运行相同的构建作业。它用于在不同环境、不同数据库甚至不同构建机器上测试应用程序。

    监视外部作业:

      通过“监视外部作业”构建作业,您可以关注非交互式流程,例如 cron 作业。

    Maven 项目:

      “ maven2/3 项目”是专门适应 Maven 项目的构建工作。Jenkins 理解 Maven pom 文件和项目结构,并且可以使用从 pom 文件中收集的信息来减少设置项目所需的工作。

    使用 Jenkins 创建一个构建

    第 1 步:在 Jenkins 界面主页中,选择 New Item

    第 2 步:输入名称并选择 Freestyle project

    第 3 步: 在下一页中,您可以指定作业配置。您会很快发现,创建新项目时有许多可用设置。在这个配置页面上,您还可以选择添加构建步骤来执行额外的操作,例如运行脚本。我将执行一个 shell 脚本。

      这将为您提供一个文本框,您可以在其中添加所需的任何命令。您可以使用脚本来运行各种任务,例如服务器维护、版本控制、读取系统设置等。我将使用它来运行简单的脚本。

    第 4 步:保存项目,您将进入项目概述页面。在这里,您可以查看有关项目的信息,包括其构建历史。

    第 5 步:点击左侧的 立即构建 开始构建。

    第 6 步:要查看更多信息,请在构建历史记录区域中单击该构建,随后您将进入带有构建信息概述的页面。

    第 7 步:控制台输出 链接页面对于详细检查作业结果特别有用。

    第 8 步:如果您回到 Jenkins 主页面,您将看到所有项目的概述及其信息,包括状态。

      生成状态通过两种方式表示,一种是天气图标,另一种是彩色球。 天气图标特别有用,因为它可以在一张图像中显示多个版本的记录。
      如上图所示,太阳代表着我的所有建造都是成功的。 球的颜色为我们提供了该特定构建的状态,在上图中,球的颜色为蓝色,这表示该特定构建成功了。