框架介绍1.1.1概述Dubbo是阿里巴巴开源的一个高性能、优秀的服务框架,让应用通过高性能的RPC实现服务输出和输入功能,并且可以集成与Spring框架无缝集成。Dubbo是一个高性能、轻量级的开源JavaRPC框架,提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、自动服务注册和发现。1.1.2运行架构dubbo运行架构如下图节点角色描述节点角色描述Provider暴露服务提供者Consumer调用远程服务消费者Registry服务注册和发现注册中心Monitor统计服务调用次数和调用时间监控中心Container服务运行容器调用关系显示,服务容器负责服务提供者的启动、加载和运行。当服务提供者启动时,它向注册中心注册它提供的服务。当服务消费者启动时,它向注册中心订阅它需要的服务。注册中心将服务提供者地址列表返回给消费者。如果有变化,注册中心会基于长连接将变化数据推送给消费者。服务消费者,从提供者地址列表中,根据软负载均衡算法选择一个提供者调用,如果调用失败,再选择另一个提供者调用。服务消费者和提供者在内存中累积调用次数和调用时间,每分钟定时向监控中心发送统计数据。dubbo的特点是连接性、健壮性、可扩展性以及对未来架构的可升级性。更详细的功能介绍,也可以参考官方文档。1.1.3整体设计图例说明:图中左侧淡蓝色背景为服务消费者使用的接口,右侧浅绿色背景为服务提供者使用的接口,图上的接口中轴为双方所用。该图从下到上分为十层。每一层都是单向依赖的。右边的黑色箭头表示层与层之间的依赖关系。每一层都可以通过剥离上层来重复使用。其中,Service和Config层是API。所有其他层都是SPI。图中绿色小块是扩展接口,蓝色小块是实现类。图中只展示了用于关联各层的实现类。图中蓝色虚线为初始化过程,即启动时的汇编链,红色实线为方法调用过程,即运行时时序链,紫色三角箭头为继承。你可以把子类看成是父类的同一个节点,上面一行文字就是要调用的方法。各层说明:config配置层:对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接初始化配置类,也可以通过spring解析配置代理生成配置类服务代理层:服务接口的透明代理,生成服务客户端Stub和server-sideSkeleton,以ServiceProxy为中心,扩展接口为ProxyFactoryregistryRegistry层:封装服务地址的注册和发现,以服务URL为中心,扩展接口为RegistryFactory,Registry,RegistryServicecluster路由层:封装多个路由providers和负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router、LoadBalancemonitor监控层:RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor、MonitorService协议远程调用层:封装RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker、Exporterexchange信息交换层:封装请求响应方式,同步到异步,以Request、Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient、ExchangeServertransport网络传输层:抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server、Codecserialize数据序列化层:一些可复用的工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool1.2环境搭建接下来逐步分析dubbo各个模块的源码和原理。目前dubbo框架已经交给Apache基金会孵化,并在github上开源。Dubbo社区目前主要维护两个大版本,2.6.x和2.7.x。其中,2.6.x主要集中在bug修复和少量增强,因此可以充分保证稳定性。2.7.x作为社区的主要开发版本,一直在不断更新,增加了很多新的特性和优化,但也带来了一些稳定性上的挑战。项目,左侧??各模块的大致功能将在后续课程中介绍。下载源码导入工程后编译,跳过测试。在这个过程中,你可能会遇到如下问题[ERROR]Failedtoexecutegoalorg.xolstice.maven.plugins:protobuf-maven-plugin:0.5.1:compile(default)onprojectdubbo-serialization-protobuf:Missing:[ERROR]------------[ERROR]1)com.google.protobuf:protoc:exe:windows-x86_64:3.7.1[ERROR][ERROR]尝试从项目网站手动下载文件。[错误][错误]然后,使用以下命令安装它:[错误]mvninstall:install-file-DgroupId=com.google.protobuf-DartifactId=protoc-Dversion=3.7.1-Dclassifier=windows-x86_64-Dpackaging=exe-Dfile=/path/to/file[ERROR][ERROR]或者,如果您托管自己的存储库,您可以在那里部署文件:[ERROR]mvndeploy:deploy-file-DgroupId=com.google.protobuf-DartifactId=protoc-Dversion=3.7.1-Dclassifier=windows-x86_64-Dpackaging=exe-Dfile=/path/to/file-Durl=[url]-DrepositoryId=[id][ERROR][ERROR]依赖路径:[错误]1)org.apache.dubbo:dubbo-serialization-protobuf:jar:2.7.8[ERROR]2)com.google.protobuf:protoc:exe:windows-x86_64:3.7.1[ERROR][ERROR]----------[ERROR]1需要工件丢失。[错误][错误]工件:[错误]org.apache.dubbo:dubbo-serialization-protobuf:jar:2.7.8[错误][错误]来自指定的远程存储库:[错误]apache。快照(https://repository.apache.org/snapshots,releases=false,snapshots=true),[错误]alimaven(http://maven.aliyun.com/nexus/content/groups/public/,releases=true,snapshots=false)手动下载,执行mvninstall:install-file-DgroupId=com.google.protobuf-DartifactId=protoc-Dversion=3.7.1-Dclassifier=windows-x86_64-Dpackaging=exe-Dfile=C:\Users\22863\Desktop\test\protoc-3.7.1-windows-x86_64.exe1.2.2通过下图可以大致了解源码结构,dubbo源码各个模块的相关功能:模块描述:dubbo-common公共逻辑模块:包括Util类和通用模型dubbo-remoting远程通信模块:相当于Dubbo协议的实现,如果RPC使用RMI协议,则不需要使用该包。dubbo-rpc远程调用模块:抽象各种协议,动态代理,只包含一对一调用,不关心集群管理。dubbo-cluster集群模块:将多个服务提供者伪装成一个提供者,包括:负载均衡、容错、路由等。集群的地址列表可以静态配置,也可以由注册中心下发。dubbo-registry注册中心模块:基于注册中心发布的集群方式,对各种注册中心进行抽象。dubbo-monitor监控模块:统计服务调用次数、调用时间、调用链跟踪的服务。dubbo-config配置模块:是Dubbo的对外API,用户通过Config使用Dubbo,隐藏Dubbo的所有细节。dubbo-container容器模块:是一个Standlone容器,通过简单的Main加载Spring启动,因为服务通常不需要Tomcat/JBoss等web容器的特性,不需要使用web容器来实现加载服务。1.2.3环境导入本课程不仅讲解了dubbo源码,还涉及了相关的基础知识。为了方便同学们快速的理解和掌握每一个内容,都准备了相关的工程,只需要导入到IDEA中即可。对于代码在项目中的具体作用,1.2.4测试会在后续课程中讲解(1)安装zookeeper(2)修改官网案例,配置zookeeper地址(3)启动服务提供者及启动服务消费者1.2.5管理控制平台下载管理控制台,GITHUB地址进入源码目录,打包编译mvncleanpackage-Dmaven.test.skip=true构建成功提示:如果下载nodejs安装包出错构建过程中,可以直接将安装包放在maven仓库中(资料中已提供安装包)。启动后台管理服务java-jardubbo-admin-0.2.0-SNAPSHOT.jar管理后台地址:http://127.0.0.1:8080/默认帐号和密码都是root进入管理后台,可以查看启动的服务器和消费者。
