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 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题