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

为什么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 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题