• 只要等一等就能多“等”出8600万美元! 2019-01-23
  • 长颈鹿在中国高纬度地区成功繁育 小鹿刚出生一米八 2019-01-23
  • 浙江十二选五开奖结果:dubbo源码—service export

    3d开奖结果走势图连线 www.fwrl.net

    悟空不以为然道:“我侄儿年纪尚幼,要练成太乙金仙,今后有的是时机,但我若不阻此事,于他日后修行不利?!?/p>

    创业之三重境界

    “聪明,精神意念?!跋θ蘸斓纳粼诹硪环酱锤蝮《亲永锩娴慕峤缭缇捅幌θ蘸焐枇艘淮?,里面的一切环境她都了若指掌。
    唐欣的班主任坐在了椅子上,对着身前站着的唐欣问道:“听数学老师说,你最近数学成绩突飞猛进?”

    “你可以这么理解,不过现在我也算是客人一个,老板娘你用这样的语气我可以理解为你是在赶客人,或者说我是众多客人里面让你看我不爽的一个?!绷躔┌翟抟簧?,不愧是马叮当,冷静从容,自信,骄傲,这种骄傲并不是形容人骄傲的贬义词,用来形容马叮当则是变成了褒义。

    dubbo源码—service export


    在应用编写好服务并进行之后,dubbo负责将服务export出去,dubbo export服务的时候主要做了以下几件事:

    • 将服务export到本地(根据scope的配置)
    • 创建Invoker(启动本地NettyServer,监听指定端口,等待请求)
    • 注册provider的信息到registry,供consumer发现并订阅服务
    • 订阅registry中的configurator节点,可以动态更改部分provider的配置

    暴露服务的配置方式有:

    • 直接通过API方式
    • 通过xml配置
    • 通过注解

    ServiceBean加载和初始化

    以常用的xml配置为例,前面说了dubbo的xml自定义标签最后都是将对应的bean注入容器中,

    <dubbo:service interface="com.souche.service.TestDubboService" ref="testDubboServiceImpl"/>

    dubbo解析xml会将对应的bean—ServiceBean注入到spring容器中,由于解析xml的时候配置的bean是非lazyInit的,所以在spring容器初始化完成之后,会初始化所有非lazyInit的bean。

    在spring容器初始化后,会广播ContextRefreshedEvent事件通知,ServiceBean实现了ApplicationListener,在收到该事件之后调用export方法

    // AbstractApplicationContext
    public void refresh() throws BeansException, IllegalStateException {
      // Instantiate all remaining (non-lazy-init) singletons.
      finishBeanFactoryInitialization(beanFactory);
      
      // Last step: publish corresponding event.
      // 里面会广播ContextRefreshedEvent事件
      finishRefresh();
    }
    
    // ServiceBean
    public void onApplicationEvent(ApplicationEvent event) {
      // 在容器初始化完成之后收到ContextRefreshedEvent事件,开始export服务
      if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) {
        if (isDelay() && ! isExported() && ! isUnexported()) {
          if (logger.isInfoEnabled()) {
            logger.info("The service ready on spring started. service: " + getInterface());
          }
          export();
        }
      }
    }

    服务export从ServiceConfig#export开始

    1. export:判断是否是延迟启动,如果是延迟启动则启动守护线程,sleep指定时间之后再调用doExport,否则直接调用
    2. doExport:主要工作是检查并配置
      1. 初始化application、registries、monitor等配置
      2. 判断是否是泛化调用,如果不是,判断interface和ref是否合法
      3. 检查并配置application、registries、protocols、ServiceConfig本身,找对应配置类属性的set方法,依次从System.getProperty(-D参数指定,或者set进去的配置)、dubbo.properties.file参数执行的配置文件文件中查找对应的属性,然后调用set 方法配置
      4. 检查是否有stub和mock配置,如果有配置,判断配置是否合法。如果有stub配置:判断stub类是否有该服务interface类型的构造方法;如果有mock配置:如果直接是"return"表达式,parse返回的value是否合法,否则需要判断mockClass是否有无参的构造方法
    3. loadRegistries:加载所有的registries,可能会有多个注册中心,查找所有的registries配置并返回符合条件的
      1. 针对每一个registry配置,从applicationConfig、registryConfig获取参数拼装registryUrl
      2. 条件是:如果是provider则register不能配置为false(可以不配置,如果配置了必须为true);如果不是provider,subscribe不能配置为false(可以不配置,如果配置了必须为true)。
    4. doExportUrls:由于dubbo支持多个协议,所以dubbo针对每一种协议都会在每一个注册中心注册一遍
    5. doExportUrlsFor1Protocol:根据配置来拼装URL,在export的整个过程中靠URL来传递配置
      1. 获取配置的协议名称,如果没有配置协议名称,则使用默认协议:dubbo
      2. 获取配置的ip:port,如果port没有配置从默认端口20880开始依次向后寻找可用的port,如果port配置为-1表示随机选取一个port
      3. 从application、module、provider、ptotocol等获取配置,将这些配置加入到map中将来用来生成URL
      4. 判断是否有dubbo:argument配置,将对应的配置也加入map
      5. 是否是泛化(Generic)调用,如果没有则判断是否有method级的配置
      6. 是否是injvm的调用,如果是,则不需要注册到注册中心
      7. 根据前面host:port、protocolName、map构造URL
      8. 判断scope的配置,为none表示不暴露服务,配置为remote则export到local和remote,如果配置为local则只export到local

    export服务到本地

    如果scope没有配置或者配置local、remote,dubbo会将服务export到本地,意思就是:将服务以injvm协议export出去,如果是同一个jvm的应用可以直接通过jvm发起调用,而不需要通过网络发起远程调用。

    export到本地主要做了以下几件事:

    1. 将url的协议配置为jvm,host:port配置为127.0.0.1:0
    2. 构造filter链,虽然是本地export,但是会经过定义好的filter
    3. 构造InjvmExporter

    创建Invoker

    如果scope没有配置或者配置remote,dubbo会创建invoker,创建invoker的时候会启动NettyServer,监听指定的端口等待consumer请求。在dubbo中provider和consumer端都会有Invoker,实现的是同一个接口,但是不同的实现,invoker的意义就是服务的代理,provider侧的invoker就是提供服务的可执行体,在netty接收到请求之后会通过invoker来处理,最后调用目标服务。

    创建invoker并启动NettyServer的调用堆栈

    export的主要过程是:

    1. 创建Invoker,proxyFactory.getInvoker
    2. 创建filter链,ProtocolFilterWrapper#buildInvokerChain
    3. 调用配置的exporter的listener,ListenerExporterWrapper#ListenerExporterWrapper
    4. 启动NettyServer,DubboProtocol#openServer

    filter和listener是可扩展的,可以自己实现filter和listener,按照SPI方式配置好,dubbo会自动加载。

    注册到注册中心并订阅

    前面只是完成service的启动并具备可被请求的状态,但是dubbo作为一个支持服务自发现的框架,还会把provider的信息注册到registry,并且订阅configurators。

    注册的调用堆栈是

    注册和订阅主要逻辑在RegistryProtocol#export

    1. 启动NettyServer
    2. 注册providerUrl
    3. 订阅configurators

    registry就是一个目录服务,注册的过程也就是创建对应的目录,并订阅关心的目录变化。provider会在registry中创建类似如下的目录结构

    其中provider注册的url为,会创建com.foo.BarService、provider和providerUrl节点

    dubbo/com.test.service.TestDubboService/providers/dubbo%3A%2F%2F192.168.0.102%3A20880%2Fcom.test.service.TestDubboService%3Fapplication%3Dcom.test.demo%26default.export%3Dtrue%26export%3Dtrue%26generic%3Dfalse%26interface%3Dcom.test.service.TestDubboService%26pid%3D45599%26side%3Dprovider%26timestamp%3D1515313385792

    接下来会创建并订阅configurators节点,订阅的意思就是监听configurators及其子节点,创建configurators的时候会添加listener,provider端监听configurators的listener是:

    com.alibaba.dubbo.registry.integration.RegistryProtocol.OverrideListener#notify

    在治理中心中修改provider的配置的时候,注册中心会通知监听的listener,provider会进行相关配置。

    总结

    export服务是dubbo关键路径中的第一步,此时dubbo已经具备了被consumer自动发现并调用的条件,接下来就是consumer发现服务。

    当前文章://www.fwrl.net/news_57938.html

    发布时间:2019-03-24 11:57:53

    男人和女人的六个思考差异 大阅兵在即,带你走走看看世界各国阅兵式 压抑与节制 情绳 古龙逝世三十周年:酒色财气,浪荡一生 什么样的脸是“网红脸” 妹子,你向往什么样的爱情? 未来婆婆会不会成为扼杀感情的主要原因?

    怎么确定家中的风水财位? 冬季放生龟鳖类要考虑的注意事项 天津心理工作站战友印象之赵?;?/a> 17道题自测心理健康 不要让孩子未来孤苦无依 女生怎么健身锻造好身材? 穿运动装的那些人 罗李华:白羊座2016年运势 李嘉诚:我一直都在,从未离开 原创:无回应之处,便是绝境 一个人是怎样一步步变狭隘的 泡妞的一个中心和两个基点 宝宝半夜耳痛为哪般 没错,我就是个坏男人 佛家经典故事 学习能力: 4年级孩子考试第一名! 罗李华简谈2016年十二生肖运势 宝宝皮肤过敏的注意事项 新娘眉毛的画法技巧分析?打造自然美丽新娘

    编辑:帝宗开

      

    Comments are closed.

  • 只要等一等就能多“等”出8600万美元! 2019-01-23
  • 长颈鹿在中国高纬度地区成功繁育 小鹿刚出生一米八 2019-01-23