vlambda博客
学习文章列表

读书笔记《developing-java-applications-with-spring-and-spring-boot-ebook》春天的世界之旅

Chapter 1. Journey to the Spring World

Spring 是 JVM 平台的开源模块化 框架。 框架 是一个库集合,其主要目标是解决 常见 软件开发问题。框架应该以通用的形式解决这些问题。 

Rod Johnson 于 2002 年与他的书籍出版物一起创建了 Spring 框架,该书籍被称为 Expert One-on-One J2EE Design and Development。 The创建框架背后的想法是解决 Java 企业版的复杂性。

当时,这种解决方案非常关注基础设施的细节,使用该解决方案的开发人员会花费大量时间编写代码来解决基础设施问题。自创建以来,Rod Johnson 的主要关注点之一就是提高开发人员的生产力。

该框架最初被视为 Java 运行时环境的轻量级容器,并在社区中流行起来,尤其是由于依赖注入功能。该框架使依赖注入非常容易。开发人员以前从未见过这样的功能,因此,全世界的人都 过度 采用了这个项目。年复一年,它在软件开发领域的流行度一直在增加。

在最早的版本中,框架必须使用 XML 文件来配置容器。在当时,这比 J2EE 应用程序要好得多,因为 J2EE 应用程序需要创建许多 Ant 文件来创建样板类和接口。

该框架一直被视为 Java 平台的一项先进技术,但在 2014 年,Spring 团队推出了 Spring Boot 平台。这个平台在 Java Enterprise 生态系统中取得了令人难以置信的成功,它改变了开发人员构建 Java Enterprise 应用程序的方式。

今天,春天事实上的 Java 开发框架,世界各地的公司都在他们的系统中使用它。社区充满活力,并以不同的方式为开发做出贡献,例如打开问题、添加代码以及在全球最重要的 Java 会议上讨论框架。让我们看看和玩一下这个著名的 Java 开发者框架。

我们将在本章中介绍以下主题:

  • Main modules of the Spring Framework
  • Spring annotations for each module
  • Setting up the development environment
  • Docker and Docker commands

Spring modularity


framework 自成立以来就特别关注模块化。这是一个重要的框架特性,因为它使框架成为不同架构风格和应用程序不同部分的绝佳选择。

这意味着该框架不是一个固执己见的全栈框架,它规定了使一切正常运行的规则。我们可以根据需要使用该框架,并将其与广泛的规范和第三方库集成。

例如,对于门户 Web 应用程序,Spring MVC 支持模板引擎和 REST 端点等功能,并将它们与流行的 JavaScript 框架 AngularJS 集成。

此外,如果应用程序需要支持分布式系统,该框架可以提供一个名为 Spring Cloud 的惊人模块,它具有分布式环境的一些基本功能,例如服务注册和发现、断路器、智能路由和客户端负载均衡。

Spring 使用不同的语言(例如 Java、Kotlin 和 Groovy)使 Java Runtime 的开发应用程序变得容易(您可以选择风格并使开发任务变得有趣)。

它分为各种模块。主要的模块如下:

  • Spring Core
  • Spring Data
  • Spring Security
  • Spring Cloud
  • Spring Web-MVC

在本书中,我们将介绍 Java 企业应用程序中最常见的解决方案,包括很棒的 Spring Cloud 项目。此外,我们还可以找到一些有趣的项目,例如 Spring Batch 和 Spring Integration,但这些项目是针对特定需求的。

Spring Core Framework

这个 module 是框架的基础,包含对依赖注入的基本支持,Spring 支持的 Web 功能 MVC (model-view-controller) 和全新的 WebFlux 框架和面向方面的编程。此外,该模块支持 JDBC、JMS、JPA 的基础和管理事务的声明性方式。我们将对其进行探索并了解该模块的主要项目。所以让我们开始吧!

Core container

core 容器是整个 Spring ecosystem 并包含四个组件——核心、bean、上下文和表达式语言。

Core 和 beans 负责提供框架的基础和 dependency 注入。这些模块负责管理 IoC 容器,主要功能是实例化、配置和销毁 Spring 容器中的对象居民。

Note

Spring 上下文也称为 Spring IoC 容器,它负责通过从配置文件中的 XML、Java 注释和/或 Java 代码读取配置元数据来实例化、配置和组装 bean。

这些模块中有两个关键接口——BeanFactoryApplicationContextBeanFactory 负责 bean 的生命周期、实例化、配置、管理和销毁,而 ApplicationContext 帮助开发人员使用以通用方式文件资源,允许将事件发布到已注册的侦听器。此外,ApplicationContext 支持国际化并能够处理不同语言环境中的消息。  

这些模块帮助上下文组件提供一种访问容器内对象的方法。上下文组件具有 ApplicationContext 接口以及容器的基本类。

Note

一些常见的注解有 @Service@Component@Bean、和@Configuration

Spring Messaging

Spring Framework 支持广泛的消息传递系统。 Java 平台被公认为为消息传递应用程序提供出色的支持,Spring Framework 遵循这种方法并提供了各种项目来帮助开发人员编写功能强大的应用程序,从而提高生产力并减少基础设施代码行。这些项目的基本思想是提供一些模板类,这些类具有与消息传递系统交互的便捷方法。

此外,该项目还提供了一些侦听器注释,以支持侦听来自代理的消息。该框架维护不同项目的标准。一般来说,注解的前缀是消息系统的名称,例如@KafkaListener

该框架提供了许多抽象来以通用方式创建消息传递应用程序。这是有趣的东西,因为应用程序需求在应用程序生命周期中会发生变化,并且消息代理解决方案也可能会发生变化。然后,只需稍加改动,使用 Spring 消息模块构建的应用程序就可以在不同的代理中工作。这是目标。

Spring AMQP

这个子项目支持Spring Framework中的AMQP协议。它提供了一个与消息代理交互的模板。模板就像一个超高级 API,支持 sendreceive 操作。 

该集合中有两个项目:spring-amqp,例如可用于 ActiveMQ,以及 spring-rabbit,这增加了对 RabbitMQ 代理的支持。该项目支持通过 API 进行代理管理,以声明队列、绑定和交换。

这些项目鼓励大量使用核心容器提供的 dependency 注入,因为它们使配置更具声明性和易于理解.

如今,RabbitMQ 代理是消息传递应用程序的流行选择,Spring 为客户端交互提供了全面支持,直至管理任务级别。

Note

一些常见的注解是 @Exchange 和 @QeueueBinding

Spring for Apache Kafka

Spring for Apache Kafka 支持 基于代理的 Apache Kafka 应用程序。它提供了一个高级 API 来与 Apache Kafka 交互。在内部,这些项目使用 Kafka Java API。

该模块支持注解编程模型。基本思想是,通过几个注释和一些 POJO 模型,我们可以引导应用程序并开始监听和生成消息。

KafkaTemplate 是这个项目的中心类。它使我们能够使用高级 API 向 Apache Kafka 发送消息。也支持异步编程。

该模块通过注释提供对事务的支持。此功能通过基于 Spring 的应用程序中使用的标准事务注释启用,例如 @Transactional

我们还了解了 Spring AMQP。本项目添加了基于此代理创建应用程序的 Spring 概念。还支持依赖注入功能。

Note

一些常见的注解是 @EnableKafka 和 @KafkaListener

 

 

 

 

Spring JMS

该项目的idea 提供了与 Spring Framework 项目的想法的 JMS 集成,并提供了与经纪人交互的高级 API . JMS 规范最糟糕的部分是它有很多样板代码来管理和关闭连接。

JmsTemplate 是这个模块的中心类,它使我们能够向代理发送消息。 JMS 规范有很多内在的行为来处理资源的创建和释放,例如,JmsTemplate 类自动为开发者完成这些任务。

该模块还支持 transactional 要求。  JmsTransactionManager 是处理 Spring JMS 模块的事务行为的类。

Spring 删除了带有几个注释的样板代码。该框架增加了代码的可读性,并使代码更直观。

Note

一些常见的注解是 @JmsListener 和 @EnableJms

Spring Web MVC

该模块是 Spring Team 为支持 Spring Framework 中的 Web 应用程序而构建的第一个模块。该模块使用 Servlet API 作为其基础,然后这些 Web 应用程序必须遵循 Servlet 规范并部署到 servlet 容器中。在 5.0 版本中,Spring 团队创建了一个响应式 Web 框架,本书稍后将介绍该框架。

Spring Web MVC 模块是使用前端控制器模式开发的。在创建框架时,这种模式是许多框架的常见选择,例如 Struts 和 JSF 等。在底层,Spring 中有一个名为 DispatcherServlet 的主要 servlet。此 servlet 将通过算法重定向以完成所需的工作。

它使开发人员能够在 Java 平台上创建令人惊叹的 Web 应用程序。框架的这一部分为开发此类应用程序提供了全面支持。为此目的有一些有趣的功能,例如对国际化的支持和对处理 cookie 的支持。此外,当应用程序需要处理上传文件并支持路由请求时,多部分请求是一个令人兴奋的功能。 

这些特性对于大多数 Web 应用程序来说都很常见,并且该框架对这些特性有很好的支持。这种支持使框架成为此类应用程序的不错选择。在第 2 章中,从 Spring World 开始 - CMS 应用程序, 我们将使用此模块创建一个应用程序,并将深入探讨主要功能。

该模块完全支持注释编程 从声明 HTTP 端点直到将请求属性包装在 HTTP 请求中。 它使应用程序非常可读,无需样板代码即可获取请求参数,例如。

Web 应用程序方面,它使开发人员能够使用强大的模板引擎,例如 Thymeleaf 和 Freemarker。它与路由功能和 bean 验证完全集成。

此外,该框架允许开发人员使用此模块构建 REST API。鉴于所有这些支持,该模块已成为 Spring 生态系统中的最爱。开发人员已开始使用此堆栈创建 API,一些重要的公司已开始使用它,特别是考虑到该框架提供了一种轻松浏览注释的方法。正因为如此,Spring 团队在 4.0 版本中添加了新的注解 @RestController

我们将在这个模块上做很多工作。逐章,我们将学习有关框架这一部分的有趣内容。

Note

一些常见的注解有 @RequestMapping@Controller@Model、  @RestController 和 @RequestBody

Spring WebFlux

Spring 5.0 中引入的新模块 Spring WebFlux 可用于实现使用 Reactive Streams 构建的 Web 应用程序。这些系统具有非阻塞特性,部署在servers构建于Netty之上,例如Undertown和servlet containers< /span> 支持 + 3.1。

Note

Netty 是一个开源框架,可帮助开发人员创建网络应用程序,即使用异步、事件驱动模式的服务器和客户端。 Netty 提供了一些有趣的优势,例如更低的延迟、高吞吐量和更少的资源消耗。您可以在 https://netty.io 找到更多信息。

该模块支持基于Spring MVC模块的注解,如@GetMapping@PostMapping等。这是一个重要功能,使我们能够迁移到这个新版本。当然,一些调整是必要的,比如添加 Reactor 类(Mono 或 Flux)。

此模块满足现代 Web 要求,可处理大量 concurrent 通道,其中线程每请求模型不是一个选项.

我们将在第 3 章中了解此模块,使用 Spring Data 添加持久性并将其放入 Reactive 时尚 并基于 Reactive Streams 实现一个完全 Reactive 应用程序.

Note

一些常见的注解是 @RequestMapping@RestController和 @RequestBody

Spring Data

Spring Data 是一个有趣的模块,它提供了使用基于 Spring 的编程来管理应用程序数据的最简单方法。该项目是一个伞形项目,其子项目支持不同的数据库技术,甚至是关系和非关系数据库。 Spring 团队支持部分数据库技术,如 Apache Cassandra、Apache Solr、Redis 和 JPA 规范,社区维护其他令人兴奋的项目,例如 ElasticSearch、Aerospike、DynamoDb 和 Couchbase。完整的项目列表可以在 http://projects.spring.io/spring 找到-数据

目标是从持久性代码中删除样板代码。一般来说,数据访问层是非常相似的,即使在不同的项目中,也只是项目模型不同,而 Spring Data 提供了一种强大的方式来映射域模型和存储库抽象。

 

有一些中央接口;它们是一种指示框架选择正确实现的标记。在后台,Spring 将创建一个代理并委托正确的实现。这里令人惊奇的是,开发人员不必编写任何持久性代码然后处理这些代码;他们只需选择所需的技术,其余的由 Spring 负责。

中心接口是 CrudRepositoryPagingAndSortingRepository,它们的名称是不言自明的。 CrudRepository 实现了 CRUD 行为,例如 create, retrieval, updatedeletePagingAndSortingRepositoryCrudRepository 并添加了一些功能,例如分页和排序。通常,我们会找到这些接口的派生类,如 MongoRepository,它与MongoDB数据库技术交互。

Note

一些常见的注解是 @Query@Id和 @EnableJpaRepositories

Spring Security

Java 应用程序的安全性一直是开发人员的痛点,尤其是在 Java 企业版中。有很多样板代码用于在应用程序服务器中查找对象,并且安全层通常是为应用程序大量定制的。

在那种混乱的情况下,Spring 团队决定创建一个 Spring Security 项目来帮助开发人员处理 Java 应用程序上的安全层.

一开始,该项目广泛支持 Java Enterprise Edition 并与 EJB 3 安全注释集成。如今,该项目支持许多不同的方式来处理 Java 应用程序的授权和身份验证。

Spring Security 提供了一个综合模型来为 Java 应用程序添加授权和身份验证。该框架可以配置几个注释,这使得添加安全层的任务非常容易。其他重要特征涉及如何扩展框架。有一些接口可以让开发者自定义框架的默认行为,使框架针对不同的应用需求进行定制。

它是一个伞形项目,它被细分为以下模块:

  • spring-security-core
  • spring-security-remoting
  • spring-security-web
  • spring-security-config
  • spring-security-ldap
  • spring-security-acl
  • spring-security-cas
  • spring-security-openid
  • spring-security-test

这些是主要模块,还有许多其他项目可以支持各种类型的身份验证。该模块涵盖以下身份验证和授权类型:

  • LDAP
  • HTTP Basic
  • OAuth
  • OAuth2
  • OpenID
  • CAAS
  • JAAS

该模块还提供了领域特定语言DSL提供一个简单的配置。让我们看一个 simple 示例:

http
  .formLogin()
    .loginPage("/login")
     .failureUrl("/login?error")
      .and()
    .authorizeRequests()
      .antMatchers("/signup","/about").permitAll()
      .antMatchers("/admin/**").hasRole("ADMIN")
      .anyRequest().authenticated();

Note

该示例摘自 spring.io 博客。更多详情,请前往 https://spring.io/blog/2013/07/11/spring-security-java-config-preview-readability/

 

正如我们所看到的,DSL 使配置任务变得非常简单且易于理解。

Spring Security 的主要特点如下:

  • Session management
  • Protection against attacks (CSRF, session fixation, and others)
  • Servlet API integration
  • Authentication and authorization

我们将在第 8 章断路器和安全中了解有关 Spring Security 的更多信息。我们还将 付诸实践。

Note

@EnableWebSecurity 是常用的注解。

Spring Cloud

Spring Cloud 是另一个 伞形项目。该项目的主要目标是帮助开发人员创建分布式系统。分布式系统有一些常见的问题需要解决,当然还有一组模式可以帮助我们,例如服务发现、断路器、配置管理、智能路由系统和分布式会话。 Spring Cloud 工具拥有所有这些实现 和有据可查的项目。

主要项目如下:

  • Spring Cloud Netflix
  • Spring Cloud Config
  • Spring Cloud Consul
  • Spring Cloud Security
  • Spring Cloud Bus
  • Spring Cloud Stream

 

 

Spring Cloud Netflix

Spring Cloud Netflix也许是当今最流行的Spring模块。这个 fantastic 项目允许我们通过 Spring Boot AutoConfiguration 功能将 Spring 生态系统与 Netflix OSS 集成。受支持的 Netflix OSS 库包括用于服务发现的 Eureka、用于启用客户端负载平衡的 Ribbon、通过 Hystrix 的断路器以保护我们的应用程序免受外部中断并使系统具有弹性,Zuul 组件提供智能路由并可以充当边缘服务。最后,Feign 组件可以帮助开发人员通过几个注解为 REST API 创建 HTTP 客户端。

让我们来看看其中的每一个:

  • Spring Cloud Netflix Eureka: The focus of this project is to provide service discovery for applications while conforming to Netflix standards. Service discovery is an important feature and enables us to remove hardcoded configurations to supply a hostname and ports; it is more important in cloud environments because the machine is ephemeral, and thus it is hard to maintain names and IPs. The functionality is quite simple, the Eureka server provides a service registry, and Eureka clients will contact its registers themselves.

Note

一些常见的注解是 @EnableEurekaServer@EnableEurekaClient

  • Spring Cloud Feign: The Netflix team created the Feign project. It's a great project that makes the configuration of HTTP clients for REST applications significantly easier than before. These implementations are based on annotations. The project supplies a couple of annotations for HTTP paths, HTTP headers, and much more,and of course, Spring Cloud Feign integrates it with the Spring Cloud ecosystem through the annotations and autoconfiguration. Also, Spring Cloud Feign can be combined with the Eureka server.

Note

一些常见的注解是 @EnableFeignClients 和 @FeignClient

 

  • Spring Cloud Ribbon: Ribbon is a client-side load balancer. The configuration should mainly provide a list of servers for the specific client. It must be named. In Ribbon terms, it is called the named client. The project also provides a range of load-balancing rules, such as Round Robin and Availability Filtering, among others. Of course, the framework allows developers to create custom rules. Ribbon has an API that works, integrated with the Eureka server, to enable service discovery, which is included in the framework. Also, essential features such as fault tolerance are supported because the API can recognize the running servers at runtime.

Note

一些常见的注解是 @RibbonClient 和 @LoadBalanced

  • Spring Cloud Hystrix: An acclaimed Netflix project, this project provides a circuit breaker pattern implementation. The concept is similar to an electrical circuit breaker. The framework will watch the method marked with @HystrixCommand and watch for failing calls. If the failed calls number more than a figure permitted in configuration, the circuit breaker will open. While the circuit is open, the fallback method will be called until the circuit is closed and operates normally. It will provide resilience and fault-tolerant characteristics for our systems. The Spring ecosystem is fully integrated with Hystrix, but it works only on the @Component and @Service beans.

Note

一些常见的注解是 @EnableCircuitBreaker@HystrixCommand

Spring Cloud Config

这个激动人心的project提供了一种简单的方式 管理分布式系统的系统配置,这在云环境中是一个关键问题,因为文件系统是短暂的。它还帮助我们维护部署管道的不同阶段。 Spring 配置文件与此模块完全集成。

 

我们将需要一个为其他应用程序提供配置的应用程序。我们可以通过思考 serverclient 的概念来理解它的工作原理, 服务器会通过HTTP提供一些配置,客户端会在服务器上查找配置。此外,还可以加密和解密属性值。

有一些存储实现来提供这些属性文件,默认实现是 Git。它使我们能够将我们的属性文件存储在 Git 中,或者我们也可以使用文件系统。这里重要的是来源无关紧要。

Note

Git 是一个分布式版本控制。该工具通常用于开发目的,尤其是在开源社区中。当您将其与一些市场参与者(例如 SVN)进行比较时,主要优势是 分布式架构

Spring Cloud Bus 集成 span> 和 this 模块。如果它们被集成,则可以在集群上广播配置更改。如果应用程序配置随频率变化,这是一项重要功能。有两个注解告诉 Spring 在运行时应用更改: @RefreshScope 和 @ConfigurationProperties

在第 7 章, 机票系统我们将使用这个模块实现一个令人兴奋的服务来为我们的微服务提供外部配置。将更详细地解释服务器概念。还将提供客户详细信息。

Note

  @EnableConfigServer 是常用的注解。

Spring Cloud Consul

Spring Cloud Consul 为 Hashicorp 的 Consul 提供 integrations。该工具以与服务发现、分布式配置和控制总线相同的方式解决问题。这个模块允许我们在基于 Spring 的编程模型中使用一些 注释 来配置 Spring 应用程序和 Consul。也支持自动配置。这里的神奇之处在于,该模块可以分别通过 Spring Cloud Zuul 和 Spring Cloud Ribbon 与一些 Netflix OSS 库,例如 Zuul 和 Ribbon 集成(例如)。

 

Note

@EnableDiscoveryClient 是常用的注解。 

Spring Cloud Security

该模块类似于 Spring Security 的扩展。但是,分布式系统对安全性有不同的要求。通常,它们具有中央身份管理,或者在 REST API 的情况下,身份验证取决于客户端。通常,在分布式系统中,我们有微服务,这些服务在运行时环境中可能有多个实例,其特性使得身份验证模块与单体应用程序略有不同。该模块可以与 Spring Boot 应用程序一起使用,并通过几个 annotations 和一些配置使 OAuth2 实现变得非常容易.此外,还支持一些常见模式,例如单点登录、令牌中继和令牌交换。

对于基于 Spring Cloud Netflix 的微服务应用程序,它特别有趣,因为它使下游身份验证能够与 Zuul 代理一起工作,并提供来自 Feign 客户端的支持。拦截器用于获取令牌。

Note

一些常见的注释是 @EnableOAuth2Sso 和 @EnableResourceServer

Spring Cloud Bus

该项目的主要目标是提供一种简单的方法来广播遍布整个集群的更改。应用程序可以通过消息代理连接分布式系统节点。

它为开发人员提供了一种使用 SpringApplicationContext 的简单方法来创建发布和订阅机制indexterm"> 容器。它使 可能性 能够使用 Spring 生态系统的事件驱动架构风格创建应用程序。

要创建自定义事件,我们需要从 RemoteApplicationEvent 创建一个子类并通过 @RemoteApplicationEventScan

The projects support three message brokers as the transport layer:

  • AMQP
  • Apache Kafka
  • Redis

Note

@RemoteApplicationEventScan 是常用的注解。 

Spring Cloud Stream

这个模块背后的想法是提供一种构建消息驱动微服务的简单方法。该模块具有 自以为是的 配置方式。这意味着我们需要遵循一些规则来创建这些配置。通常,应用程序由 yaml|properties 文件配置。

该模块也支持注释。这意味着 一对注释就足以 创建消费者、生产者和绑定;它解耦了应用程序并使其易于理解。 它围绕消息代理和通道提供了一些抽象,它也使开发人员的生活更加舒适和高效。

Spring Cloud Stream 具有 RabbitMQ 和 Kafka 的 Binder 实现。

Note

一些常见的注解是 @EnableBinding@Input和 @Output

Spring Integration

该模块支持很多Enterprise 应用程序模式,并将Spring 编程模型引入该主题。 Spring 编程模型支持广泛的依赖注入支持,并且以注解编程为中心。注释指导我们如何配置框架并定义框架行为。

建议使用 POJO 模型,因为它简单且在 Java 开发世界中广为人知。

该项目与其他模块有一些交集。其他一些项目使用这些模块概念来完成他们的工作。例如,有一个名为 Spring Cloud Stream 的项目。

企业集成模式基于广泛的通信渠道、协议和模式。这个项目支持其中的一些。

这些模块支持多种功能和通道,例如:

  • Aggregators
  • Filters
  • Transformers
  • JMS
  • RabbitMQ
  • TCP/UDP
  • Web services
  • Twitter
  • Email
  • And much more

企业应用集成的三个主要概念:

  • Messages
  • Message channel
  • Message endpoint

最后,Spring Integration 模块提供了一种创建应用程序集成的综合方法,并使开发人员能够使用出色的支持来完成它。

Note

一些常见的注解是 @EnableIntegration@IntegrationComponentScan 和 @EnablePublisher

Spring Boot

Spring Boot 于 2014 年发布。该项目背后的 idea 是提供一种在任何容器外部署 Web 应用程序的方法,如 Apache Tomcat、Jetty 等。这种部署的好处是独立于任何外部服务。它允许我们使用一个 JAR 文件运行 Web 应用程序。如今,这是一种极好的方法,因为这是采用 DevOps 文化的最自然的方式。

Spring Boot 提供嵌入式 servlet 容器,例如 Apache Tomcat、Jetty 和 Undertow。在测试我们的 Web 应用程序时,它使开发过程更加高效和舒适。此外,通过配置文件或提供一些 bean 允许在配置期间进行自定义。

采用 Spring Boot 框架有一些优势。该框架不需要任何 XML 进行配置。这是一件了不起的事情,因为我们将在 Java 文件中找到所有依赖项。这有助于 IDE 协助开发人员,并提高代码的可追溯性。另一个重要的优点是该项目尽可能保持配置自动化。一些注释使魔术发生。这里有趣的是,Spring 将注入在运行时生成的任何代码的实现。

Spring Boot 框架还提供了一些有趣的功能来帮助开发人员和操作,例如健康检查、指标、安全和配置。这对于在微服务架构中分解模块的现代应用程序来说是必不可少的。

还有一些其他有趣的功能可以帮助开发人员进行 DevOps。我们可以使用 application-{profile}.properties 或者 application.yaml 文件来配置不同的运行时配置文件,例如开发、测试和生产。这是一个非常有用的 Spring Boot 功能。

此外,该项目完全支持测试,从 Web 层到存储库层。

该框架提供了一个高级 API 来处理单元和集成测试。此外,该框架为开发人员提供了许多注释和帮助类。

Spring Boot 项目是一个生产就绪框架,具有针对 Web 服务器、指标和监控功能的默认优化配置,可帮助开发团队交付高质量的软件。

我们可以通过使用 Groovy 和 Java 语言编写代码来开发应用程序。两者都是 JVM 语言。在 5.0 版本中,Spring 团队宣布全面支持 Kotlin,这是 JVM 的新语言。它使我们能够开发一致且可读的代码。我们将在第 7 章,航空公司票务系统中深入探讨这个特性。

Setting up our development environment


在开始之前,我们需要设置我们的开发环境。我们的 development 环境由以下四个工具组成:

  • JDK
  • Build tool
  • IDE 
  • Docker

我们将安装 JDK 8.0 版。 Spring Framework 5 完全支持此版本。我们将介绍安装 Maven 3.3.9 的步骤,这是最著名的 Java 开发构建工具,在最后一部分,我们将向您展示如何安装 IntelliJ IDEA 的一些详细说明社区版。我们将使用 Ubuntu 16.04,但您可以使用自己喜欢的操作系统。安装步骤很简单。

Installing OpenJDK

OpenJDK 是一个稳定、免费和开源的 Java 开发 工具包。与代码编译和运行时环境相关的所有内容都需要此包。 

此外,也可以使用 Oracle JDK,但您应该注意 许可和协议。 

要安装 OpenJDK,我们将打开一个终端并运行以下命令:

sudo apt-get install openjdk-8-jdk -y

Note

我们可以在安装部分(http:// openjdk.java.net/install/) 的 OpenJDK 页面。

使用 以下 命令检查安装:

java -version

您应该会看到如下所示的 OpenJDK 版本及其相关详细信息:

读书笔记《developing-java-applications-with-spring-and-spring-boot-ebook》春天的世界之旅

现在我们已经安装了 Java 开发工具包,我们准备好进行下一步了。在现实世界中,我们必须有一个构建工具来帮助开发人员编译、打包和测试 Java 应用程序。

让我们在下一节安装 Maven。

Installing Maven

Maven 是一种流行的 Java 开发构建工具。一些重要 开源项目是使用此工具构建的。有一些功能可以促进构建过程,标准化项目结构,并为最佳实践开发提供一些指导。

我们将安装 Maven,但安装步骤应在安装 OpenJDK 之后执行。

打开终端并执行以下命令:

sudo apt-get install maven -y

使用以下命令检查安装:

mvn -version

您应该会看到 以下 输出,尽管版本可能对您不同:

读书笔记《developing-java-applications-with-spring-and-spring-boot-ebook》春天的世界之旅

做得好。现在我们已经安装了 Maven。 Maven 拥有一个充满活力的社区,该社区产生许多插件来帮助开发人员完成重要任务。有用于执行单元测试的插件和用于为发布事件准备项目的插件,这些插件可以与 SCM  软件集成。

我们将使用 spring boot maven 插件和 docker maven 插件。第一个将我们的应用程序转换为 JAR 文件,第二个使我们能够与 Docker Engine 集成以创建图像、运行容器等等。在接下来的几章中,我们将学习如何配置这些插件并与之交互。

Installing IDE

IDE 是帮助开发人员的重要工具。在本书中,我们将使用 IntelliJ IDEA 作为官方工具来开发我们的项目。其他 IDE 没有任何限制,因为该项目将使用 Maven 作为构建工具进行开发。 

IDE 是开发人员的个人选择,总的来说,它涉及激情;有些人喜欢,其他开发人员讨厌。请随意使用您喜欢的。

IntelliJ IDEA

IntelliJ IDEA 是 JetBrains 产品。我们将使用社区版,它是开源的,是编写 Java 和 Kotlin 代码的绝佳工具。该工具提供了出色的自动完成功能,并且 完全支持 Java 8 功能。

转到 https://www.jetbrains.com/idea/download /#section=linux 并下载社区版。我们可以提取 tar.gz 并执行它。

 

Spring Tools Suite

当然,Spring Tools Suite 基于 Eclipse IDE,由 Eclipse Foundation 提供。目标是为 Spring 生态系统提供支持,让开发人员的生活更轻松。此工具支持 Beans Explorer 等有趣的功能

在以下链接下载工具:http://download.springsource.com/release/STS/3.6.4.RELEASE/dist/ e4.4/groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-linux-gtk-x86_64.tar.gz

Installing Docker

Docker 是一个开源项目,可以帮助人们运行和管理容器。对于开发人员而言,Docker 在开发生命周期的不同阶段提供帮助。

在开发阶段,Docker 使开发人员能够启动不同的基础设施服务,例如数据库和服务发现,例如 Consul,而无需安装在当前系统中运行。它有助于开发人员,因为开发人员不需要在操作系统层安装这些类型的系统。通常,此任务可能会在安装过程中与库发生冲突并消耗大量时间。

有时,开发人员需要安装确切的版本。在这种情况下,有必要在预期版本上重新安装整个应用程序。这不是一件好事,因为这段时间开发者机器变慢了。原因很简单,在软件开发过程中使用了许多应用程序。

Docker 在这个阶段帮助开发者。使用 MongoDB 运行容器非常简单。无需安装,开发者只需一行代码即可启动数据库。 Docker 支持镜像标签。此功能有助于使用不同版本的软件;这对于每次都需要更改软件版本的开发人员来说非常棒。

另一个优势是,当开发人员需要交付工件以用于测试或生产目的时,Docker 通过 Docker 映像启用这些任务。

Docker 帮助人们采用 DevOps 文化,并提供了惊人的功能来提高整个过程的性能。

 

让我们安装 Docker。

安装 Docker 的最简单方法是下载位于 https://get.docker.com:

curl -fsSL get.docker.com -o get-docker.sh

下载完成后,我们将执行脚本如下:

sh get-docker.sh

等待脚本执行,然后使用以下命令检查 Docker 安装:

docker -v

输出需要如下所示:

读书笔记《developing-java-applications-with-spring-and-spring-boot-ebook》春天的世界之旅

Note

有时,可以增加 Docker 的版本,版本至少应该是 17.10.0-ce

最后,我们将当前用户添加到 Docker 组,这使我们能够使用没有 sudo 关键字的 Docker 命令行。键入以下命令:

sudo usermod -aG docker $USER

我们需要注销才能使这些更改生效。通过键入以下内容确认命令是否按预期工作。确保 sudo 关键字不存在:

docker ps

输出应如下所示:

读书笔记《developing-java-applications-with-spring-and-spring-boot-ebook》春天的世界之旅

 

 

Introducing Docker concepts

现在,我们将介绍一些 Docker 概念。这本书不是关于 Docker 的,但是在接下来的几章中,需要一些关于如何使用 Docker 的基本说明来与我们的容器交互。 Docker 是一个事实上的工具,用于管理容器。

Docker images

Docker 镜像 就像一个 Docker 容器的模板。它包含一组启动 Docker 容器所需的文件夹和文件。我们永远不会有图像处于执行模式。该镜像为 Docker Engine 提供了一个模板来启动容器。我们可以创建一个与面向对象的类比来更好地理解这个过程。图像就像一个类,提供了一个 infrastructure 来实例化一些对象,而实例就像一个容器。

此外,我们有一个 Docker 注册表来存储我们的图像。这些注册表可以是公共的或私有的。一些云供应商提供这些私有注册表。最著名的是 Docker Hub。它可以是免费的,但如果您选择此选项,图像应该是公开的。当然,Docker Hub 支持私有镜像,但是在这种情况下,你必须为服务付费。

Containers

Docker 容器是一种轻量级虚拟化。轻量级一词意味着 Docker 使用 SO 功能来控制系统进程并管理内存、处理器和文件夹。这与使用 VM 的虚拟化不同,因为在这种模式下,该技术需要模拟整个 SO、驱动程序和存储。此任务消耗大量计算能力,有时可能效率低下。

Docker networks

Docker 网络是为容器提供运行时隔离的层。它是一种沙箱,可以在其中运行与其他容器隔离的容器。安装 Docker 后,默认情况下会创建三个不应删除的网络。这三个网络如下:

  • bridge
  • none
  • host

 

此外,Docker 为用户提供了一种创建网络的简单方法。为此,Docker 提供了两个驱动程序——bridge< /span> 和 覆盖

Bridge 可以用于本地环境,这意味着在单个主机上允许这种网络。它将对我们的应用程序有用,因为它促进了容器之间关于安全性的隔离。这是一个很好的做法。连接到这种网络的容器的名称可以用作容器的 DNS。在内部,Docker 会将容器名称与容器 IP 相关联。

覆盖网络提供了将容器连接到不同机器的能力。 Docker Swarm 使用这种网络来管理集群环境中的容器。在最新版本中,Docker Compose 工具原生支持 Docker Swarm。

Docker volumes

Docker 卷是在容器外保存数据的建议方法。这些卷完全由 Docker Engine 管理,当它们与 Docker 命令行。这些卷的数据保存在主机的目录路径中。

有一个与卷交互的命令行工具。这个工具的基础 是docker volume command; the--help argument  end 显示帮助说明。

Docker commands

现在我们来看看 Docker 命令。这些命令主要用在开发生命周期,spin up containerstop containers删除检查

Docker run

docker run 是最常见的 Docker 命令。此 command 应该用于启动容器。命令的基本结构如下:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

 

options 参数启用容器的一些配置,例如,      --name 参数允许您为容器配置名称。当容器在桥接网络中运行时,DNS 很重要。

网络设置也可以在run命令中配置,参数为  --网络。这使我们能够配置容器将附加到的网络。 

另一个重要的选项是分离的。它指示容器是否将在后台运行。 -d 参数指示 Docker 在后台运行容器。

Docker container

docker container 命令允许您管理 容器。有很多命令,如下表所示:

  • docker container attach
  • docker container commit
  • docker container cp
  • docker container create
  • docker container diff
  • docker container exec
  • docker container export
  • docker container inspect
  • docker container kill
  • docker container logs
  • docker container ls
  • docker container pause
  • docker container port
  • docker container prune
  • docker container rename
  • docker container restart
  • docker container rm
  • docker container run
  • docker container start
  • docker container stats

 

  • docker container stop
  • docker container top
  • docker container unpause
  • docker container update
  • docker container wait

这里有一些重要的命令。 docker container exec 允许您在正在运行的容器上运行命令。这是调试或查看容器文件内部的一项重要任务。 docker container prune 删除停止的容器。这对开发周期很有帮助。有一些已知的命令,如docker container rmdocker container startdocker container停止docker容器重启。这些命令是不言自明的并且具有相似的行为。

Docker network

docker network 命令enable 你来管理Docker< /span> 通过命令行网络的东西。有六个基本命令,命令不言自明:

  • docker network create
  • docker network connect
  • docker network ls
  • docker network rm
  • docker network disconnect
  • docker network inspect

docker network createdocker network lsdocker network rm 是主要命令。可以将它们与 Linux 命令进行比较,其中 rm 命令用于删除内容,而 ls 命令是通常用于列出诸如文件夹之类的东西。  create 命令应该用于创建网络。

docker network connectdocker network disconnect 命令允许您将正在运行的容器连接到所需的网络。它们在某些情况下可能很有用。

最后,docker network inspect 命令提供了所请求网络的详细信息。

 

Docker volume

docker volume 命令permits 你管理Docker< /span> 卷通过命令行界面。有五个命令:

  • docker volume create
  • docker volume inspect
  • docker volume ls
  • docker volume prune
  • docker volume rm

docker volume createdocker volume rmdocker volume ls 命令被 Docker Engine 有效地用于管理 docker volume。这些行为与网络的行为非常相似,但对于卷而言。 create 命令将创建一个允许某些选项的新卷。 ls 命令列出所有卷, rm 命令将删除请求的卷。

Summary


在本章中,我们研究了 Spring Framework 的主要概念。我们了解了框架的主要模块以及这些模块如何帮助开发人员在不同类型的架构中构建应用程序,例如消息传递应用程序、REST API 和 Web 门户。

我们还花了一些时间通过安装 Java JDK、Maven 和 IDE 等基本工具来准备我们的开发环境。在我们继续下一章之前,这是一个关键的步骤。 

我们使用 Docker 来帮助我们建立一个开发环境,例如用于数据库的容器以及在 Docker 镜像中为我们的应用程序交付。我们安装了 Docker 并查看了用于管理容器、网络和卷的主要命令。

在下一章中,我们将创建我们的第一个 Spring 应用程序并将其付诸实践!