實用乾貨 使用Docker進行Spring Boot開發

通過優銳課的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.yml文件運行compose。

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

Docker將構建映像並啓動AtSea Shop數據庫和appserver容器。 但是,只有將Eclipse的遠程調試器附加到應用程序後,應用程序才能完全加載。 要開始遠程調試,請單擊運行>調試配置...。

選擇“遠程Java應用程序”,然後按新按鈕創建配置。 在“調試配置”面板中,爲配置指定名稱,選擇AtSea項目,並將主機和端口的連接屬性設置爲5005。單擊“應用”>“調試”。

實用乾貨 使用Docker進行Spring Boot開發
該應用服務器將啓動:

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上設置一個斷點,該斷點將返回產品列表。

實用乾貨 使用Docker進行Spring Boot開發

你可以使用curl或用於發出HTTP請求的首選工具對其進行測試:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/product/

Eclipse將切換到調試透視圖,你可以在其中逐步執行代碼。

實用乾貨 使用Docker進行Spring Boot開發

AtSea Shop示例顯示了使用你和你的團隊所熟悉的工具將容器用作常規開發環境的一部分是多麼容易。 下載該應用程序以嘗試使用容器進行開發,或者將其用作你自己的Spring Boot REST應用程序的基礎。

喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
 > 如果你對java技術很感興趣也可以交流學習,共同學習進步。 
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

文章寫道這裏,歡迎完善交流。最後奉上近期整理出來的一套完整的java架構思維導圖,分享給大家對照知識點參考學習。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java乾貨

實用乾貨 使用Docker進行Spring Boot開發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章