7.8 服务暴露总结
服务提供端配置:
1 <!-- 提供方应用信息,用于计算依赖关系 --> 2 <dubbo:application name="demo-provider"/> 3 4 <!-- 使用zookeeper注册中心,并使用curator客户端 --> 5 <dubbo:registry protocol="zookeeper" address="10.211.55.5:2181" client="curator"/> 6 7 <!-- 用dubbo协议在20880端口暴露服务 --> 8 <dubbo:protocol name="dubbo" port="20880"/> 9 10 <!-- 和本地bean一样实现服务 --> 11 <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/> 12 13 <!-- 声明需要暴露的服务接口 --> 14 <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
一 ServiceBean
1 继承实现关系
2 最终的ServiceBean实例
-->String id: "com.alibaba.dubbo.demo.DemoService" -->String beanName: "com.alibaba.dubbo.demo.DemoService" -->ApplicationContext applicationContext: ClassPathXmlApplicationContext实例 -->supportedApplicationListener:true -->List<URL> urls: ["dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461"] -->List<Exporter<?>> exporters:[-->InjvmExporter实例-->String key:com.alibaba.dubbo.demo.DemoService-->Map<String, Exporter<?>> exporterMap: {"com.alibaba.dubbo.demo.DemoService ", 当前的JvmExporter实例}-->Invoker invoker:经过filter包装的AbstractProxyInvoker实例-->RegistryProtocol返回的新的Exporter实例-->Exporter exporter: ExporterChangeableWrapper<T> exporter实例-->Invoker originInvoker:经过filter包装的AbstractProxyInvoker实例-->Exporter exporter: DubboExporter-->Registry registry: 上边的ZookeeperRegistry实例 ] -->String interfaceName:"com.alibaba.dubbo.demo.DemoService" -->Class<?> interfaceClass:interface com.alibaba.dubbo.demo.DemoService -->T ref: DemoServiceImpl实例 -->String path:"com.alibaba.dubbo.demo.DemoService" -->List<ProtocolConfig> protocols:[解析:<dubbo:protocol name="dubbo" port="20880" id="dubbo" />] -->ApplicationConfig application:[解析:<dubbo:application name="demo-provider" id="demo-provider" />] -->List<RegistryConfig> registries:[解析:<dubbo:registry address="10.211.55.5:2181" protocol="zookeeper" id="com.alibaba.dubbo.config.RegistryConfig" />]
二 调用简图
三 代码调用链
ServiceBean.onApplicationEvent(ApplicationEvent event) -->ServiceConfig.export()-->doExport()-->doExportUrls()-->doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs)protocolConfig:<dubbo:protocol name="dubbo" port="20880" id="dubbo" /> registryURLs:registry://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&client=curator&dubbo=2.0.0&pid=3141®istry=zookeeper×tamp=1510021313960<!-- 一 本地暴露 -->-->exportLocal(url)url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3141&side=provider×tamp=1510021401013//1.1 将实现类ref封装成Invoker-->JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url)proxy:DemoServiceImpl实例(即ref实例) type:interface com.alibaba.dubbo.demo.DemoService url:injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3141&side=provider×tamp=1510021401013-->Wrapper.getWrapper(Class DemoServiceImpl)-->new AbstractProxyInvoker<T>(proxy, type, url)//1.2 将实现类Invoker暴露为Exporter-->ProtocolFilterWrapper.buildInvokerChain(final Invoker<T> invoker, String key, String group)组建invoker链,实际上只有最后一个是真正的AbstractProxyInvoker实例,前边的都是filter。invoker:AbstractProxyInvoker实例 key:service.filter group:provider-->InjvmProtocol.export(Invoker<T> invoker)invoker:经过filter包装的invoker-->new InjvmExporter(Invoker<T> invoker, String key, Map<String, Exporter<?>> exporterMap)invoker:经过filter包装的invoker key:com.alibaba.dubbo.demo.DemoService exporterMap:传入时为空,构造器执行后为{"com.alibaba.dubbo.demo.DemoService ", 当前的JvmExporter实例}-->List<Exporter<?>> exporters.add(上述的exporter)<!-- 二 远程暴露 -->//2.1 将实现类ref封装成Invoker-->JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url)proxy:DemoServiceImpl实例(即ref实例) type:interface com.alibaba.dubbo.demo.DemoService url:registry://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&client=curator&dubbo=2.0.0&export=dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3141&side=provider×tamp=1510021401013&pid=3141®istry=zookeeper×tamp=1510021313960-->Wrapper.getWrapper(Class DemoServiceImpl)-->new AbstractProxyInvoker<T>(proxy, type, url)-->RegistryProtocol.export(final Invoker<T> originInvoker)originInvoker:上述的AbstractProxyInvoker实例//2.2 将invoker转化为exporter-->doLocalExport(originInvoker)-->new InvokerDelegete(Invoker<T> invoker, URL url)invoker:原始的AbstractProxyInvoker实例url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461-->ProtocolFilterWrapper.buildInvokerChain(final Invoker<T> invoker, String key, String group)组建invoker链,实际上只有最后一个是真正的InvokerDelegete实例,前边的都是filterinvoker:InvokerDelegete实例 key:service.filter group:provider-->DubboProtocol.export(Invoker<T> invoker)invoker:经过filter包装的InvokerDelegete实例-->new DubboExporter(Invoker<T> invoker, String key, Map<String, Exporter<?>> exporterMap)invoker:经过filter包装的InvokerDelegete实例 key:com.alibaba.dubbo.demo.DemoService:20880 (group/servicename:version:port)exporterMap:传入时为空,构造器执行后又执行了put,为{"com.alibaba.dubbo.demo.DemoService:20880", 当前的DubboExporter实例}//2.3 开启netty服务端监听客户端请求-->openServer(URL url)url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461-->createServer(URL url)-->HeaderExchanger.bind(URL url, ExchangeHandler handler)url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461 handler:DubboProtocol.requestHandler-->new DecodeHandler(new HeaderExchangeHandler(handler)))-->NettyTransporter.bind(URL url, ChannelHandler listener)url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461 listener:上边的DecodeHandler实例-->new NettyServer(URL url, ChannelHandler handler)-->ChannelHandler.wrapInternal(ChannelHandler handler, URL url)handler:上边的DecodeHandler实例 url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&threadname=DubboServerHandler-10.10.10.10:20880×tamp=1510023456461-->new MultiMessageHandler(HeartbeatHandler(AllChannelHandler(handler)))-->getChannelCodec(url)//获取Codec2,这里是DubboCountCodec实例-->doOpen()//开启netty服务-->new HeaderExchangeServer(Server server)server:上述的NettyServer-->startHeatbeatTimer()-->new ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker)exporter:上述的DubboExporter实例 originInvoker:原始的AbstractProxyInvoker实例//2.4 创建Registry:创建zkclient,连接zk-->getRegistry(final Invoker<?> originInvoker)-->AbstractRegistryFactory.getRegistry(URL url)url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&export=dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461&pid=3508×tamp=1510023439825-->ZookeeperRegistryFactory.createRegistry(URL url)-->new ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter)url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.registry.RegistryService&pid=3508×tamp=1510023439825-->ZkclientZookeeperTransporter.connect(URL url)-->new ZkclientZookeeperClient(URL url)url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.registry.RegistryService&pid=3508×tamp=1510023439825-->new ZkClient(url.getBackupAddress())//这里是10.211.55.5:2181-->AbstractRegistryFactory.Map<String, Registry> REGISTRIES.put("zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService", 上边的ZookeeperRegistry实例)//2.5 向注册中心注册服务-->registry.register(registedProviderUrl)-->ZookeeperRegistry.doRegister(URL url)url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461-->AbstractZookeeperClient.create(String path, boolean ephemeral)path:/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461 ephemeral=true//2.6 订阅override数据-->ZookeeperRegistry.doSubscribe(final URL url, final NotifyListener listener)url:provider://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461 listener:RegistryProtocol.OverrideListener实例//2.7 创建新的Exporter实例-->new Exporter<T>()//包含了上边的ExporterChangeableWrapper<T> exporter实例 + ZookeeperRegistry实例
7.8 服务暴露总结相关推荐
- Dubbo原理何源码解析之服务暴露
2019独角兽企业重金招聘Python工程师标准>>> 一.框架设计 在官方<Dubbo 用户指南>架构部分,给出了服务调用的整体架构和流程: 另外,在官方<Dub ...
- Dubbo服务暴露原理
服务暴露原理 配置文件 IOC容器启动,加载配置文件的时候 Dubbo标签处理器,解析每一个标签 封装成对应的组件 service 解析service标签 将service标签信息,封装成Servic ...
- mac如何将本地服务暴露到外网?
在做微信公众号开发时,需要将本地服务暴露到外网,除了ngrok外,还有什么方法呢? 假设本地有个test文件夹,那么如何才能使别人通过浏览器访问到你的文件夹?接下来介绍另一个方法:localtunne ...
- spring整合dubbo和springboot整合dubbo,实现服务暴露区别
spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的@Service 注解实现的 之前我们是通过@Autowired ...
- 面试官问我:解释一下Dubbo服务暴露
今天我们要分析的就是Dubbo的服务暴露过程,这个过程属于Dubbo的核心过程之一了,因为Dubbo的大体流程就是服务暴露->服务引用->服务消费这几个主流程,当然还会涉及到注册发现.负载 ...
- Dubbo服务暴露的流程
在Dubbo服务暴露中,需要被暴露的服务的接口类首先会通过proxyFactory代理工厂获得代理的对象invoker,而暴露之后的服务被调用,也将都会通过这个invoker来调用相关的类. 在dub ...
- 暴露的全局方法_Dubbo源码解析实战 - 服务暴露原理
欢迎关注全是干货的技术公众号 dubbo面试中比较喜欢问的两个点:服务发布和服务引用. 人性的拷问 服务发布过程中做了哪些事 dubbo都有哪些协议,他们之间有什么特点,缺省值是什么 什么是本地暴露和 ...
- Dubbo服务暴露(导出)流程
Dubbo作为一个Rpc框架,服务端必须得将自己暴露出去,以便客户端的调用,所以我们来看一下dubbo是如何将服务进行暴露的. 首先我们知道,启动dubbo得进行一些配置,如下图所示的一些dubbo标 ...
- 【Dubbo源码阅读系列】服务暴露之本地暴露
在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...
- SpringCloud Alibaba系列——7Dubbo的服务暴露和注册
学习目标 Dubbo的注册流程 Dubbo的暴露流程 第1章 注册流程 先贴出注册发布总流程图 1.1 流程描述 当需要发布一个服务的时候就需要把该服务的信息注册到注册中心中,具体来说就是需要把用于消 ...
最新文章
- 黑马java代码04-05.docx
- Android uevent
- Android TextView滚动的两种方案
- 多播泡妞宝典---IGMP
- 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!...
- 2.SOA架构:服务和微服务分析及设计--- 理解面向服务架构
- 使用Spring的AbstractRoutingDataSource实现多数据源切换
- 喜马拉雅xm格式转化mp3_强大的视频格式转换工具
- png图片转化为ico图标并保留透明背景方法
- 重构之前的数据统计,用于数据归档,要考虑数据迁移
- 用MicroPython开发ESP32-文件传输工具-ampy
- iOS 14 Beta 5 来了,修复游戏闪退问题了,还有着几个变化!
- echarts 制作图表固定的三个步骤
- storm如何部署拓扑
- 百度收购91无线,效果未必如愿
- 微信小程序——本地存储
- 文件夹同名EXE病毒
- 多机房UPS及环境集中监控方案丨UPS环境综合监控主机
- for example: not eligible for auto-proxying
- VTK笔记——插值样条曲线采样