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

为什么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条回答 默认 最新

  • Flying_with_you 2019-08-26 17:42
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘