Netflix构建了一个Spring应用生成器以提高开发生产力。你也可以。

工程 | Ben Wilcock | 2020年2月24日 | ...

如果你观看了Netflix的Taylor Wicksell在SpringOne Platform上的主题演讲,你一定会对他们工程团队惊人的生产力感到震撼。去年,超过300个基于Spring的应用投入生产——这是一项了不起的成就。

Taylor Wicksell of Netflix's SpringOne Platform Keynote

你的企业能从Netflix学到什么?

在Netflix,Taylor和他的Java平台团队负责Java开发者的体验(DevEx)。Taylor团队只有一个使命:帮助Netflix的工程师保持高生产力——以极快的速度交付高质量的代码。这个使命显然已经取得了成功。

Netflix's Java Platform Team's Top Technical Priorities

泰勒生产力秘诀清单中的首位是应用程序生成器。Netflix 发现,当开发者所需的一切都唾手可及,可以立即开始时,他们采用平台的速度会更快。应用程序生成器通过提供有用的引导,减少重复劳动,减轻开发者的负担,帮助他们快速启动。应用程序生成器还鼓励针对常见问题采取通用方法——如果您有许多团队同时创建微服务,这一点尤其有用。

泰勒清单中排名靠前的还有简化对重要库的访问。每个企业都有自己的库——它们依赖这些库来简化任务或处理底层细节。这些库非常重要,通常包含专有的业务逻辑,这些逻辑既是私有的又是独特的。应用程序生成器可以帮助开发者轻松访问这些库,而无需深入研究文档、浏览 Wiki 或在 Maven 存储库中搜索。

应用程序生成器有用吗?

是的。您可能已经在使用应用程序生成器了。我能想到的最好的例子是 start.spring.io,也称为“Spring Initializr”(尽管也存在其他,例如 .Net 应用程序的这个)。

Spring Initializr 可以轻松生成 Spring Boot 应用程序。它成功的秘诀并非秘密:它极其易于使用。您可以在 浏览器中使用它,或直接在 IDE 中使用。您甚至可以通过 cURL 或 HTTPie 从命令行使用它,或者通过 Spring Boot CLI 工具使用它。

构建自己的应用程序生成器

如何做?当然是使用 Spring!甚至还有一个库可以做到这一点。这个库也叫做 Spring Initializr。它是驱动 start.spring.io 的核心库,并且非常容易定制。在本文的其余部分,我们将逐步介绍创建自己的定制 Initializr 所需的步骤。

为了模拟您在企业中的操作,本教程将限制一些应用程序生成选项,并包含一些常规 Spring Initializr 不提供的第三方库,即 Axon CQRS 和事件溯源框架。我们将把我们的项目称为“Axon Initializr”。

本教程的完整代码可以在 GitHub 上找到。

第一步 - 创建一个 Spring “Web” 项目

冒着有点递归的风险,我们可以使用 start.spring.io 网站来开始构建我们的自定义 Axon Initializr!

使用该网站,创建一个具有以下屏幕截图所示设置的项目。使用最新 GA 版本的 Spring Boot,并确保包含 “web” 依赖项。我们正在构建一个 RESTful Web 服务,因此需要这些库。

Starting a new project at https://start.spring.io

点击绿色的“Generate”按钮将项目作为 Zip 文件下载。解压 Zip 文件,并在 IDE 或文本编辑器中打开生成的项目文件夹。现在,我们可以开始构建我们的自定义 axon-initializr 项目了。

第二步 - 将 Spring Initializr 库添加为依赖项

我们需要在 Maven 的 pom.xml 中添加几个条目,以便将 Spring Initializr 库包含在我们的项目中。在 POM 中,添加一个 Spring Initializr 的 dependencyManagement 条目,如下所示

    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>io.spring.initializr</groupId>
               <artifactId>initializr-bom</artifactId>
               <version>0.8.0.RELEASE</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
   </dependencyManagement>

接下来,在 POM 的现有 <dependencies> 部分添加几个额外的 Spring Initializr 依赖项

    <!-- Existing dependencies omitted here -->
    <dependency>
        <groupId>io.spring.initializr</groupId>
        <artifactId>initializr-web</artifactId>
    </dependency>
    <dependency>
        <groupId>io.spring.initializr</groupId>
        <artifactId>initializr-generator-spring</artifactId>
    </dependency>

initializr-web 依赖项引入了预定义的应用程序生成端点,IDE 可以与之通信,而 initializr-generator-spring 引入了关于如何构建 Spring Boot 项目的预设规则(这是我们想要的)。现在我们准备好定制 Axon Initializr 了。

第三步 - 配置基本生成器选项

Spring Initializr 库可以根据各种不同的选择(语言、构建工具等)生成应用程序项目。然而,在您的企业中,限制这些选择可能是明智的。这样,您可以鼓励某些方法。(这些就是前面提到的引导。)例如,您的企业可能有一个首选的数据库或消息平台,因此如果您提供其他选择,将会使事情复杂化。

我们使用 application.yaml 文件配置我们的 Axon Initializr。在我们的 axon-initializr 项目中,将 src/main/resources/application.properties 文件重命名为 application.yaml。然后,通过添加以下 YAML 配置来自定义

initializr:
 name:
   value: axon
 description:
   value: 'An Axon Framework Sample Application'
 group-id:
   value: com.benwilcock
  artifact-id:
   value: axon-app
 javaVersions:
   - id: 11
     default: false
   - id: 1.8
     default: true
 languages:
   - name: Java
     id: java
     default: true
   - name: Kotlin
     id: kotlin
     default: false
 packagings:
   - name: Jar
     id: jar
     default: true
 types:
   - name: Maven Project
     id: maven-project
     description: Generate a Maven-based project archive
     tags:
       build: maven
       format: project
     default: true
     action: /starter.zip

这些“initializr:”参数通过指定可用选项来配置我们的应用程序生成器

  • Java 版本(目前只有 8 和 11)
  • 语言(Java 和 Kotlin,但不是 Groovy)
  • 构建和打包(分别是 Maven 和 JAR)。

您会注意到某些项目上设置了 default: true。当未做出选择时,此设置会自动提升我们首选的选项。

让我们做一个简单的测试,以确保我们走在正确的轨道上。首先,使用以下命令构建并运行新的 initializr 项目

./mvnw package spring-boot:run

然后,在另一个终端中,使用 cURL 访问 initializr 帮助

curl https://:8080

您的终端窗口中的输出应与下面的屏幕截图相似

Sample terminal output from the half-built axon-initializr

这证实了 axon-initializr 已按预期启动并集成了所需的 Spring Initializr 库。但它尚未准备好开始生成 Spring 或 Axon 应用程序。在第一个终端窗口中使用 Ctrl-C 停止 axon-initializr,然后我们将继续进行自定义。

第四步 - 添加 Spring 库

添加常规 Spring 库很容易。我们只需在 YAML 配置的 dependencies: 列表中为每个库创建一个条目。缺点是:YAML 非常冗长。我只在这里展示一个 Spring Web 项目的条目作为开始。(其余的 在 GitHub 上。)

依赖项条目以 name 开始,后跟一个 content 项目列表。在下面的示例中,您将看到 Web 依赖项组,然后是 Spring Web 的条目

initializr:
 #...(omitted the previous stuff here to save space)
 dependencies:
   - name: Web
     content:
       - name: Spring Web
         id: web
         description: Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
          facets:
            - web
            - json
         links:
           - rel: guide
             href: https://springjava.cn/guides/gs/rest-service/
             description: Building a RESTful Web Service
           - rel: reference
             href: https://docs.springjava.cn/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications
           - rel: guide
             href: https://springjava.cn/guides/gs/serving-web-content/
             description: Serving Web Content with Spring MVC
           - rel: guide
             href: https://springjava.cn/guides/tutorials/bookmarks/
             description: Building REST services with Spring

您可以从 此示例 YAML 文件中复制您喜欢的任何其他 Spring 相关条目,该文件来自 start.spring.io 的配置。

第五步 - 添加 Axon 自定义库

这是最后的配置步骤!对于我们的 Axon Initializr,我们需要添加自定义的 Axon 库。为简洁起见,我只在此添加一个 Axon 库作为示例。但是,在自定义您的 initializr 时,您可以添加任意数量的条目。

initializr:
 dependencies:
   #...(omitted the existing libraries here to save space)
   - name: Axon Tools
     content:
       - name: Axon Framework
         id: axon-starter
         groupId: org.axonframework
         artifactId: axon-spring-boot-starter
         version: 4.2
         description: Brings first-class support for CQRS, Event Sourcing, and DDD to SpringBoot including Commands, Queries, Aggregates, Events, Event Handlers, and more...
          links:
           - rel: axon
             href: https://github.com/AxonFramework
              description: The open-source code repository on GitHub
           - rel: docs
             href: https://docs.axoniq.io/reference-guide/
             description: The reference guide on how to use Axon
           - rel: video-guide
             href: https://www.youtube.com/watch?v=tqn9p8Duy54&list=PL4O1nDpoa5KQkkApGXjKi3rzUW3II5pjm
             description: A full getting started video tutorial for Axon (YouTube).

您可能会注意到此配置与第 4 步中的配置不同。这是因为我们明确列出了每个库的 Maven 坐标(groupIdartifactIdversion)。我们这样做是因为 Axon 框架库在 Spring 之外,所以我们需要明确说明。

这里的示例只是代码片段。您可以在 GitHub 上查看完整的 axon-initializr YAML 配置。

从 IDE 尝试 Axon Initializr

现在我们已经将所需的配置和自定义添加到 axon-initializr 项目中,是时候在 IDE 中使用它来生成 Axon 应用程序了。

我将使用 IntelliJ IDEA Ultimate Edition 作为我的 IDE,但使用 Eclipse、Spring Tools、NetBeans 或 Visual Studio Code 也可以轻松实现同样流畅的开发工作流程。

首先,在终端中启动 axon-initializr 服务

./mvnw clean package spring-boot:run

然后,启动 IntelliJ IDEA 并选择 File → New → Project...,在下一个屏幕上,在左侧面板中选择 Spring Initializr 作为新项目类型。然后,在中间面板中将服务终端 URL 更改为 https://:8080,如下所示

Beginning a new project in IntelliJ IDEA Ultimate

当您点击“Next”时,您可以开始自定义您的新 Axon 应用程序。我们标准化工作的努力已经开始见效;默认项目名称、group id、artifact id、package、packaging、language、java 版本和描述都来自 Axon Initializr 中 application.yaml 的默认设置。

Choosing the basic settings in IntelliJ IDEA

最后,再次点击“Next”后,我们可以配置我们(尚未生成)的 Axon 应用程序项目。

我们首先从 Axon Initializr 的精选列表中添加所需的依赖项。在下面的屏幕截图中,您可以看到,除了各种标准的 Spring 库,如 Spring Data JPA 和 Spring for RabbitMQ(如果您添加了它们),我们还可以选择自定义库,如 Axon Framework。所有这些都无缝运行,将我们首选的 Spring 库与自定义的 Axon 库混合在一起。

Choosing our preferred dependencies in IntelliJ IDEA

就这样,我们完成了。在 IntelliJ IDEA 中设置了一些其他项目(例如生成应用程序的文件夹)后,最后一次点击“Next”按钮将创建我们的新 Axon 应用程序项目,并直接将我们带入 IDE。从那里,我们可以开始处理我们的 CQRS 应用程序,添加 Commands、Queries、Events 和 Aggregates。

总结

正如您所见,使用 Spring Initializr 作为基础创建自定义应用程序生成器非常容易,并且它极大地改善了我们的开发体验。通过添加您喜欢的库和其他自定义设置,您可以轻松地让开发人员“做正确的事”,并给他们一些每个人都想要的东西——更多时间来处理真正重要的事情!

我只是触及了 Spring Initializr 定制可能性的表面。要了解更多关于其他许多自定义选项的信息,请查看 官方文档。最后,别忘了伴随本教程的代码可以在 GitHub 上找到。

本文最初发表于 pivotal.io

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有