通过优锐课的 java 学习分享, 让我们研究一下如何将容器带入 Spring Boot 项目. 在这里, 我们使用 Docker 来包含 Java REST 后端, 而无需担心操作系统.
AtSea Shop 是示例店面应用程序, 可以部署在不同的操作系统上, 并且可以针对企业开发和运营环境进行自定义. 在较早的帖子中, 我讨论了该应用程序的体系结构. 在本文中, 我将介绍如何设置开发环境以调试在容器中运行的 Java REST 后端.
构建 REST 应用
我使用 Spring Boot 框架快速开发了 REST 后端, 该后端管理 AtSea Shop 中使用的产品, 客户和订单表. 该应用程序利用 Spring Boot 的内置应用程序服务器, 对 REST 接口的支持以及定义多个数据源的能力. 因为它是用 Java 编写的, 所以与基本操作系统无关, 并且可以在 Windows 或 Linux 容器中运行. 这使开发人员可以针对异构体系结构进行构建
项目设置
AtSea 项目使用多阶段构建, 这是一项新的 Docker 功能, 它使我可以使用多个映像来构建单个 Docker 映像, 其中包含应用程序所需的所有组件. 多阶段构建使用 Maven 容器构建应用程序 JAR 文件. 然后将 JAR 文件复制到 Java 开发工具包映像. 因为 Maven 不包含在应用程序中, 所以这使图像更加紧凑和有效. 同样, React 店面客户端构建在 Node 映像中, 并且还将编译应用程序添加到最终应用程序映像中.
我使用 Eclipse 编写了 AtSea 应用程序. 如果你需要有关配置 IntelliJ 或 Netbeans 进行远程调试的信息, 可以查看 Docker Labs 存储库. 你还可以在 AtSea 应用程序 GitHub 存储库中签出代码.
0
我通过克隆存储库构建了应用程序, 并通过将 Root Directory 设置为项目并单击 Finish 将项目导入到 Eclipse 中
文件 > 导入 > Maven > 现有 Maven 项目
自从我使用 Spring Boot 以来, 我就利用 spring-devtools 在应用程序中进行远程调试. 我必须将 Spring Boot-devtools 依赖项添加到 pom.xml 文件中.
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- </dependency>
请注意, 当应用程序完全打包为 JAR 时, 将自动禁用开发人员工具. 为了确保在开发期间可以使用 devtools, 我在 spring-boot-maven 构建插件中将 < excludeDevtools > 配置设置为 false:
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <configuration>
- <excludeDevtools>false</excludeDevtools>
- </configuration>
- </plugin>
- </plugins>
- </build>
本示例使用 Docker Compose 文件, 该文件为开发和调试特别需要的容器创建了简化的构建.
- version: "3.1"
- services:
- database:
- build:
- context: ./database
- image: atsea_db
- environment:
- POSTGRES_USER: gordonuser
- POSTGRES_DB: atsea
- ports:
- - "5432:5432"
- networks:
- - back-tier
- secrets:
- - postgres_password
- appserver:
- build:
- context: .
- dockerfile: App/Dockerfile-dev
- image: atsea_app
- ports:
- - "8080:8080"
- - "5005:5005"
- networks:
- - front-tier
- - back-tier
- secrets:
- - postgres_password
- secrets:
- postgres_password:
- file: ./devsecrets/postgres_password
- networks:
- front-tier:
- back-tier:
- payment:
- driver: overlay
Compose 文件使用机密提供密码和其他敏感信息 (例如证书), 而无需依赖环境变量. 尽管该示例使用 PostgreSQL, 但是应用程序可以使用密码连接到由 Spring Boot 数据源定义的任何数据库. 从 JpaConfiguration.java:
public DataSourceProperties dataSourceProperties() { DataSourceProperties dataSourceProperties = new DataSourceProperties(); // Set password to connect to database using Docker secrets. try(BufferedReader br = new BufferedReader(new FileReader("/run/secrets/postgres_password"))) { StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine(); } dataSourceProperties.setDataPassword(sb.toString()); } catch (IOException e) { System.err.println("Could not successfully load DB password file"); } return dataSourceProperties; }
还要注意, appserver 打开端口 5005 进行远程调试, 并且 build 调用 Dockerfile-dev 文件来构建打开了远程调试的容器. 这在入口点中设置, 该入口点指定调试器的传输和地址.
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005","-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"]
远程调试
要在应用程序上启动远程调试, 请使用 docker-compose-dev.YAML 文件运行 compose.
docker-compose -f docker-compose-dev.YAML up --build
Docker 将构建映像并启动 AtSea Shop 数据库和 appserver 容器. 但是, 只有将 Eclipse 的远程调试器附加到应用程序后, 应用程序才能完全加载. 要开始远程调试, 请单击运行 > 调试配置....
选择 "远程 Java 应用程序", 然后按新按钮创建配置. 在 "调试配置" 面板中, 为配置指定名称, 选择 AtSea 项目, 并将主机和端口的连接属性设置为 5005. 单击 "应用">"调试".
该应用服务器将启动:
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) 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 请求的首选工具对其进行测试:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/API/product/
Eclipse 将切换到调试透视图, 你可以在其中逐步执行代码.
AtSea Shop 示例显示了使用你和你的团队所熟悉的工具将容器用作常规开发环境的一部分是多么容易. 下载该应用程序以尝试使用容器进行开发, 或者将其用作你自己的 Spring Boot REST 应用程序的基础.
喜欢这篇文章的可以点个赞, 欢迎大家留言评论, 记得关注我, 每天持续更新技术干货, 职场趣事, 海量面试资料等等
?> 如果你对 java 技术很感兴趣也可以交流学习, 共同学习进步.?
不要再用 "没有时间" 来掩饰自己思想上的懒惰! 趁年轻, 使劲拼, 给未来的自己一个交代
文章写道这里, 欢迎完善交流. 最后奉上近期整理出来的一套完整的 java 架构思维导图, 分享给大家对照知识点参考学习. 有更多 JVM,MySQL,Tomcat,Spring Boot,Spring Cloud,Zookeeper,Kafka,RabbitMQ,RockerMQ,Redis,ELK,Git 等 Java 干货
来源: http://www.bubuko.com/infodetail-3383381.html