情景:开发环境使用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接口需与之保持一致。