欢迎来到皮皮网官网

【vue后台源码】【pythou源码】【etcpack源码】dubbo分支源码_dubbo源码分析

时间:2024-12-23 04:28:19 来源:fiddler 抓包获取源码

1.为什么很多程序员不用switch,分分析而是支源大量的if else?
2.Dubbo——HTTP 协议 + JSON-RPC
3.Dubbo 3.0.0 正式发布,新鲜出炉的源码中文教程快收藏
4.Dubbo 3.3.0-beta 版本正式发布
5.将Dubbo注册到Nacos,与DubboAdmin的分分析部署

dubbo分支源码_dubbo源码分析

为什么很多程序员不用switch,而是支源大量的if else?

       探索了Dubbo源码中对ChannelEventRunnable的优化设计,发现了一段关于switch和if else的源码vue后台源码巧妙用法。在分析这段代码时,分分析我陷入了深思,支源试图理解其背后的源码原因。经过一番探索,分分析最终解开了这个谜团。支源

       现代计算机CPU支持分支预测和指令流水线,源码这两个机制结合使用可以显著提升CPU的分分析执行效率。对于简单的支源if跳转指令,CPU能够较好地进行预测。源码然而,switch语句则涉及根据索引从地址数组中取地址并跳转,这使得CPU难以进行有效的预测。

       在Dubbo的pythou源码实现中,观察到ChannelEventRunnable中的state常量超过.9%的情况下是ChannelState.RECEIVED。因此,通过将这个状态独立出来使用if语句进行判断,利用CPU的分支预测机制,可以进一步优化代码执行效率。

       为了验证这一结论,通过实验对比了if和switch的执行效率。结果显示,独立的if语句在吞吐量方面明显优于switch。尽管从生成的字节码角度分析,switch的效率理论上高于if,但在实际测试中,if语句的性能优势更为显著。

       通过对if和switch的执行过程进行对比分析,我们发现if语句的效率之所以优于switch,主要原因在于if的执行方式更符合CPU的分支预测机制。同时,通过实验数据支持了这一观点,etcpack源码证实了在热点分支的情况下,使用if语句可以带来更高的性能提升。

       在探索分支预测机制时,我们还了解到指令流水线的概念,它通过将指令分解为多个步骤并行处理,以提高处理效率。分支预测器则利用历史信息预测指令跳转,提前执行相应路径的指令,以减少执行延迟。然而,分支预测也存在预测错误的风险,错误的预测可能导致流水线排空,从而影响性能。

       在处理有序数组与非有序数组的问题上,同样涉及到分支预测的影响。排序后的数组使得每次循环的分支预测结果更倾向于正确,从而提高执行效率。而未排序的redsocks源码数组则可能导致预测错误,增加执行延迟。

       综上所述,Dubbo源码中对ChannelEventRunnable的优化体现了对CPU分支预测和指令流水线的深入理解。通过调整代码结构,利用if语句独立处理热点分支,可以实现性能的显著提升。同时,探索了分支预测机制与指令流水线之间的关系,以及它们如何影响代码执行效率。在实际应用中,理解这些原理有助于优化代码性能,提升程序的执行速度。

Dubbo——HTTP 协议 + JSON-RPC

       Protocol 还有一个实现分支是 AbstractProxyProtocol,如下图所示:

        从图中我们可以看到:gRPC、HTTP、WebService、Hessian、Thrift 等协议对应的 Protocol 实现,都是继承自 AbstractProxyProtocol 抽象类。

        目前互联网的技术栈百花齐放,很多公司会使用 Node.js、Python、Rails、Go 等语言来开发 一些 Web 端应用,同时又有很多服务会使用 Java 技术栈实现,这就出现了大量的跨语言调用的需求。Dubbo 作为一个 RPC 框架,自然也希望能实现这种跨语言的调用,目前 Dubbo 中使用“HTTP 协议 + JSON-RPC”的方式来达到这一目的,其中 HTTP 协议和 JSON 都是天然跨语言的标准,在各种语言中都有成熟的类库。

        下面就重点来分析 Dubbo 对 HTTP 协议的支持。首先,会介绍 JSON-RPC 的基础,并通过一个示例,快速入门,然后介绍 Dubbo 中 HttpProtocol 的具体实现,也就是如何将 HTTP 协议与 JSON-RPC 结合使用,实现跨语言调用的效果。

        Dubbo 中支持的 HTTP 协议实际上使用的是 JSON-RPC 协议。

        JSON-RPC 是基于 JSON 的跨语言远程调用协议。Dubbo 中的 dubbo-rpc-xml、dubbo-rpc-webservice 等模块支持的 XML-RPC、WebService 等协议与 JSON-RPC 一样,都是基于文本的协议,只不过 JSON 的格式比 XML、WebService 等格式更加简洁、紧凑。与 Dubbo 协议、Hessian 协议等二进制协议相比,JSON-RPC 更便于调试和实现,可见 JSON-RPC 协议还是一款非常优秀的远程调用协议。

        在 Java 体系中,有很多成熟的 JSON-RPC 框架,例如 jsonrpc4j、jpoxy 等,其中,jsonrpc4j 本身体积小巧,使用方便,既可以独立使用,也可以与 Spring 无缝集合,非常适合基于 Spring 的项目。

        下面先来看看 JSON-RPC 协议中请求的基本格式:

        JSON-RPC请求中各个字段的含义如下:

        在 JSON-RPC 的服务端收到调用请求之后,会查找到相应的方法并进行调用,然后将方法的返回值整理成如下格式,返回给客户端:

        JSON-RPC响应中各个字段的含义如下:

        Dubbo 使用 jsonrpc4j 库来实现 JSON-RPC 协议,下面使用 jsonrpc4j 编写一个简单的 JSON-RPC 服务端示例程序和客户端示例程序,并通过这两个示例程序说明 jsonrpc4j 最基本的使用方式。

        首先,需要创建服务端和客户端都需要的 domain 类以及服务接口。先来创建一个 User 类,作为最基础的数据对象:

        接下来创建一个 UserService 接口作为服务接口,其中定义了 5 个方法,分别用来创建 User、查询 User 以及相关信息、删除 User:

        UserServiceImpl 是 UserService 接口的实现类,其中使用一个 ArrayList 集合管理 User 对象,具体实现如下:

        整个用户管理业务的核心大致如此。下面我们来看服务端如何将 UserService 与 JSON-RPC 关联起来。

        首先,创建 RpcServlet 类,它是 HttpServlet 的子类,并覆盖了 HttpServlet 的 service() 方法。我们知道,HttpServlet 在收到 GET 和 POST 请求的时候,最终会调用其 service() 方法进行处理;HttpServlet 还会将 HTTP 请求和响应封装成 HttpServletRequest 和 HttpServletResponse 传入 service() 方法之中。这里的 RpcServlet 实现之中会创建一个 JsonRpcServer,并在 service() 方法中将 HTTP 请求委托给 JsonRpcServer 进行处理:

        最后,创建一个 JsonRpcServer 作为服务端的入口类,在其 main() 方法中会启动 Jetty 作为 Web 容器,具体实现如下:

        这里使用到的 web.xml 配置文件如下:

        完成服务端的编写之后,下面再继续编写 JSON-RPC 的客户端。在 JsonRpcClient 中会创建 JsonRpcHttpClient,并通过 JsonRpcHttpClient 请求服务端:

        在 AbstractProxyProtocol 的 export() 方法中,首先会根据 URL 检查 exporterMap 缓存,如果查询失败,则会调用 ProxyFactory.getProxy() 方法将 Invoker 封装成业务接口的代理类,然后通过子类实现的 doExport() 方法启动底层的 ProxyProtocolServer,并初始化 serverMap 集合。具体实现如下:

        在 HttpProtocol 的 doExport() 方法中,与前面介绍的 DubboProtocol 的实现类似,也要启动一个 RemotingServer。为了适配各种 HTTP 服务器,例如,Tomcat、Jetty 等,Dubbo 在 Transporter 层抽象出了一个 HttpServer 的接口。

        dubbo-remoting-http 模块的入口是 HttpBinder 接口,它被 @SPI 注解修饰,是一个扩展接口,有三个扩展实现,默认使用的是 JettyHttpBinder 实现,如下图所示:

        HttpBinder 接口中的 bind() 方法被 @Adaptive 注解修饰,会根据 URL 的 server 参数选择相应的 HttpBinder 扩展实现,不同 HttpBinder 实现返回相应的 HttpServer 实现。HttpServer 的继承关系如下图所示:

        这里以 JettyHttpServer 为例简单介绍 HttpServer 的实现,在 JettyHttpServer 中会初始化 Jetty Server,其中会配置 Jetty Server 使用到的线程池以及处理请求 Handler:

        可以看到 JettyHttpServer 收到的全部请求将委托给 DispatcherServlet 这个 HttpServlet 实现,而 DispatcherServlet 的 service() 方法会把请求委托给对应接端口的 HttpHandler 处理:

        了解了 Dubbo 对 HttpServer 的抽象以及 JettyHttpServer 的核心之后,回到 HttpProtocol 中的 doExport() 方法继续分析。

        在 HttpProtocol.doExport() 方法中会通过 HttpBinder 创建前面介绍的 HttpServer 对象,并记录到 serverMap 中用来接收 HTTP 请求。这里初始化 HttpServer 以及处理请求用到的 HttpHandler 是 HttpProtocol 中的内部类,在其他使用 HTTP 协议作为基础的 RPC 协议实现中也有类似的 HttpHandler 实现类,如下图所示:

        在 HttpProtocol.InternalHandler 中的 handle() 实现中,会将请求委托给 skeletonMap 集合中记录的 JsonRpcServer 对象进行处理:

        skeletonMap 集合中的 JsonRpcServer 是与 HttpServer 对象一同在 doExport() 方法中初始化的。最后,我们来看 HttpProtocol.doExport() 方法的实现:

        介绍完 HttpProtocol 暴露服务的相关实现之后,下面再来看 HttpProtocol 中引用服务相关的方法实现,即 protocolBindinRefer() 方法实现。该方法首先通过 doRefer() 方法创建业务接口的代理,这里会使用到 jsonrpc4j 库中的 JsonProxyFactoryBean 与 Spring 进行集成,在其 afterPropertiesSet() 方法中会创建 JsonRpcHttpClient 对象:

        下面来看 doRefer() 方法的具体实现:

        在 AbstractProxyProtocol.protocolBindingRefer() 方法中,会通过 ProxyFactory.getInvoker() 方法将 doRefer() 方法返回的代理对象转换成 Invoker 对象,并记录到 Invokers 集合中,具体实现如下:

        本文重点介绍了在 Dubbo 中如何通过“HTTP 协议 + JSON-RPC”的方案实现跨语言调用。首先介绍了 JSON-RPC 中请求和响应的基本格式,以及其实现库 jsonrpc4j 的基本使用;接下来我们还详细介绍了 Dubbo 中 AbstractProxyProtocol、HttpProtocol 等核心类,剖析了 Dubbo 中“HTTP 协议 + JSON-RPC”方案的落地实现。

Dubbo 3.0.0 正式发布,新鲜出炉的中文教程快收藏

       6月,Dubbo阵营迎来重大更新,正式发布了Dubbo 3.0.0版本。这份全新的中文教程新鲜出炉,不容错过。自助源码

       对于Dubbo尚不清楚的朋友,这里先来科普一下:Dubbo是阿里巴巴推出的一款高性能、轻量级的Java服务框架,旨在简化分布式服务的开发和部署。

       Dubbo的核心特性包括:高可用、高性能、分布式、可扩展、服务注册与发现、负载均衡等。它的发展历程也值得一提:

       年,Dubbo开源,标志着其诞生。

       年,最后一个维护版本2.5.3发布后,项目一度沉寂。

       年,Dubbo起死回生,官方重启维护,并得到重点支持。

       年,Dubbo 3.0的开发正式启动,Dubbox项目分支合并,Spring Boot版本也相继发布。

       年,Dubbo正式成为Apache顶级项目,适应云原生环境,强调服务的复用与云基础设施的对接。

       Dubbo 3.0.0在保持与2.7.x兼容的同时,着重提升了易用性,拓展了超大规模微服务实践,以及与云原生基础设施的契合度。这份详细教程涵盖了8大模块,包括新功能介绍、概念架构解析、基本功能示例、升级与兼容性指南、多语言支持以及参考手册等,无论老用户还是新手都能从中获益。

       深入理解Dubbo3的核心概念,可以参考“概念与架构”部分;想要直接体验新特性,可以参考“介绍与示例”;了解现有扩展和参考手册,可在“基本功能”和“参考手册”章节找到。教程详尽丰富,不容错过,快来领取吧!

Dubbo 3.3.0-beta 版本正式发布

       近日,Apache Dubbo社区宣布正式发布3.3分支的大版本3.3.0-beta.1。相较于3.2系列版本,3.3.0-beta版本引入了众多重量级功能升级。

       3.3.0-beta.1版本带来的核心能力升级包括:Spring Boot Starters、Dubbo AOT静态化(GraalVM Native Image)、Triple协议升级、Rest协议升级、可观测性(Metrics & Tracing)、JDK 与协程支持等。

       Spring Boot Starters组件可以简化Spring Boot用户的应用开发。例如,以Zookeeper注册中心为例,新版本的开发只需增加一个依赖即可。更多Starter组件包括dubbo-curator5-zookeeper-spring-boot-starter、dubbo-nacos-spring-boot-starter等。

       Dubbo AOT静态化方案基于GraalVM Native Image实现,旨在提升Dubbo应用的启动与运行速度。Native的启动耗时降低了倍以上,内存损耗降低了3.5倍。

       Triple协议是Dubbo3设计的基于HTTP的RPC通信协议规范,完全兼容gRPC协议,支持Request-Response、Streaming流式等通信模型,可同时运行在HTTP/1和HTTP/2之上。

       Rest协议升级基于Dubbo的多协议发布能力,可以将RPC服务发布为标准的rest风格HTTP服务。可观测性方面,Metrics和Tracing的易用性得到大幅提升。

       3.3.0-beta版本支持平滑升级到JDK 版本,并增加了Project Loom协程支持。Dubbo3规划的核心功能均已开发完成,将从3.3.0-beta.1版本开始进入长期稳定维护阶段。

将Dubbo注册到Nacos,与DubboAdmin的部署

       本文介绍如何将 Dubbo 注册至 Nacos 并与 DubboAdmin 部署。

       首先部署单机模式 Nacos,可以通过 IDEA 或 Maven 命令启动。配置鉴权确保安全。

       Nacos 部署成功后,将 Dubbo 服务注册中心从 Zookeeper 迁移至 Nacos,修改 POM 文件引入依赖并调整 application.properties 配置。

       接下来部署 Dubbo Admin 服务,切换分支后修改注册中心、端口号以及 Dubbo protocol 端口号。使用 Maven 命令打包后启动。

       Dubbo Admin 提供多种功能,主要用于服务测试。启动后可访问 Web 管理端,探索其他功能。

       注意生产环境中,确保无端口号冲突。 Dubbo Admin 默认账户密码为“root”。分享此内容,期待你的支持与指正。

copyright © 2016 powered by 皮皮网   sitemap