微服務(wù)啟動的時候,會自動向服務(wù)註冊中心報告自己的ip和連接埠。但是服務(wù)是在docker容器內(nèi)運(yùn)作的,註冊的ip就成了172開頭的docker內(nèi)部ip, 這個位址是無法被其它機(jī)器存取的。
這種情況是不是必須手動將服務(wù)註冊的地址改成宿主機(jī)的地址和端口呢,有其它好方案沒
----- update -----
docker 1.12版本以後engine有了swarm模式,經(jīng)過測試使用swarm的overlay網(wǎng)路可解決跨主機(jī)通訊問題,這種方案是否合適呢
docker swarm 提供的overlay network可以提供跨主機(jī)的容器內(nèi)網(wǎng)絡(luò)通訊,本機(jī)內(nèi)容器可以在啟動時指定network來組成內(nèi)部網(wǎng)絡(luò),然後可以在swarm主機(jī)上用host模式部署nginx,使用etcd,consul等動態(tài)註冊服務(wù)和更新nginx的反向代理配置來達(dá)到動態(tài)服務(wù)發(fā)現(xiàn)的目的。
不過overlay目前是所有跨主機(jī)通訊方式中效能損耗最大的,達(dá)到60%。網(wǎng)路上有人做過測試,你可以找來看看。因此就目前來說,生產(chǎn)環(huán)境還是要考慮kubernetes或mesos
有幾個思路:
1、在啟動服務(wù)的時候由宿主設(shè)備報告ip
2、啟動服務(wù)的時候向容器環(huán)境變量中註入宿主ip 信息
3、註冊中心收到註冊請求時,從網(wǎng)絡(luò)層拿ip
因為容器是動態(tài)的,通常情況下IP位址隨機(jī)分配的。當(dāng)使用容器調(diào)度系統(tǒng)自動啟動一些容器後,可以透過服務(wù)註冊把這些容器的存取位址記錄到服務(wù)註冊中心。這樣當(dāng)外部服務(wù)想要存取這些容器時,就可以透過服務(wù)發(fā)現(xiàn)(service discovery)存取這些容器
可以考慮其他方式
1.使用kubernetes等服務(wù)編排工具(對docker方面有較大改變)
2.使用consul等註冊中心(對註冊中心代碼方面有較大改變)
如果微服務(wù)使用的是spring cloud,則更推薦第二種,可以完美解決此問題