Dubbo复习
2021-05-17 00:36:50 2 举报
AI智能生成
Dubbo原理
作者其他创作
大纲/内容
服务端发布和处理流程
服务端发布流程
1、ServiceConfig调用export()方法进入发布流程
1、对ServiceConfig的属性进行合法性校验
2、加载所有注册中心,可以同时注册到多个注册中心
3、将参数封装为URL
4、如果未指定是远程服务则也要导出本地服务
5、获取通过Javassist生成的Invoker对象
6、export(invoker),将元数据信息推送到注册中心
到zookeeper创建临时节点
2、选择Protocol调用export(Invoker)
1、本地服务暴露为InjvmProtocol
2、远程服务为暴露为RegistryProtocol
3、调用DubboProtocol的export(Invoker)
一个机器只会开启一个监听,缓存双重检查保证单例
1、生成DubboExport对象
2、缓存对象到exportMap中
3、开启NettyServer进行监听
实际调用的是适配器类进行反射+装饰模式进行增强
服务端处理流程
1、NettyServer监听到消息后发给Dubbo内部业务线程池
2、DubboProtocol.connected()方法处理请求,根据URL里面的参数创建Invocation对象
3、从exportMap中取出对应的DubboExport对象调用invoker(invocation)方法
4、调用invoker方法后返回CompletableFuture对象,进行异步处理
消费方订阅和调用流程
消费方订阅流程
装饰模式包装,所以放到最后一步,调用的时候是在最外层
1、ReferenceConfig调用init()方法进入订阅流程
1、检查mock
2、如果是是本地引用,生成本地引用Invoker对象
3、不是本地引用,为注册中心的每个服务生成Invoker对象
4、使用Javassist创建Invoker的代理对象
2、选择Protocol调用refer()
3、建立路由规则链
4、订阅服务提供者地址
消费方与同一个服务提供者机器上的多个服务公用一个链接
从注册中心获取服务提供者,并注册监听事件,服务提供者列表发送变化时通知消费者更新本地Invoker列表
1、为每个提供者的URL生成一个DubboInvoker对象
2、与服务提供者建立连接
3、使用装饰模式封装Filter责任链
4、缓存到invokerMap中,添加到Invoker列表
5、包装容错机制到Invoker对象
消费方调用流程
1、调用接口方法被invoker的代理对象拦截,调用Invoker的invoke()方法
2、根据请求参数创建invocation对象
3、使用invocation对象发起远程请求
4、对返回结果进行处理:异步/同步
负载均衡和容错机制
服务降级和mock
类似于降级服务的fail:return
服务降级
流程
1、服务提供者注册降级信息到zookeeper
2、服务消费者订阅降级信息
3、MockClusterInvoker发起远程调用时检查URL执行降级策略
降级策略
force:return
fail:return
强制返回指定mock值,不发起远程调用
远程调用失败时再返回指定mock值
消费端mock
1、消费方设置mock实现类
2、远程服务调用失败时则再获取mock类的Invoker对象
3、调用mock类的代理Invoker对象的invoke()方法
线程模型和线程池策略
线程池模型
所有消息发到业务线程池处理
所有消息都由I/O线程处理
请求响应消息给线程池处理,心跳事件等消息由I/O线程处理
请求消息给线程池处理,其他事件由I/O线程处理
连接断开事件由指定线程池处理,请求响应等事件由业务线程池处理
all
direct
message
execution
connection
线程池策略
FixedThreadPool
线程数默认200
默认队列SynchronousQueue(不存元素)
队列个数设置小0,使用无界的LinkedBlockingQueue
队列个数设置大于0,使用有界的LinkedBlockingQueue
LimitedThreadPool
核心线程数默认0
默认最大线程数200
EagerThreadPool
空闲60秒回收
CachedThreadPool
固定线程个数
动态线程数,空闲不回收
所有核心线程池忙碌时不放入阻塞队列,新建线程执行任务
自适应线程池,新请求来时创建新线程处理
bossGroup处理连接请求,完成TCP三次握手workerGroup监听连接事件进行网络I/O处理
并发控制
ActiveLimitFilter拦截处理
ExecuteLimitFilter拦截处理
服务消费端
使用Synchronize实现等待超时机制
使用AtomicInteger原子类CAS更新并发线程数
服务提供端
Dubbo:20880
分层结构
统计RPC调用次数和调用耗时
封装RPC调用逻辑
封装请求响应模式,同步转异步
默认Netty
Service和Config层
提供方发布服务:ServiceConfig
代理消费方接口:ReferenceConfig
Proxy代理层
对服务消费端接口进行代理,本地调用转换为远程调用
对服务提供方实现类进行代理,把服务实现类转换为Wrapper类,使用Javassist减少反射调用
Registry服务注册中心层
服务提供方把服务注册到注册中心
消费者启动时去注册中心获取服务提供方的地址列表
Cluster路由层
路由规则
负载均衡
集群容错
Monitor监控层
Protocol远程调用层
Exchange信息交换层
Transport网络传输层
Serialize序列化层
远程调用概要
服务暴露过程
使用Javassist减少反射调用
转换过程会先启动Netty监听连接,然后注册到注册中心
1、ServiceConfig通过ProxFactory的getInvoker()方法生成一个Invoker对象
2、通过DubboProtocol的export()方法将Invoker对象转换为Exporter对象
服务引用过程
1、ReferenceConfig通过refer()方法为注册中心的每个服务生成Invoker实例
2、通过ProxFactory将Invoker转换为客户端需要的接口
基本原理
通过适配器选择SPI接口的实现类
面向接口编程
为每个服务提供者实现类动态生成一个Wrapper类,Wrapper类通过方法名索引调用指定方法
适配器原理
1、动态编译生成Protocol$Adaptive
2、Protocol$Adaptive根据URL中的参数选择对应的实现类
获取适配器对象采用了缓存的双重检查
生成适配器的源码(字符串)
增强SPI
将所有实现类放在Map里面,查找类的setter方法,如果有则递归注入,获取依赖的对象时也是采用缓存的双重检查
使用反射+装饰模式进行增强,反射调用Wrapper的构造函数将原始对象作为参数传递进行增强
JDK标准SPI的缺点
一次性实例化所有扩展点的实现
扩展点加载失败,异常信息不友好
不支持IOC和AOP
SPI的IOC
SPI的AOP
Javassist
集群容错和负载均衡策略
失败重试:默认两次
快速失败:立即报错
安全失败:忽略异常
失败自动恢复,延迟重试
并行调用:并行调用多个服务,有一个成功即返回成功线程池调用设置成功结果到阻塞队列,主线程阻塞式取值,默认超时1s
广播调用:调用所有服务,有一个失败则返回失败
Failover
Failfast
Failsafe
Failback
Forking
Broadcast
负载均衡策略
带权重设置
带权重设置,处理慢的服务时间长了会堆积请求阻塞
每个提供者维护一个活跃计数器,记录当前处理请求的个数
基于虚拟节点的一致性hash
随机策略
轮训策略
最少活跃数
一致性hash
泛化调用
不提供api,由GenericFilter拦截处理泛化请求
0 条评论
回复 删除
下一页