Webservice On Netty

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章