情景:开发环境使用postman访问dubbo的rest服务时,总是返回404,而正式环境是正常的。
原因:tomcat端口是80,dubbo的rest服务端口是8080,tomcat端口号与dubbo rest服务端口号不一致,所以返回404
这个问题,需要分情况,dubbo rest的服务器分为嵌入式和使用外部服务器两种,如果使用外部服务器,那么rest端口号要与dubbo:protocol name="rest" port="8090"中的port一致。如果是嵌入式,那么就不能一样。
嵌入式写法:
<dubbo:protocol name="rest" server="jetty"/>如果不指定server,默认是jetty,而且是嵌入式的,除了jetty,还有tomcat、netty、sunhttp可选。
集成式写法:
server必须指定为servlet
<dubbo:protocol name="rest" server="servlet"/>并且web.xml中,必须配置BootStrapListener和DispatcherServlet
<web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/META-INF/spring/dubbo-demo-provider.xml</param-value> </context-param> <listener> <listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
并且,BootstrapListener必须配置在ContextLoaderListener前边
结论
使用嵌入式server,则rest接口与tomcat端口不一致。
使用外部server,则rest接口需与之保持一致。