【dubbo源码】14. 服务消费方发布之注册consumer

前言

前面讲了服务提供方在启动服务的时候会进行服务的发布,启动tcp通信端口,注册到注册中心,监听事件等等

服务消费方在启动的时候也会进行服务的发布:注册到注册中心,开启netty客户端用于调用服务提供方,监听服务列表以及配置变更等。这所有的工作都是在@Reference依赖注入时,创建代理实例时完成的.

1. 代理对象的生成

可以肯定的是@Reference 注入进来的类肯定是一个代理的类,在调用该代理对象的方法时,会走rpc远程调用服务提供方的接口实例的方法。

image
image
image

利用JDK动态代理对有@Reference的接口进行代理

image

创建InvocationHandler,持有ReferenceBean的引用(就是@Reference里的配置信息)

image

判断容器中是否有referencedBeanName的实例,如果是@Service注解的类就会在spring容器中,否则就是远程应用的接口,进行InvocationHandler的初始化

image

InvocationHandler持有一个对象bean,invoke方法里反射调用的其实是这个bean对象的方法

image

一开始创建InvocationHandler对象时,bean对象肯定没有,需要赋值,调到了referenceBean的get方法

image
image

服务消费方启动的所有核心逻辑都在这个ReferceBean的父类的ReferenceConfig.init()方法中

2. ReferenceConfig.init() 消费方启动核心方法

2.1 获取配置

一进来就是检查配置,和服务提供方启动获取配置差不多的逻辑

image

获取application,module,registries,monitor等配置,registries,monitor配置分别以consumer -> module -> application按优先级进行赋值

image
consumer,module,application的来源

这些都是对应的配置类的实例,是从spring容器中获取的,然后赋值

image

`对应的配置信息是怎么变成配置类的bean并注册到spring容器中,可以看【dubbo源码】5.配置信息解析-注解版

2.2 url协议构建

2.1 将配置装到map中

获取到配置之后,把所有的配置都装到一个局部变量map里

image

获取本机的ip :先是从系统变量获取, 再是读网卡,和服务提供方 读本机ip是一样的,读到了也扔到map中

image

最后的map是这样的

image
创建ref的代理
2.2 url协议构建

三种调用方式

  • 本地调用
  • 点对点调用,@Reference配置url
  • 远程调用(经过注册中心)
  1. 先传入创建一个临时的URL对象

    image
  1. 先判断是不是本地调用

    本地调用指的是不走远程调用,调用本地的服务实例

    配置方式:

    // injvm=true,表示调用该实例方法不走远程
    @Reference(injvm = true)
    private UserService userService;
    
    image

    其他就是判断url中有没有injvm=true,url是根据map生成的,map装的是配置信息,就是判断你的injvm配置是否为true

    image

    如果是本地调用,将会生成一个injvm协议url,利用url的协议头injvm获取protocol对应的实现类InjvmProtocol的refer()方法进行invoker对象的创建

    injvm://127.0.0.1/com.lb.dubbo_api.service.UserService?application=dubbo-c&dubo=2.0.2&injvm=true
    &interface=com.lb.dubbo_api.service.UserService&methods=getUser
    &pid=7848&register.ip=192.168.100.72&side=consumer&timestamp=1626427621131
    
    image
  2. 先判断是不是点对点调用

    点对点调用指的是在@Reference配置url参数,指定调用这个url主机的服务实例方法

    image
  3. 走注册中心

    根据注册中心配置,构建registry协议URL,并把当前消费者的配置信息,配置到每一个注册协议中

    image
    1. 单注册中心创建一个invoker对象

      image
    2. 多注册中心创建多个invoker对象,并包装到StaticDirectory对象中

      image

2.3 refprotocol.refer(interfaceClass, url) 创建Invoker对象

这个方法很重要,包含了很多功能要点

  • 注册consumer
  • 监听providers,configurators,routers节点的变化 : 动态修改配置,刷新服务列表,路由过滤
refprotocol对象的来源 - spi机制
image

获取到的先是javaassist生成的类,然后refer代码里根据extName获取到的肯定是一个Protocol的包装类对象,并且最里面的实例根据现在的url是注册协议,获取到的会是RegisrtyProtocol ,【dubbo源码】7.dubbo的spi机制源码

image

跟服务提供方发布时的调用流程差不多,这三个类具体是干嘛的,可以看这个【dubbo源码】9. 服务提供方发布之netty服务端启动

image

最后调用到 RegisrtyProtocol的refer方法

image

在调到dorefer方法

image
  1. 消费者注册

    comsumer协议

    consumer://192.168.100.72/com.lb.dubbo_api.service.UserService?application=dubbo-c&category=consumers&check=false
    &dubbo=2.0.2&interface=com.lb.dubbo_api.service.UserService&methods=getUser&pid=14024&side=consumer&timestamp=1626430401334
    

    往zk里写入协议

    image
    image

    利用zk客户端api往/dubbo/com.lb.dubbo_api.service.UserService/consumers节点下写数据

    image

    通过toUrlPath(url)获取真正要注册到zk的url

    // 节点路径
    /dubbo/com.lb.dubbo_api.service.UserService/consumers
    // 节点数据
    consumer%3A%2F%2F192.168.100.72%2Fcom.lb.dubbo_api.service.UserService%3F
    application%3Ddubbo-c%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.0.2%26interface%3Dcom.lb.dubbo_api.service.UserService%26
    methods%3DgetUser%26pid%3D14024%26side%3Dconsumer%26timestamp%3D1626430401334
    

    查看该zk节点

    image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容