一、服务端Invoker

  1. Invoker是一个代理,与dubbo中的SPI一样重要,在ServiceConfig中在调用export方法时会将一个invoker对象传递进去,分析下这个

    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {//省略。。。//TODO  invoker -> 代理类//proxyFactory是一个自适应扩展点,@Adaptive注解在方法上,因此是ProxyFactory$Adaptive//并且SPI扩展文件还有包装类//最终 proxyFactory = new StubProxyFactoryWrapper(new JavassistProxyFactory())//2.Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));//元数据的委派DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);Exporter<?> exporter = protocol.export(wrapperInvoker);exporters.add(exporter);}
    
    2. JavassistProxyFactory
    @Override
    public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {// TODO Wrapper cannot handle this scenario correctly: the classname contains '$'//这个方法会通过StringBuilder拼接代码动态的生成wrapper的实现类 并加载进jvm中//3.final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);//返回一个invoker,  invoker.doInvoke() → wrapper.invokeMethod() → proxy.需要执行的方法() return new AbstractProxyInvoker<T>(proxy, type, url) {@Overrideprotected Object doInvoke(T proxy, String methodName,Class<?>[] parameterTypes,Object[] arguments) throws Throwable {return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);}};
    }
    3.
    public static Wrapper getWrapper(Class<?> c) {while (ClassGenerator.isDynamicClass(c)) // can not wrapper on dynamic class.{c = c.getSuperclass();}if (c == Object.class) {return OBJECT_WRAPPER;}Wrapper ret = WRAPPER_MAP.get(c);if (ret == null) {//根据接口类型动态生成一个代理类//这个代理类最重要的就是生成了 invokeMethod(proxy, methodName, parameterTypes, arguments)//执行的时候直接调用被代理类的方法(没有用反射)也就是直接 proxy(ServiceConfig中传入的接口实现类)执行自己的方法();ret = makeWrapper(c);WRAPPER_MAP.put(c, ret);}return ret;
    }
  2. 按照流程继续走下去后会到DubboProtocol中的export方法

    1.
    @Override
    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {URL url = invoker.getUrl();// 要暴露的服务地址String key = serviceKey(url);//将invoker封装为DubboExporterDubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);//缓存起来,后续给客户端调用exporterMap.put(key, exporter);//省略。。。return exporter;
    }

dubbo核心之服务端的Invoker(四)相关推荐

  1. dubbo核心之消费端的Invoker(五)

    一.消费端Invoker 还是在Spring的扩展点进入(注解版从ReferenceAnnotationBeanPostProcessor) 1. DubboNamespaceHandler @Ove ...

  2. 深入解析 Dubbo 3.0 服务端暴露全流程

    简介:随着云原生时代的到来,Dubbo 3.0 的一个很重要的目标就是全面拥抱云原生.正因如此,Dubbo 3.0 为了能够更好的适配云原生,将原来的接口级服务发现机制演进为应用级服务发现机制. 作者 ...

  3. 服务端编程(四)- 背景知识 - request response 深入介绍

    服务端编程专栏正在持续更新 敬请关注:) 文章目录 前言 ´・ᴗ・` HTTP request 请求方法 request method 附加信息 addtional info response 状态码 ...

  4. 服务端技术进阶(四)一文读懂分布式系统本质:高吞吐、高可用、可扩展

    文章目录 一.承载量是分布式系统存在的原因 二.分布式系统提高承载量的基本手段 2.1 分层模型(路由.代理) 三.并发模型(多线程.异步) 四.缓冲技术 五.存储技术(NoSQL) 六.布式系统在可 ...

  5. Dubbo服务端暴露全流程

    本文来说下Dubbo服务端暴露全流程 文章目录 概述 什么是应用级服务发现 服务端暴露全流程 暴露injvm协议的服务 注册service-discovery-registry协议 暴露Triple协 ...

  6. dubbo消费端如何找到服务端对象,进行方法调用的

    关于该问题,要从以下几点点出发 消费端如何生成代理对象的 dubbo的ReferenceBean实现了InitializingBean,这是Spring中Bean的生命周期的方法,所以生成代理对象的逻 ...

  7. python 服务端主动发数据_python使用socket向客户端发送数据的方法

    Python Socket通讯例子详解 创新从模仿开始! python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: ...

  8. 详解个推java服务端集成

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 一.简介 个推是商用级的移动应用消息推送云服务解决方案,客户端SDK支持Android和iOS两大平台,云端支 ...

  9. 一、服务端开发基础(搭建Web服务器、网络基础概念、请求响应流程、配置Apache、静态网站与动态网站)

    一.建立你的第一个网站(目标) 前端开发 最终还是属于 Web 开发 中的一个分支,想要成为一名合格的前端开发人员,就必须要 充分理解Web 的概念. 构建一个专业的网站是一项巨大的工作!对于新手我们 ...

最新文章

  1. 网络负载均衡-DNS负载均衡
  2. Android源码开发笔记 -- Android数据库,屏幕休眠时间
  3. ESAComp 2020中文版
  4. Livemesh文件同步功能--使用图解
  5. android点击按钮底部暗影,android – 圆形按钮,像5.0 FAB一样的阴影
  6. simulink入门1-sim与m文件的结合
  7. [导入]创建一个ASP通用分页类代码部分
  8. html实现平面地图效果,HTML5 光点组成的平面和立体世界地图
  9. 探地雷达(GPR)的 C-scan (三维图)的绘制
  10. 键盘里的电脑:树莓派400正式发布,售价70美元
  11. Python源码深度解析—float空闲对象缓存池
  12. 松下伺服电机pwm控制连线_从零打造树莓派家庭监控 (一): 伺服电机控制
  13. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  14. 深度学习文本分类|模型代码技巧
  15. 极品飞车8 免CD补丁 CDKEY生成器
  16. 蓝鸽无盘服务器,蓝鸽英语学习平台为什么点击游客就能进去?
  17. P2P原理之设备发现
  18. 2021-05-26 使用Android Studio创建手机模拟器
  19. 【转】十大30秒内即可理解的科学理论
  20. iphone6 适配和分辨率

热门文章

  1. Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务
  2. 8Manage:电子寻源采购管理指南
  3. 统计学之参数估计(点估计和参数估计)含例题和解答
  4. 人有八疵事有四患(盧立人)
  5. MATLAB拟合曲线绘制
  6. bilibili 学习
  7. Spring之依赖注入源码解析
  8. 树梅派 moudbus
  9. 【实习周报】2019年3月 前端开发实习工作周报汇总
  10. 水安ABC考试多选练习题库(8)