Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • SpringCloudAlibaba

    • Nacos

    • Dubbo

      • Spring整合Dubbo
      • Dubbo泛化调用
        • 1.泛化调用
          • DubboBootstrap#start()
          • ReferenceConfigCache
        • 2.Dubbo缓存
    • Zookeeper

    • Sentinel

    • Seata

  • MQ消息队列

  • Nginx

  • Elasticsearch

  • Gateway

  • Xxl-job

  • Feign

  • Eureka

  • 中间件
  • SpringCloudAlibaba
  • Dubbo
phan
2023-05-15
目录

Dubbo泛化调用

# Dubbo泛化调用

# 1.泛化调用

# DubboBootstrap#start()

①初始化

②暴露服务exportServices:ConfigManager配置管理者把所有配置(包括应用、注册中心、服务)存放在Map容器中,暴露服务时会取出所有ServiceConfig执行export进行暴露。

③引用服务referServices:首先先从configManager中取出所有的ReferenceConfig,执行get方法初始化。首先根据引用配置对象生成key然后从缓存中取代理,如果没有则通过调用ReferenceConfig的init方法创建代理对象。

DubboBootstrap启动流程 (opens new window)

# ReferenceConfigCache

ReferenceConfig实例是一个比较重的实例,其中init初始化方法里,实现了通过与注册中心与提供者连接创建代理的过程。因此需要ReferenceConfigCache作为缓存,根据referenceConfig对象生成的key获取对应的泛化代理对象。最终Dubbo代理是通过Javassist字节码增强技术创建动态代理。

此处key的生成规则是group/版本/接口,可以根据业务和场景需求通过SPI修改生成策略。

# 2.Dubbo缓存

  • referenceConfig获取GenericService泛化调用对象时,会先从缓存取出实例化对象

①根据实验结果分析,这里服务提供方接口缓存是持久化的缓存,也就是说Dubbo每向zk暴露一个泛化接口,都会保存在本地,无论zk与Dubbo启动还是关闭都存在。

②从缓存Map中取出泛化服务引用的key,是根据分组+版本号+接口全限定名来生成。

这也就解释了为什么后面改了一个版本号就又不能进行泛化调用了。

  • 如果缓存没有实例化过,则会调用init根据Dubbo连接传入的配置,实例化"服务引用"

实例化"服务引用"过程默认要check服务提供者是否存在,不存在则抛异常导致实例化失败(此时已经在zookeeper上创建了消费者节点)。下一次通过ReferenceConfig获取"服务引用"又会失败(也会创建消费者节点,消费者节点上会带上时间戳所以每次都会创建新的节点)。可能会出现无限重复创建zk消费者节点。

编辑 (opens new window)
#中间件#SpringCloudAlibaba
上次更新: 2023/12/15, 15:49:57
Spring整合Dubbo
Zookeeper基础

← Spring整合Dubbo Zookeeper基础→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式