热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从dubbo源码分析qosserver端口冲突问题

在这分布式系统架构盛行的时代,很多互联网大佬公司开源出自己的分布式RPC系统框架,例如:阿里的dubbo,谷歌的gRPC,apache的Thrift。而在我们公司一直都在推荐使用d

在这分布式系统架构盛行的时代,很多互联网大佬公司开源出自己的分布式RPC系统框架,例如:阿里的dubbo,谷歌的gRPC,apache的Thrift。而在我们公司一直都在推荐使用dubbo,今天就来讲讲在使用dubbo过程出现的qos-server端口冲突问题。

首先什么是dubbo的qos-server呢?qos是dubbo的在线运维命令,dubbo2.5.8新版本重构了telnet模块,提供了新的telnet命令支持,新版本的telnet端口与dubbo协议的端口是不同的端口,默认为22222,可以通过配置文件dubbo.properties修改。

在dubbo2.5.7版本之前是不支持注解配置的,因此公司框架Titans对dubbo做了二次封装,通过自定义注解@EnableDuubo来支持dubbo的注解配置,并简化了server provider,server consumer,server registry配置,开发人员只要在spring boot启动类中添加@EnableDuubo即可开始自己的业务代码开发,节省大量的时间。

最近在项目开发过程中由于需要调试,在本地同一台机器上开了两个运行实例,一个是dubbo provider实例,一个是dubbo consumer实例。首先启动provider实例没有任务问题,当启动consumer以后,控制台却抛出如下问题,

从dubbo源码分析qos-server端口冲突问题

为了解决端口冲突,开始在项目中使用各种idea搜索快捷键搜索关键字qos-server和22222都没有搜索到任何信息。一般日志都会打印包名和类型,便于快速定位问题,然后这里日志打印根本没有输出包名和类,赶紧修改日志打印格式配置,终于得到如下错误信息

从dubbo源码分析qos-server端口冲突问题

原来是这个错误是dubbo的com.alibaba.dubbo.qos.server的Server类中打印出来,查看Server类源码发现在方法start中调用了netty的初始化方法,并将port作为被外部访问的qos-server端口,代码如下

从dubbo源码分析qos-server端口冲突问题

那么问题来了:

问题1. 什么时候会启用qos服务呢,端口是何时被赋值的呢?

在Server类中可以看到唯一为 port参数赋值的方法只有setPor()方法,查看发现也只有在QosProtocolWrapper中调用了setPort()方法,查看源码可以发现,在该类的startQosServer()方法中会首先从url中解析qos.enable参数,如果未获取到该参数值,则默认启动qos服务,同时服务端口也是从url中解析,默认使用22222。

问题2. 那么这个url到底是啥呢?

其实断点程序可以发现,该url就是项目中对dubbo的一些配置信息,例如注册中心地址,超时时间,超时重试次数等等,由于项目中没有对qos服务的配置,因此全部采用了默认配置,导致端口冲突。

问题3. 如何禁用qos服务呢?

虽然qos端口冲突并影响服务消费者消费服务,但是每次程序启动总是抛出端口冲突异常,有强迫证的程序肯定以为程序哪里出错了,总会有那么一点忐忑。而且大多数情况可能并不需要这个qos服务,默认开启浪费端口,浪费机器资源(虽然资源占用并不一定很多),如果你是 java 注解配置,可以通过如下代码禁用qos服务,

从dubbo源码分析qos-server端口冲突问题

或者通过通过dubbo官网已经给出了文档来配置,文档地址 http://dubbo.apache.org/#!/docs/user/references/qos.md?lang=zh-cn

问题4. 为什么我独立搭建dubbo分布式服务的时候没有出现qos-server端口冲突呢?

原因在于qos-server 需要netty4版本的支持,默认情况下dubbo不会引用netty4的依赖包,(而项目中有依赖netty4,因此抛出端口异常,)因此在QosProtocolWrapper类中调用Server类的start()方法启动qos服务时,会抛出ClassNotFoundException,QosProtocolWrapper的startQosServer()方法仅仅try catch了异常,未做任何处理,因此根本没有抛出任何异常,这是极其反对的一种做法,至少打个日志啊。源码如下:

从dubbo源码分析qos-server端口冲突问题

总结:

1. 开发过程中日志打印及日志打印格式是非常重要的,可能大大减少问题定位的时间,因此一定要注意有效的日志输出

2. 要学会解决问题的思路,端口冲突是一个很常见的问题,通过百度或者谷歌搜索可能几分钟就能解决,只是想借此来更多的了解框架的实现细节,知其然知其所以然。

 


推荐阅读
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 实现Nginx对ThinkPHP URL重写及PATHINFO支持的详细方法解析【PHP开发】
    在PHP后端开发中,实现Nginx对ThinkPHP的URL重写及PATHINFO支持是一项常见的需求。本文详细解析了经过多次尝试和研究,最终找到的一种有效配置方法,能够确保URL_MODERewrite功能正常运行,并提供稳定的服务。此外,文章还探讨了相关配置项的具体作用及其优化建议,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 题目:图像处理(HDU1828,计算周长并集,利用线段树与离散化技术进行扫描) ... [详细]
  • 在多堆石子游戏中,通过分析Nim博弈策略,探讨了如何在限定时间和内存条件下实现最优解。本文详细研究了石子游戏中的数学原理和算法优化方法,旨在为参与者提供有效的策略指导。具体而言,文章讨论了不同堆数下的Nim值计算及其应用,帮助玩家在复杂的博弈环境中取得优势。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
author-avatar
宝贝猪雯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有