也許是“新時代的開發姿勢”

月泉發表於2019-04-01

在寫部落格的同時也錄製了視訊,視訊和文章結合食用效果更佳

Bilibili: www.bilibili.com/video/av478…

油管:www.youtube.com/watch?v=2o3…

緣起

大概是在2~3年前,當時我在一家小型網際網路創業公司,身處於技術氛圍很不錯的技術團隊中,我們使用 Rails 來構建產品,整個產品是一個單體架構,但隨著業務的變更與增長,我們在開發過程中所依賴的服務越來越多,畢竟不是每一家公司都有條件給予開發團隊一個共享的開發環境,導致我們在開發的時候需要啟動很多服務,在團隊加入新人時,也需要告知新人應安裝什麼和啟動什麼,當自己電腦環境重灌是也需要重複以上步驟,重複且很繁瑣又易導致團隊開發環境不統一。

最早期我們開發只需要啟動 ServerPostgresqlRedis,由於業務需求的原因,又需要使用到圖形資料庫,所以我們需要啟動的服務又增加了一個,變成了 ServerPostgresqlRedisNeo4j,再然後新增了佇列 Sidekiq;這意味著每個人的機器器也要安裝這些服務。團隊規模雖然不大,但每個人身上的職責很多,業務之間也偶而交叉;再者,無論是 Rails 還是 Neo4j 在那個時候社群都很活躍,新也很頻繁,所以為了保證開改環境一致,每個人需要同步更新所有依賴。

除了上述問題,還存在一個問題——團隊內每個人在開發過程中,所使用的系統平臺不一致,有的小夥伴使用 Windows ,有的使用 MacOS,有一句說一句,Rails 在Windows下是真的不好玩,有一些環境也沒有提供 Windows 版本,於是我嘗試過使用虛擬機器,效果不佳,然後我們又繼續嘗試使用了 Vargrant,雖然解決了平臺的問題,但是是真的卡!那時候Docker也才出來沒多久,火熱的趨勢還在增長,再過了不久佳哥把開發環境及生產環境給 Docker 化了,後續超哥和我也加入對開發環境的 Docker 配置進行了想法上的改進及後續的維護,這一操作完成以後從此無論團隊是加入新人或是像我這種因為Mac硬碟小1-2個月就要格盤重灌的男人都得到了一種“酣暢淋漓”的感覺。

那時候我就在思考 Java 我該如何做到開發容器化呢?於是當時試了試,實現了以後發覺有點蠢還不如不容器化直到上週在和超哥聊天的過程中得知下週IDEA要釋出新版本了,特性上支援 Debug inside Docker,我們在此前也嘗試過將Java容器化開發但效果不好,總而言之言而總之,超哥又在昨天告訴我 IDEA 新版本2019.1釋出正式版了,於是我昨天晚上(2019年3月28號),琢磨了近一晚上,也算是探索出了一種 Java Docker 化的開發姿勢。

按照以往的經驗,我大致總結了我們團隊之前解決的問題(包括不限於):

  • 平臺不統一
  • 開發環境版本不一致
  • 每次開機需要重複的去啟動一些服務
  • 新人安裝環境通常需要半天至一天
  • 開發環境與本機環境的隔離

我提出的這種姿勢我不知道能夠解決多少和帶來多少問題,還缺少一些歲月的考驗;所以我在這裡先斗膽以文章的方式分享我所探索的方式來起一個引子,諸君參考。

姿勢

預備姿勢

需自行準備

  1. 預先安裝Docker
  2. 配置IDEA中的Docker連結,Setting->Docker

Windows Docker的 Expose daemon on tcp://localhost:2375 without TLS預設是關閉的,需要手動開啟

就目前而言開發Web專案,最常見的2種方式就是使用 SpringBoot或是使用傳統的 J2EESpringBootWeb預設依賴嵌入式容器啟動,J2EE專案通常使用外接的Servlet容器啟動。

  • SpringBoot 容器化開發姿勢
  • 傳統J2EE 容器化開發姿勢

本文將會對這2種方式進行分享,來幫助大家達到一種觸類旁通的效果

SpringBoot 容器化開發姿勢

預備

首先準備一個專案

也許是“新時代的開發姿勢”

Maven配置如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<!-- 開發工具依賴,本文將會使用熱部署,所以需要依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
複製程式碼

先啟動專案,驗證專案的正確性同時也取一個巧

也許是“新時代的開發姿勢”

容器化執行

專案執行無誤,建立docker-compose.yml檔案(ps: 這裡我習慣用docker-compose,讀者也可自行選擇使用K8或者是Dockerfile)

version: '3.1'
services:
  jdk:
  	# 使用官方JDK映象
    image: openjdk
    ports:
      #將宿主機的8080埠與容器的8080埠進行對映
      - 8080:8080
    volumes:
      #將IDEA的編譯目錄target對映值容器中的/app/路徑下
      - ./target/:/app/
      #將本地的maven倉庫對映至容器中的/repository路徑下
      - C:\Users\yuequ\.m2\repository:/repository/
    command: [
              'java',
              '-Dfile.encoding=UTF-8',
              '-classpath',
              # 這一段是classpath,下文會告知如何以取巧的方式得知
              '.....................',
              'org.yuequan.springboot.docker.SpringBootWithDockerApplication'
  ]
複製程式碼

關於專案執行時需要新增那些依賴可使用IDE取巧

也許是“新時代的開發姿勢”

尋找至-classpath後的引數

也許是“新時代的開發姿勢”

複製,然後將路徑都替換成對映至容器內部的路徑即可,這裡需要注意的是WindowsLinux平臺下的分隔符是不一樣的,需要將;替換成:

接著建立一個docker執行來測試容器編排是否正確,專案是否能夠在容器中正常執行

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

建議在啟動前先新增一個maven的編譯,其實這裡可以擴充套件點非常多,熟悉前端的讀者肯定這時候還會先編譯一下sass或者是執行webpack等前端或者其它的編譯任務參與,而這些任務大多都可以以watch的形式啟動,無疑中將前後端的協作變得更加的靈活和方便

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

點選OK,然後儲存,執行它

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

接著選擇容器看下啟動日誌

也許是“新時代的開發姿勢”

接著可以訪問http://localhost:8080訪問一下

容器化除錯

現在能夠在容器內執行了,但是還存在一個問題,我如何對它進行除錯呢?

首先停止容器

也許是“新時代的開發姿勢”

因為目前IDEA與容器的除錯還存在一些BUG,所以每次以除錯的形式啟動時都需要將server的容器刪除掉,這裡我不用說大家應該也能明白其它的容器不用刪這個道理吧(指有多個容器編排時,比如: PostgreSQLRedisKafka等等)。

也許是“新時代的開發姿勢”

配置一個Remote的執行來除錯容器內的程式碼,注意這個特性是在IDEA2019.1以後才有的,否則只能使用傳統的遠端除錯

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

同理,新增編譯任務

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

選擇配置然後儲存

也許是“新時代的開發姿勢”

儲存,將複製的那一段遠端除錯啟動的引數新增至docker-compose.yml檔案中

也許是“新時代的開發姿勢”

接著建立一個Action,並加以斷點

也許是“新時代的開發姿勢”

接著點選啟動

也許是“新時代的開發姿勢”

然後在下方有2個控制檯,一個是Debug的一個是Docker

也許是“新時代的開發姿勢”

也許是“新時代的開發姿勢”

訪問測試一下http://localhost:8080/hello

也許是“新時代的開發姿勢”

OK,除錯也沒有問題了,注意如果每次以Debug的重新啟動時,需要將server容器給刪除然後再啟動,這裡或許是一個BUG

熱部署

當然在開發過程中熱部署會給我們帶來極大的便利性,還記得我在依賴中引入的devtools的依賴嗎?有了它我們每次改動程式碼只需要利用IDEA的自動編譯或者是手動的執行Build即可

也許是“新時代的開發姿勢”

傳統J2EE容器化開發姿勢

由於我個人精力有限最近事情也比較多,感興趣的可以看視訊瞭解傳統J2EE容器化的開發姿勢,文中不做過多的敘述。

傳送門在此:

​ bilibili: www.bilibili.com/video/av478…

​ 油管:www.youtube.com/watch?v=3Ld…

結束語

以上就是我使用IDEA進行Java容器化開發的探索成果,之後我也會分享一個完整開發-測試-上線的完整的編排流程。

我對容器化開發充滿了暢想,我堅信它能夠為我們開發或是上線運維都帶來極大的便利性。

Emmmm.........,多了的想法以後再補吧,夜深了,我該休息了。

相關文章