dubbo
dubbo
dubbo 机构分为 10 层:
服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。远程调用层(Protocol):封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。
Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
架构
服务暴露过程
serviceConfig -> invoker -> exporter
服务消费的过程
referenceConfig -> invoker -> service
基础知识
dubbo 扩展机制 SPI
dubbo 扩展了jdk的SPI, 增加了 adaptive, active, 同时增加了对IOC和AOP的支持。
dubbo 注册中心
dubbo是以总线模式来时刻传递和保存配置信息的,所以URL时刻承载在信息的传递功能。
集群容错
Failover Cluster 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
负载均衡
Random LoadBalance 随机 按权重设置随机概率。
RoundRobin LoadBalance 轮询 按公约后的权重设置轮询比率。
LeastActive LoadBalance 最少活跃调用数 相同活跃数的随机,活跃数指调用前后计数差。
ConsistentHash LoadBalance 一致性 Hash 相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
直连指定开发环境
只需要在reference 节点 指定url即可,格式为 procotol//ip:port/package.interface.name
dubbo SPI
javaSpi 不能按需加载实现类,会直接实例化所有的类,导致资源浪费。 实现类为 ServiceLoader
而dubboSpi 配置文件为 在 METE-INF/dubbo 下,配置key=value 对,可以按需要进行加载,延迟加载。 实现类为 ExtensionLoader
常见错误
线程资源被耗尽,导致线上响应异常:
dubbo 异常信息:
source: 172.16.208.149
tag:hostname: venus-prod-006
tag:path: /root/venus/logs/errorc.log
tag:receive_time: 1597464216
tag:user_defined_id: venus
topic:
content: 2020-08-15 12:03:35,730]-[ERROR]-[grouper_-thread-4]-[InspireRuleRecaller]-[TraceId:66fd9febebfca0f0,SpanId:878d5709a921a07e]-[[召回- inspire_rule -异常] openId = ochvq0FLAhvmTqO9xL0WMBrnIZNE
org.apache.dubbo.rpc.RpcException: Failed to invoke the method batchGetRecSimpleNote in the service com.xiaodaka.adonis.service.GenericRecommendNoteService. Tried 3 times of the providers [172.16.214.226:20999, 172.16.214.225:20999, 172.16.214.224:20999] (3/3) from the registry 172.16.208.180:2181,172.16.208.181:2181,172.16.208.182:2181 on the consumer 172.16.249.49 using the dubbo version 2.7.7. Last error is: Failed to invoke remote method: batchGetRecSimpleNote, provider: dubbo://172.16.214.226:20999/com.xiaodaka.adonis.service.GenericRecommendNoteService?anyhost=true&application=cupid-api&batchGetRecommendNote.executes=200&bean.name=com.xiaodaka.adonis.service.GenericRecommendNoteService&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&executes=400&generic=false&group=PROD&init=false&interface=com.xiaodaka.adonis.service.GenericRecommendNoteService&metadata-type=remote&methods=batchGetRecommendNote,batchGetRecSimpleNote&organization=xdk&owner=zw&pid=31943&qos.enable=false®ister=true®ister.ip=172.16.249.49&release=2.7.3&remote.application=adonis-provider&revision=1.0.0&side=consumer&sticky=false&timeout=500×tamp=1596601007973&version=1.0.0, cause: org.apache.dubbo.remoting.RemotingException: Server side(172.16.214.226,20999) threadpool is exhausted ,detail msg:Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-172.16.214.226:20999, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 29611069 (completed: 29610869), Executor
参考资料
架构:
https://blog.csdn.net/qq_33101675/article/details/78701305
https://www.cnblogs.com/lukelook/p/11229485.html
spi 介绍
https://segmentfault.com/a/1190000024443652?utm_source=sf-related