第十周课后练习

用户头像
饭桶
关注
发布于: 2020 年 11 月 30 日



根据微服务框架 Dubbo 的架构图,画出 Dubbo 进行一次微服务调用的时序图



服务端发布过程

前期准备阶段

1. 上面三个方法:主要为了拼接参数

2. export:判断服务是否打开,是否延迟等

3. doExport:校验参数,如果为null,则初始化

4. doExportUrls:

    1. loadRegisteries:拼接参数到registryUrl(解析配置的标签:<dubbo:registry />

5. doExportUrlsFor1Protocol:将protocols列表中的每个protocol根据url暴露出去,将module,provider拼接成更长的URL(这里是遍历的,因为dubbo是支持多协议的



Invoker转换为Exporter

1. ProxyFactory.getInvoker:这里用到了Dubbo SPI(后面会细说)由于spi标签中指定了默认(javassistProxyFactory),所以跳转到了javassistProxyFactory

2. JavaassistProxyFactory.getInvoker:这里将proxy通过字节码生成wrapper,然后将wrapper封装到Invoker中(本地暴露的url是以“injvm”开头),如果是本地调用exportLocal方法(略)远程调用export方法

3. export:将 Invoker 转为 Exporter

4. doLocalExport:doLocalExport() 用 ExporterChangeableWrapper 代理类包装了 protocol.export() 方法返回的 exporter 对象,最后放到了 bounds 集合中缓存。 5. DubboPrtocol.export:创建 exporter 对象



打开Netty,建立网路通信

1. openServer :用于 Netty 服务端启动

2. createServer:创建 server 后添加到 serverMap 中

3. bind:将暴露的接口+DubboExporter进行关联放入map中进行缓存

4. 后面三个方法:将NettyServer转为ExchangeServer放入map中进行缓存



连接注册中心,并获取Registry实例,并将url发布到注册中心的节点上

1. getRegistry:连接注册中心,返回注册中心实例

2. createRegistry:创建注册中心实例

3. getRegistedProviderUrl:获取注册到注册中心的url

4. new ZookeeperRegistry(url , zookeeperTransport ):创建Registry实例

    1. ZookeeperRegister这个类的构造方法第一行是super(url)。用到了父类FailbackRegister的构造方法。这个方法中zookeeper信息会缓存到本地作为一个 cache 文件(所以当注册中心集群挂掉了,发布者和订阅者也是可以通信的

    2. 然后通过ZkClient的api监听节点

5. notify:获取注册中心的时候进行订阅(在注册到注册中心之后,registry会去订阅覆盖配置的服务,这一步之后就会在/dubbo/dubbo.common.hello.service/HelloService节点下多一个configurators节点。)



客户端消费过程



前期准备

1. afterProertiesSet:变量数据的初始化

2. getObject:获取实例

3. get:判断ref是否为null,如果不是null则进入下一个方法

4. init:如果这个dubbo服务类还没有被实例化,会先调用ReferenceConfig.init方法进行实例化

       checkDefault:获取消费者全局配置

       appendProperties:从jvm运行变量里面取相应的值写到consumer里面

       createProxy:生成一个dubbo服务代理类



组装invoker,与zk建立连接

1. refer:组装了一个Invoker对象,通过proxyFactory.getProxy(invoker)生成一个代理(dubbo默认使用了javassist)



3. register:把Consumer注册到注册中心sonsumers目录下

4. subscribe:订阅和监听configurators,providers,routers目录



注册中心的订阅及Invoker创建

1. subscribe:订阅服务提供者

2. doSubscribe:向服务端发送订阅请求

3. notify:服务订阅完之后通知

4. refreshInvoker:重建invoker实例

5. toInvokers:providerurl转成具体的invoker

6. protocol.refer:因为我们传过来的协议是dubbo,所以使用的最后处理的就是DubboProtocol,当然少不了的是warpper类的包裹,这个和export是一致的

7. 



Invoker获取及集群

1. join:通过FailFastCluster获取并返回远程代理Invoker

2. getProxy:获取动态代理工厂

3. new InvokerInvocationHandler(invoker):生成动态代理类



整体时序图



用户头像

饭桶

关注

还未添加个人签名 2020.07.27 加入

还未添加个人简介

评论

发布
暂无评论
第十周课后练习