Dubbo概述
Dubbo 是一款高性能的 java RPC 框架
Dubbo处理流程
节点
- Provider 暴露服务的服务提供方
- Consumer 调用服务的服务消费方
- Registry 服务注册于发现的注册中心
- Monitor 统计服务的调用次数和调用时间的监控中心
- Container 服务运行容器 负责启动 加载 运行服务提供者
调用流程
- 服务提供者注册服务到注册中心
- 服务消费者向注册中心订阅服务
- 注册中心返回服务提供者列表给消费者,服务者变更,注册中心推送变更给消费者
- 服务消费者进行远程调用
- 消费者,提供者调用次数和时间发送给监控中心
SPI
SPI简介
Service Provider Interface,JDK内置的一种服务提供发现机制。用来做服务的扩展发现,动态替换发现的机制,实现解耦
SPI约定
- 实现类 resource/META-INF/services 目录创建一个接口全限定类名的文件,内容为实现类的全限定类名
- 接口实现类所在的jar包放在主程序的classpath中
- 主程序通过 java.util.ServiceLoader动态装载实现模块,扫描 META-INF/services 目录下的配置文件找到 实现类的全限定类名,把类加载到 JVM中
- SPI的实现类必须实现一个无参数构造方法
// ServiceLoader动态装载
final ServiceLoader<HelloService> services = ServiceLoader.load(HelloService.class);
Dubbo Adaptive
Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过 getAdaptiveExtension 统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行 动态选择。
Dubbo线程池
- Dubbo默认的使用固定大小的线程池,默认创建的执行线程数为200
public class WatchingThreadPool extends FixedThreadPool implements Runnable {
private final Map<URL, ThreadPoolExecutor> THREAD_POOLS = new ConcurrentHashMap<>();
public WatchingThreadPool() {
// 每隔3秒打印线程使用情况
Executors.newSingleThreadScheduledExecutor()
.scheduleWithFixedDelay(this, 1, 3, TimeUnit.SECONDS);
}
@Override
public Executor getExecutor(URL url) {
// 从父类中创建线程池
final Executor executor = super.getExecutor(url);
if (executor instanceof ThreadPoolExecutor) {
THREAD_POOLS.put(url, ((ThreadPoolExecutor) executor));
}
return executor;
}
@Override
public void run() {
// 遍历线程池,如果超出指定的部分,进行操作,比如接入公司的告警系统或者短信平台
for (Map.Entry<URL, ThreadPoolExecutor> entry : THREAD_POOLS.entrySet()) {
final URL url = entry.getKey();
final ThreadPoolExecutor executor = entry.getValue();
...
}
}
}
- SPI声明,创建文件
META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool
- 在服务提供方项目中设置使用该线程池生成器
/dubbo. properties/
dubbo.provider.threadpool=watching
Dubbo源码
ExtensionFactory
根据传入的扩展点类型和名字获取扩展
网友评论