DUBBO介绍

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
DUBBO工作原理
•Provider
暴露服务方称之为“服务提供者”。
•Consumer
调用远程服务方称之为“服务消费者”。
•Registry
服务注册与发现的中心目录服务称之为“服务注册中心”。
•Monitor
统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”。
DUBBO增强设计

•设计原则

RPC在业务系统中主要实现各个应用之间的服务调用,不同于存储类中间件,不涉及数据隔离的操作,RPC的中间件在增强的时候主要负责识别压测流量以及压测标透传,服务消费者需要识别压测流量并验证白名单是否配置,白名单验证通过并将压测标以及Trace信息附着在请求中,服务提供者接收请求,若识别到压测标,则为当前请求设置压测标为True的上下文环境,注:压测设置方式都是最终都是通过改变在当前ThreadLocal中的InvokeContext对象的压测标属性,判断是否压测最终也是通过获取当前ThreadLocal中的InvokeContext对象的压测标属性,InvokeContext是一个通过Trace方法生成的上下文环境
•增强设计-服务提供方
Invoker是Dubbo中的实体域,也就是真实存在的。其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它发起invoke调用。在服务提供方,Invoker用于调用服务提供类。在服务消费方,Invoker用于执行远程调用
在服务提供方中的Invoker是由ProxyFactory创建而来的,Dubbo默认的ProxyFactory实现类为JavassistProxyFactory,代码如下:

JdkProxyFactory代码如下:

所有的服务提供者都会生成一个继承自AbstratProxyInvoker的代理服务,所有的服务处理都是通过AbstratProxyInvoker的Invoke方法用于接受服务请求处理,并返回结果,代码如下:其中Invocation对象包含了本次请求的服务信息、参数信息以及一些消费组额外设置的变量参数,其中的SetAttachment便可以设置一些额外的数据用于传递消费者方的压测标信息以及Trace信息,服务提供者通过getAttachment获取消费者设置的压测标信息以及Trace信息数据

•增强设计-服务消费者

在服务消费方,Invoker用于执行远程调用。Invoker是由 Protocol实现类构建而来。Protocol实现类有很多但是最常用的两个,分别是RegistryProtocol和DubboProtocol,所有的服务调用着都会生成代理的AbstractInvoker对象,并执行invoke方法请求服务,代码如下:

增强点类名 增强点方法名 增强点描述 异常处理
org.apache.dubbo.rpc.proxy.AbstractProxyInvoker invoke(org.apache.dubbo.rpc.Invocation) 服务提供者入口方法,通过invocation入参对象,获取发送方在attachment设置的压测以及trace数据,设置压测上下文环境
org.apache.dubbo.rpc.protocol.AbstractInvoker invoke(org.apache.dubbo.rpc.Invoker,org.apache.dubbo.rpc.Invocation) 服务消费者调用方法,将当前压测上下文的数据(包含压测标、Trace信息)设置到invocation入参的attachment数据中,传递给服务提供者,如果是压测流量,首先要进行白名单验证
Dubbo插件开发

•插件代码工程结构
注意:包名称必须以com.pamirs.attach.plugin开头

ApacheDubboPlugin类:该类为当前插件的入口,当探针框架启动成功并且成功拉取配置, ApacheDubboPlugin的onActive会被系统调用,所有增强点的增强操作都是在onActive方法中配置

interceptor包:所有增强的类都是放在该包下,目前插件常用支持方法增强的方式有以下几类,其他一些增强可查看module-pradar-core模块下com.pamirs.pradar.interceptor包的类
TraceInterceptorAdaptor类:实例方法埋点的环绕拦截器抽象实现,可实现追踪埋点与压测增强的混合逻辑
ResultInterceptor类:实例方法的结果修改拦截
ParametersWrapperInterceptor:实例方法的参数包装拦截修改
ModificationInterceptorAdaptor:可以进行参数、返回值修改
CutoffInterceptor:挡板的拦截器实现, 这里需要注意的是不能使用其他的拦截器实现挡板拦截器,因为档板的返回事件触发是在BEFORE事件中的,框架在实现返回事件时会中断后续的事件触发,如果作用域需要依赖 BEFORE、RETURN/THROWS事件组合才实现作用域,则 RETURN/THROWS 事件后续不会再被触发,则作用域会产生问题
module.config:

•增强代码说明

服务消费者



服务提供者


文档更新时间: 2021-08-04 14:47   作者:ShuLieOpenSource