查看原文
其他

【SFA官方翻译】使用 Docker 进行 Spring Boot 开发

Darren Luo SpringForAll社区 2020-10-17

原文链接:https://dzone.com/articles/spring-boot-development-with-docker?fromrel=true

作者:Sophia Parafina

译者:Darren Luo

我们来看看如何将容器引入 Spring Boot 项目。这里,我们使用 Docker 来包含 Java REST 后端,远离操作系统的后顾之忧。

AtSea Shop 是一个能部署在不同操作系统,可以在你的企业开发和操作环境定制的示例店铺应用程序。在之前的文章,我讨论了应用程序的结构。在本文种,我将介绍如何设置开发环境以在容器中调试运行的 Java REST 后端。

构建 REST 应用程序

我使用 Spring Boot 框架快速开发在 AtSea 中管理产品、用户和订单表的 REST 后端。该应用程序 Spring Boot 的内置应用程序服务器,支持 RESR 接口以及定义多个数据源的能力。因为它是 Java 写的,所以它不用管基础操作系统,可以运行在 Windows 或 Linux 容器中。这允许开发者构建异构体系结构。

项目设置

AtSea 项目使用多阶段构建,一种新的 Docker 功能,允许我使用多个镜像(image)构建单个 Docker 镜像,其中包括应用程序需要的所有组建。多阶段构建使用 Maven 容器来构建应用程序的 JAR 文件。然后将该 JAR 文件复制到 Java Development Kit 镜像。这使得镜像更加紧凑和高效,因为 Maven 没有被包含在应用程序中。类似的,React 店铺客户端在一个 Node 镜像中构建,编译后的应用程序也被添加到最终的应用程序镜像中。

我使用 Eclipse 编写 AtSea 应用程序。如果你需要 IntelliJ 或 Netbeans 的有关远程调试的配置信息,你可以查看该 Dicker Labs Repository。你也可以查看 AtSea 应用程序的 Github repository。

我通过克隆 repository 并通过将根目录设置为项目并单击完成将项目导入 Eclipse 来构建应用程序

File > Import > Maven > Existing Maven Projects

因为我使用了 Spring Boot,所以我利用 spring-devtools 在应用程序中进行远程调试。我不得不将 Spring Boot-devtools 依赖添加到 pom.xml 文件中。

  1. <dependency>

  2.     <groupId>org.springframework.boot</groupId>

  3.     <artifactId>spring-boot-devtools</artifactId>

  4. </dependency>

请注意,当应用程序完全打包为 JAR 时,该开发者工具将被自动禁用。为了确保在开发过程中可以使用devtools,我在 spring-boot-maven 构建插件中将 配置设置为 false:

  1. <build>

  2.    <plugins>

  3.        <plugin>

  4.            <groupId>org.springframework.boot</groupId>

  5.            <artifactId>spring-boot-maven-plugin</artifactId>

  6.            <configuration>

  7.                <excludeDevtools>false</excludeDevtools>

  8.            </configuration>

  9.        </plugin>

  10.    </plugins>

  11. </build>

该示例使用 Decker Compose 文件,该文件创建了开发和调试所需容器的简单构建。

  1. version: "3.1"

  2. services:

  3.  database:

  4.    build:

  5.       context: ./database

  6.    image: atsea_db

  7.    environment:

  8.      POSTGRES_USER: gordonuser

  9.      POSTGRES_DB: atsea

  10.    ports:

  11.      - "5432:5432"

  12.    networks:

  13.      - back-tier

  14.    secrets:

  15.      - postgres_password

  16.  appserver:

  17.    build:

  18.       context: .

  19.       dockerfile: app/Dockerfile-dev

  20.    image: atsea_app

  21.    ports:

  22.      - "8080:8080"

  23.      - "5005:5005"

  24.    networks:

  25.      - front-tier

  26.      - back-tier

  27.    secrets:

  28.      - postgres_password

  29. secrets:

  30.  postgres_password:

  31.    file: ./devsecrets/postgres_password

  32. networks:

  33.  front-tier:

  34.  back-tier:

  35.  payment:

  36.    driver: overlay

该 Compose 文件使用 secrets 来提供密码和其他如证书的敏感信息,而不用依赖于环境变量。虽然该示例使用 PostgreSQL,但应用程序可以使用 secrets 来连接到由 Spring Boot 数据源定义的任何数据库。查看 JpaConfiguration.java:

  1. public DataSourceProperties dataSourceProperties() {

  2.    DataSourceProperties dataSourceProperties = new DataSourceProperties();

  3.    // Set password to connect to database using Docker secrets.

  4.    try(BufferedReader br = new BufferedReader(new FileReader("/run/secrets/postgres_password"))) {

  5.        StringBuilder sb = new StringBuilder();

  6.        String line = br.readLine();

  7.        while (line != null) {

  8.            sb.append(line);

  9.            sb.append(System.lineSeparator());

  10.            line = br.readLine();

  11.        }

  12.        dataSourceProperties.setDataPassword(sb.toString());

  13.    } catch (IOException e) {

  14.        System.err.println("Could not successfully load DB password file");

  15.    }

  16.    return dataSourceProperties;

  17. }

另外需要注意的是该 appserver 为远程调试打开了 5005 端口,并且该构建调用 Dockerfile-dev 文件来构建开启了远程调试的容器。下面是在 Entrypoint 中的设置,制定了调试器的传输机制和地址:

  1. ENTRYPOINT ["java",

  2. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005","-jar",

  3. "/app/AtSea-0.0.1-SNAPSHOT.jar"]

远程调试

要在应用程序上开始远程调试,请使用 docker-compose-dev.yml 文件运行 compose。

  1. docker-compose -f docker-compose-dev.yml up --build

Docker 将构建镜像并启动 AtSea Shop 数据库和 appserver 容器。但是,在 Eclipse 的远程调试器连接到应用程序之前,应用程序将无法完全加载。要启用远程调试,单击 Run > Debug Configurations ...

选择 Remote Java Application,然后按新建按钮来创建配置。在调试配置面板中,设置配置名,选择 AtSea 项目并设置 port 和 port 的连接属性为 5005。单击 Apply > Debug。

appserver 将启动:

  1. appserver_1|2017-05-09 03:22:23.095 INFO 1 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)

  2. appserver_1|2017-05-09 03:22:23.118 INFO 1 --- [main] com.docker.atsea.AtSeaApp                : Started AtSeaApp in 38.923 seconds (JVM running for 109.984)

要测试远程调试,在 ProductController.java 返回产品列表的地方设置断点。

你可以使用 curl 或你更喜欢的工具来发出 HTTP 请求以进行测试:

  1. curl -H "Content-Type: application/json" -X GET  http://localhost:8080/api/product/

Eclipse 将切换到你可以步进调试代码的调试界面。

AtSea Shop 示例展示了使用你和你的团队熟悉的工具将容器作为你日常开发环境是多么的容易。下载应用程序以尝试使用容器进行开发或使用其作为你自己的 Spring Boot REST 应用程序的基础。

招人:数心,造化心数奇;用心等你...

上一篇:【SFA官方翻译】Spring WebFlux和Spring Cloud进行响应式微服务开发


点击阅读原文查看更多

关注公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存