當 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 (191、630、1121、1658、1668)
許大大在源碼中也給出了解決方案, 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 與宿主機的埠映射