當 xxl-job 遇上 docker → 它暈了,我也亂了!

開心一刻

  公交車上,一位老大爺睡著了,身體依靠在背後的一位年輕小夥子身上

  小夥子一直保持站姿十幾分鐘,直到老人下車

  這位在校大學生,接受採訪時說:」當時就覺得背後這個人很輕盈,以為是個姑娘!「

前提準備

  對 xxl-job、docker 要有基本的了解

  xxl-job

  直接看官網:xxl-ob,你想要的和不想要的,官網都有詳細說明

  樓主也做了簡單嘗試:分散式任務調度平台 → XXL-JOB 初探分散式任務調度平台 → XXL-JOB 實戰

  示例版本: 2.1.0 

  docker

  網上資料很多,b站影片也挺多的(推薦:尚矽谷2022版Docker實戰教程(docker教程天花板)

  樓主就不做介紹了(主要是樓主不知道呀!)

admin 和 executor 都單獨部署

  部署很簡單,我就不具體演示了(不是主角,沒戲份!)

  直接看效果

  192.168.8.222 上部署 xxl-job-admin 

  192.168.8.223 上部署 xxl-job-executor 

  是不是很簡單?

  效果也和我們預想的一樣

admin 單獨部署,executor 通過 docker 部署

  192.168.8.223 安裝 docker ,安裝過程我就不演示了,直接看效果

   docker 版本 20.10.21 

  大家注意,伴隨著 docker 的運行,多了一個網卡配置資訊

  有興趣的可以查閱下: docker 網路的 bridge 模式;這裡先混個眼熟,注意IP 172.17.0.1 

  executor 和 docker 並存

  此時我們重啟下 xxl-job-executor ,然後在 xxl-job-admin 重新註冊下執行器

  自動註冊上來的機器IP是 172.17.0.1 ,而非 192.168.8.223 ,那麼伴隨而來的問題就是: xxl-job-admin 訪問不通 xxl-job-executor 

  我們改成手動註冊,看看能否訪問通

  可以看到,手動註冊不受 docker 的影響,能正常訪問通

  而自動註冊則受了 docker 的影響,註冊的IP不對,至於如何解決,請繼續往下看

  executor 通過 docker 部署

  如何打將 xxl-job-executor 打成 docker 鏡像,不是本文的內容,所以省略不演示(言外之意是需要大家自行去學習!)

  我們直接 run 執行器鏡像

  自動註冊上來的IP 172.17.0.2 ,很明顯,問題( xxl-job-admin 訪問不通 xxl-job-executor )再次出現

  那改成手動註冊試試

  喲嚯, xxl-job-admin 還是訪問不通 xxl-job-executor 

  放棄抵抗吧,別掙扎了

  少年莫急,我們的 xxl-job-executor 是通過 docker 部署的,你有把 docker 容器的 9999 埠映射到宿主機嗎

  (由於換了地方,IP也跟著變了, 192.168.8.222 ->  10.5.13.222 , 192.168.8.223  ->  10.5.13.223 )

  重啟下 sample-executor:1.0 

  我就問你,是不是通了?

admin 和 executor 都通過 docker 部署

   executor 通過 docker 部署,前面已經講過了

   admin 通過 docker 部署,請看我表演

  自動註冊還要試嗎?

自動註冊IP問題

  前面說了那麼多,最終回歸到一個問題:自動註冊的IP為什麼不是 Docker 宿主機的IP

  不管是 xxl-job-admin 還是 xxl-job-executor ,都是直接用的官方的程式碼,樓主可一行都沒改

  那肯定是 xxl-job 自動註冊沒有做好 docker 的兼容唄

  這可不是我瞎說, github 上 xxl-job 有很多相關的 issue (191630112116581668

  許大大在源碼中也給出了解決方案, xxl-job-executor-sample-springboot 有個類: XxlJobConfig.java ,其中有如下說明

  那試試唄,我們對 xxl-job-executor-sample-springboot 進行改造

  引入依賴

  修改 XxlJobConfig.java 

  添加配置

  executor 和 docker 並存

   docker 運行,但 executor 不通過 docker 部署

  自動註冊的ip竟然是: 127.0.0.1 ,莫非要通過 docker 部署?

  executor 通過 docker 部署

  鏡像我已經打包好: sample-executor:1.1 ,我們來看下效果

  自動註冊的ip是 172.17.0.2 ,不是宿主機ip: 10.5.13.223 ,莫非 docker 鏡像打的有問題?

  我們進容器內看看日誌

  我們再看看容器內的網卡配置資訊

  請問這如何獲取宿主機IP( 10.5.13.223 )?

  許大欺我?

總結

  1、就目前來看,一旦 xxl-job-executor 遇上 Docker ,自動註冊就不對了

    知道如何處理的小夥伴,歡迎評論區留言

  2、自動註冊不行了,那就用手動註冊唄

  3、大家自己驗證的時候,一定要注意 docker 與宿主機的埠映射