Dubbo

作者: 极速魔法 | 来源:发表于2022-05-02 15:31 被阅读0次

Dubbo概述

Dubbo 是一款高性能的 java RPC 框架

Dubbo处理流程

节点

  • Provider 暴露服务的服务提供方
  • Consumer 调用服务的服务消费方
  • Registry 服务注册于发现的注册中心
  • Monitor 统计服务的调用次数和调用时间的监控中心
  • Container 服务运行容器 负责启动 加载 运行服务提供者

调用流程

  1. 服务提供者注册服务到注册中心
  2. 服务消费者向注册中心订阅服务
  3. 注册中心返回服务提供者列表给消费者,服务者变更,注册中心推送变更给消费者
  4. 服务消费者进行远程调用
  5. 消费者,提供者调用次数和时间发送给监控中心

SPI

SPI简介

Service Provider Interface,JDK内置的一种服务提供发现机制。用来做服务的扩展发现,动态替换发现的机制,实现解耦

SPI约定

  1. 实现类 resource/META-INF/services 目录创建一个接口全限定类名的文件,内容为实现类的全限定类名
  2. 接口实现类所在的jar包放在主程序的classpath中
  3. 主程序通过 java.util.ServiceLoader动态装载实现模块,扫描 META-INF/services 目录下的配置文件找到 实现类的全限定类名,把类加载到 JVM中
  4. SPI的实现类必须实现一个无参数构造方法
// ServiceLoader动态装载
final ServiceLoader<HelloService> services = ServiceLoader.load(HelloService.class);

Dubbo Adaptive

Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过 getAdaptiveExtension 统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行 动态选择。

Dubbo线程池

  1. 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();

            ...
        }

    }
}

  1. SPI声明,创建文件
META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool
  1. 在服务提供方项目中设置使用该线程池生成器
    /dubbo. properties/
dubbo.provider.threadpool=watching

Dubbo源码

ExtensionFactory

根据传入的扩展点类型和名字获取扩展

相关文章

网友评论

      本文标题:Dubbo

      本文链接:https://www.haomeiwen.com/subject/clcvyrtx.html