Webservice On Netty

Honwhy發表於2017-03-12

Java的世界屬於開源的世界,所謂開源的世界,只要你能想到的點子就一定有人實現了,沒有你就自己造一個啊。

最近遇到了一個專案需求,技術選型選擇了webservice,需要對外提供webservice介面。實現webserice功能可以有多種做法的,比如servlet + tomcat的方式,Java Main方法+嵌入jetty server的方式,本質上是XML/HTTP的原理(誤?)。

專案組對外提供介面的功能已經選擇了HTTP/Netty的方式,既然已經有HTTP的支援了,那麼XML/HTTP On Netty或許是個不錯的點子,這樣我們不用再引入tomcat等服務應用了。

經過一番搜尋,終於發現了netty-jax-ws這款元件,非常符合我們的需求,於是就採用了它完成了開發工作。

考慮到我們的對外介面需要進行分類,需要在原來的URL路徑對映加上字首。
這個開源元件原來的示例

mappings.put("/echoService", echoWebService);

key表示URL路徑,value表示webservice的具體實現。
此時我們給它加上字首

mappings.put("/honey/echoService", echoWebService);

比如之前的訪問方式http://localhost:4040/echoService?wsdl,這回我們的訪問路徑應該是http://localhost:4040/honey/echoService?wsdl
只不過這回意外的是服務給我們返回的是404的結果,看來我們的路徑是不正確的,或者這個訪問路徑找不到實現的webservice(類似MVC框架中的Controller)。

這個問題的原因很快就排查出來的,我覺得可能自己就能解決,於是乎就fork了專案試著改動起來,參見這個提交commit1,至此暫告一段落了。

這部分功能程式碼就加入到了原來的專案中,只不過已經打包部署就發現,只要訪問webservice功能http://localhost:4040/honey/echoService?wsdl
就會報錯:NoSuchMethodError, 然後是xx.jboss.netty.xx.ChannelFactory諸如此類的錯誤,我第一個感覺就是netty-jax-ws和原來的專案使用的Netty版本衝突了。

此時我請教我們組經驗豐富的同事,遇到這種情況要不要迎難而上呢,還是另闢蹊徑呢?(當然,當時肯定是口語化的表達)。

既然我前面已經改造過一回,不在乎再一次了,所以就有了這次commit2

以上算是我真正意義地上參與了一次開源貢獻,我只是做了一點工作而已了。

— EDIT —
這次修改是為了支援通過代理的方式訪問webservice,支援了HTTP Host請求頭,修改參見commit3

文章屬個人觀點,與本人工作僱主無關!