doncha
doncha
2019-08-26 17:26
采纳率: 41.7%
浏览 1.0k
已采纳

为什么dubbo provider和consumer使用相同的暴露端口会出错

dubbo默认不配置protocol的话会使用20880端口,所以我没有配置这句

        <dubbo:protocol name="dubbo" port="20880">

然后我使用的是dubbo的注解@Reference和@Service来获取服务端的接口,但是当dubbo的提供者和消费者在不配置protocol默认使用20880端口时,启动之后会报一个错误

    Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:20880
        Caused by: java.net.BindException: Address already in use: bind

然后我如果在provider指定暴露端口

        <dubbo:protocol name="dubbo" port="20990" />

consumer不指定端口,也就是默认使用20880,启动之后就不会报错了,而且也能获取到提供者的接口,想请问下是什么原因。

补充下,我在网上查了下看到有人说要配置qos-server端口,但是我配置完之后也没有用

   <!-- 提供方应用信息,用于计算依赖关系,请勿与提供方相同 -->
    <dubbo:application name="service-consumer">
        <dubbo:parameter key="qos.enable" value="true"/>
        <dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
        <!--
        报错java.net.BindException: 地址已在使用
        问题出现的原因:
            consumer启动时qos-server也是使用的默认的22222端口,但是这时候端口已经被provider给占用了,所以才会报错的。
        解决:指定新端口号
        -->
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>

这是我的配置文件
provider的配置文件:

<dubbo:application name="dubbo_provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:annotation package="com.dubbo"/>

provider的接口:

@Service
public class IProvideServiceImpl implements IProviderService {

    public String getString(){
        return "hello world";
    }
}

consumer的配置文件(添加了spring-mvc):
spring配置文件

 <dubbo:application name="dubbo_consumer">
        <dubbo:parameter key="qos.enable" value="true"/>
        <dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

spring-mvc配置文件

<dubbo:annotation package="com.dubbo" />
    <context:component-scan base-package="com.dubbo"/>

    <mvc:annotation-driven/>
    <mvc:default-servlet-handler/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

控制层调用提供者接口

@Controller
@RequestMapping("/dubbo")
public class ComsumerController {

    @Reference
    private IProviderService iProviderService;

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("welcome");
        String str = iProviderService.getString();
        System.out.println(str);
        return "dubbo";
    }
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • luojianjun2
    Flying_with_you 2019-08-26 17:42
    已采纳

    你本机某一个端口肯定只能被一个服务占用啊。你如果提供者跟消费者分开在不同的机器上部署就不会报错。都在本机跑肯定端口占用啊

    点赞 评论
  • Aqu415
    万物皆字节 2019-08-27 07:21

    在同一个机器上肯定是端口冲突呢

    点赞 评论

相关推荐