top域名的网站,搭建网站步骤,网站开发行业前景,做网站首选九零后网络浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言#xff0c;我们学习Dubbo应该学的是什么#xff1f; 笔者是一名业务开发#xff0c;认为一切目的都要为我们的目标服务#xff0c;即日常工作有帮… 浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言我们学习Dubbo应该学的是什么 笔者是一名业务开发认为一切目的都要为我们的目标服务即日常工作有帮助所以笔者今天应该学的是它的源码实现流程、设计思想、扩展点过于细节的去理解记忆源码细节ROI则太低。 源码实现流程让我们对Dubbo有一个整体的了解日常遇到框架报错可以更快定位原因设计思想在面对类似的复杂的业务场景时我们可以参考Dubbo设计毕竟Dubbo已经给出了一个相对最优解扩展点可以帮助我们在日常开发中借助三方框架更加方便的实现我们的功能。以我的亲身经历来说就借助过Dubbo的Filter扩展链完成对标记了Deprecated接口的流量收集。还有泛化调用等场景 官网地址
前言
Dubbo源码主体流程可以总结为服务提供者将编写的业务Service服务按照某种协议序列化到注册中心标记当前服务的网络资源所在的位置服务消费者根据指定的keyversioninterfaceNamegroup去注册中心中找到对应的序列化数据再将数据反序列化为服务消费者能够识别的格式最终对目标资源发起调用。以此达到我们调用远程服务变成跟调用本地服务一样。
整体功能完成的基础上Dubbo在设计上对扩展开放一些比较重点的节点都能够进行扩展。如自定义注册中心、自定义配置中心、自定义序列化协议、请求过滤器链Fiter等。一些个性功能的设计也是基于扩展点完成如mock机制、心跳机制、泛化掉用、异步调用、异常重试机制、回声测试等 重要概念
1、SPI
Dubbo的SPI机制与Java原生的SPI基本类似但功能更加丰富。
使用Adaptive注解来指定某个类为某个接口的代理类Dubbo在生成自适应扩展点对象时实际上生成的就是Adaptive注解所注解的类的实例对象实现了一套简单的AOP如果一个接口的扩展点中包含了多个Wrapper类那么在Dubbo在实例化完某个扩展点后就会利用这些Wrapper类对这个实例进行包裹比如现在有一个DubboProtocol的实例同时对于Protocol这个接口还有很多的Wrapper比如ProtocolFilterWrapper、ProtocolListenerWrapper那么当对DubboProtocol的实例完成了IOC之后就会先调用new ProtocolFilterWrapper(DubboProtocol实例)生成一个新的Protocol的实例再对此实例进行IOC完了之后会再调用new ProtocolListenerWrapper(ProtocolFilterWrapper实例)生成一个新的Protocol的实例然后进行IOC从而完成DubboProtocol实例的AOP类比装饰器模式包一层
基本用法如下表示获取dubbo对应的Protocol扩展点。Protocol是一个接口。
ExtensionLoaderProtocol extensionLoader ExtensionLoader.getExtensionLoader(Protocol.class);
Protocol http extensionLoader.getExtension(dubbo);
System.out.println(http);2、ServiceBean
ServiceBean表示一个Dubbo服务相关参数含义
ref表示服务的具体实现类interface表示服务的接口parameters表示服务的参数Service注解中所配置的信息application表示服务所属的应用protocols表示服务所使用的协议registries表示服务所要注册的注册中心
补充在扫描到一个Service注解后会得到两个Bean:
一个就是服务实现类本身一个Bean对象一个就是对应的ServiceBean类型的一个Bean对象 3、URL
官网Dubbo 中的 URL 统一模型
定义了服务资源的协议、参数等信息。主要用于在各个扩展点之间传递数据组成此 URL 对象的具体参数如下:
protocol一般是 dubbo 中的各种协议 如dubbo thrift http zkusername/password用户名/密码host/port主机/端口path接口名称parameters参数键值对
dubbo 认为 protocolusernamepassworedhostportpath 是主要的 URL 参数其他键值对存放在 parameters 之中。示例如下
dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout3000
描述一个 dubbo 协议的服务zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?applicationdemo-consumerdubbo2.0.2interfaceorg.apache.dubbo.registry.RegistryServicepid1214qos.port33333timestamp1545721981946
描述一个 zookeeper 注册中心consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?applicationdemo-consumercategoryconsumerscheckfalsedubbo2.0.2interfaceorg.apache.dubbo.demo.DemoServicemethodssayHellopid1209qos.port33333sideconsumertimestamp1545721827784
描述一个消费者4、Invoker 属于Dubbo的核心模型在代码实现层面类比递归调用的责任链设计模式 在服务提供方Invoker是javassist创建的服务类的实例可以实现调用服务类内部的方法和修改字段。 在服务消费方的Invoker是基于Netty的客户端。
通过服务消费方Netty客户端获得服务提供方创建的服务类实例而后消费方为保护服务类就需要为其创建代理类这样就可以在不实例化服务类情况下安全有效的远程调用服务类内部方法并且得到具体数据了。
常见的Invoker MockClusterInvoker 完成Mock功能由MockClusterWrapper生成MockClusterWrapper是Cluster接口的包装类通过Cluster.join()方法得到MockClusterInvoker FailoverClusterInvoker完成集群容错功能是MockClusterInvoker的下级 RegistryAwareClusterInvoker如果指定了多个注册中心那么RegistryAwareClusterInvoker完成选择默认的注册中心的进行调用如果没有指定默认的则会遍历注册中心进行调用如果该注册中心没有对应的服务则跳过。 DubboInvoker完成Dubbo协议底层发送数据 ProtocolFilterWrapper$CallbackRegistrationInvoker完成对filter的调用ProtocolFilterWrapper是Protocol接口的包装类通过Protocol.refer()方法得到CallbackRegistrationInvoke。 整体流程
1、架构图 左侧为服务消费者右侧为服务提供者 service层接口层给服务提供者和消费者来实现的config层配置层主要是对dubbo进行各种配置的proxy层服务接口透明代理生成服务的客户端 Stub 和服务器端 Skeletonregistry层服务注册层负责服务的注册与发现cluster层集群层封装多个服务提供者的路由以及负载均衡将多个实例组合成一个服务monitor层监控层对rpc接口的调用次数和调用时间进行监控protocol层远程调用层封装rpc调用exchange层信息交换层封装请求响应模式同步转异步transport层网络传输层抽象mina和netty为统一接口serialize层数据序列化层网络传输需要 2、调用链路 左侧为服务消费者右侧为服务提供者