Permission denied: connect executing GET http://spring-cloud-producer/hello?name=xxx] with root cause
java.net.SocketException: Permission denied: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
問題 – 解決
在使用SpringCloud的Restful風格服務調用 Feign 搭建時,調用服務提供者的服務時出現了上面的異常,一開始的是JDK1.8,在網上看到的解決方案:給JVM的啓動參數增加-Djava.net.preferIPv4Stack=true參數,然後問題解決了,皆大歡喜,撒花……
問題重現
然後,JDK升級到10後發現,這錯誤又出來了,好吧,繼續百度,Google,畢竟是屌絲程序員的拿手手段,然而看了一圈後發現,還是沒有一個合適的答案,囧
找到問題所在
最後沒辦法只能靠自己,然後開始調試代碼,發現調用服務的時候註冊中心給的竟然是計算機名,在通過計算機名去找IP,然後問題就在這裏,我本機有多個網絡鏈接(VPN吶,虛擬機的虛擬網卡吶,WIFI網卡吶,balabala),但是我只能拿一個IP啊,咋辦?
解決
重點來了,敲黑板
這時候只需要設置網絡優先級即可解決問題,怎麼設置呢,以windows10爲例:
如上圖,設置網絡的接口跳躍點數,其實就是優先級,值越小,優先級越高。(原本我的VPN開啓的時候給vpn的網絡鏈接跳躍值的設置成1了)
設置完後保存,再調試,發現取到了我設置了跳躍點爲1的IP,至此,問題徹底解決了,即使不加-Djava.net.preferIPv4Stack=true參數,也不會報錯了,我估計是設置了ipv4最高優先級,原本默認取ipv6模塊的也被往後排了。