dubbo怎么注册服务的?dubbo如何调用?

dubbo是一款微服务开发框架,是spring cloud alibaba体系中重要的一部分,并且它提供了 RPC通信 与 微服务治理 两大关键能力,因此得到很多企业频繁使用,那dubbo怎么注册服务的?下面来我们就来给大家讲解一下。

dubbo怎么注册服务的.jpg

1、注册的起点

在RegistryProtocol.export()方法包含了服务导出,注册,以及数据订阅等逻辑。其中服务注册先调用RegistryProtocol.register()方法。

public void register(URL registryUrl, URL registeredProviderUrl)
{
    // 获取 Registry
    Registry registry = registryFactory.getRegistry(registryUrl);
    // 注册服务
    registry.register(registeredProviderUrl);
}

可以看出,服务注册主要包括两部分,获取注册中心实例和向注册中心注册服务。

2、获取注册中心实例

(1)调用registryFactory.getRegistry(registryUrl)方法,它会先访问缓存,缓存中不存在则调用createRegistry(URL)方法创建Registry,然后写入缓存。这里的createRegistry是一个模版方法,有具体的子类实现。这里假设使用zookeeper作为注册中心,则调用ZookeeperRegistryFactory的createRegistry()方法。

public Registry createRegistry(URL url)
{
    // 创建 ZookeeperRegistry
    return new ZookeeperRegistry(url, zookeeperTransporter);
}
public ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter)
{
    super(url);
    if (url.isAnyHost())
    {
        throw new IllegalStateException("registry address == null");
    }
    // 获取组名,默认为 dubbo
    String group = url.getParameter(Constants.GROUP_KEY, DEFAULT_ROOT);
    if (!group.startsWith(Constants.PATH_SEPARATOR))
    {
        // group = "/" + group
        group = Constants.PATH_SEPARATOR + group;
    }
    this.root = group;
    // 创建 Zookeeper 客户端,默认为 CuratorZookeeperTransporter
    zkClient = zookeeperTransporter.connect(url);
    // 添加状态监听器
    zkClient.addStateListener(new StateListener()
    {
        @Override
        public void stateChanged(int state)
        {
            if (state == RECONNECTED)
            {
                try
                {
                    recover();
                }
                catch (Exception e)
                {
                    logger.error(e.getMessage(), e);
                }
            }
        }
    });
}

(2) 在ZookeeperRegistry构造方法中调用connect(url)方法,默认是CuratorZookeeperClient, 获得一个ZkClient客户端,之后添加状态监听器。

3、向注册中心注册服务

假设存在一个服务com.alibaba.dubbo.demo.DemoService, 那么 这个服务对应的配置信息(存储在 URL 中)最终被注册到了 /dubbo/com.alibaba.dubbo.demo.DemoService/providers/ 节点下。

(1) 调用FailbackRegistry.register()方法,之后调用里面的doRegister方法,它是一个模版方法,在ZookeeperRegistry中实现。

protected void doRegister(URL url)
{
    try
    {
        // 通过 Zookeeper 客户端创建节点,节点路径由 toUrlPath 方法生成,路径格式如下:
        // /${group}/${serviceInterface}/providers/${url}
        zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));
    }
    catch (Throwable e)
    {
        throw new RpcException("Failed to register...");
    }
}

(2) 调用create()方法。通过递归创建当前节点的上一级路径,然后再根据ephemeral的值决定是创建临时还是持久节点。分别调用createEphemeral和createPersistent方法。

dubbo如何调用?

1、 服务容器负责启动,加载,运行服务提供者。

2、 服务提供者在启动时,向注册中心注册自己提供的服务。

3、服务消费者在启动时,向注册中心订阅自己所需的服务。

4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

总之dubbo应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成,是重要的开源框架之一!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。

推荐阅读:

打开json文件提示找不到怎么回事?打开json文件方法有哪些?

dubbo面试题有哪些?dubbo原理面试题

java三元运算符的值如何确定?java三元运算符怎么使用?