第十周课后练习
根据微服务框架 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):生成动态代理类
整体时序图
评论