`
iwinit
  • 浏览: 454808 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

服务框架HSF分析之一容器启动

阅读更多

 

大家平时都在用这个服务框架。简单阅读了下代码,了解其原理可以方便解决一些常见hsf的问题。限于篇幅,整个分析将分几个系列发布。第一篇将简单介绍Hsf的启动和各组件之间关系。

 

一.  Hsf总体架构

 

某服务框架简单分析

 

 

这个图很经典,想必大家都了解,Consumer,Provider,中间通过ConfigServer联接。那么其内部是如何实现的呢?请看下文。

二.  容器启动,jboss为例

HSF使用基于equinox(OSGi框架的eclipse实现,http://www.eclipse.org/equinox/)的OSGi,启动流程

 

某服务框架简单分析

 

 

1.     /opt/xxxx/jboss/server/default/conf/xmdesc/org.jboss.deployment.MainDeployer-xmbean.xml指定sar优先加载:

 

050:.deployer,050:-deployer.xml,100:.aop,100:-aop.xml,150:.sar,150:-service.xml,200:.beans,250:.rar,300:-ds.xml,350:.har,400:.jar,400:.ejb3,400:.par,500:.war,…

 

 

2.      taobao-hsf.sar/META-INF/jboss-service.xml 指定初始化类:

 

<server>
  <mbeancode="com.xxxx.hsf.thirdcontainer.jboss.HSFContainerDelegator"name="hsf:service=containerdelegator">
  </mbean>
</server>

 

 

3.     设置Jboss的class loader给HSF,以便HSF访问Jboss的类:

 

HSFContainer.setThirdContainerClassLoader(jbossClassloader);

 

 

4.     启动hsf容器 

 

HSFContainer.start(null);

 

 

4.1  寻找HSF的plugins

4.2 配置Equinox

 

FrameworkProperties.setProperty("osgi.syspath", searchPath);
…..

 

 

4.3  启动 Equinox

 

EclipseStarter.run(new String[] { "-configuration","hsf.configuration" }, null);

 

 

这里HSF使用了OSGi的Declarative Service(http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgids/index.html)方式来启动,典型配置如下:

OSGI下的配置文件

 

<?xml version="1.0"encoding="UTF-8"?>
<component name="ConfigurationComponent">
    <service>
        <provide
           interface="com.xxxx.hsf.configuration.service.ConfigurationService"/>
    </service>
    <implementation
        class="com.xxxx.hsf.configuration.component.ConfigurationComponent"/>
</component>:

 

 

有点类似spring的DI,完成整个容器的启动,这里hsf用到的service都会初始化完成,但是基本不干啥事。

4.4  OSGi容器初始化后,拿到OSGi上下文,让jboss容器和OSGi容器可以相互访问

 

context = EclipseStarter.getSystemBundleContext();

 

 

5.     将hsf暴露的类注册到jboss的classloader中,方便后续app中使用,典型的比如HSFSpringProviderBean和HSFSpringConsumerBean

 

Map<String,Class<?>> exportedClasses = HSFContainer.getExportedClasses();
       for (String className : exportedClasses.keySet()) {
           jbossRepo.cacheLoadedClass(className, exportedClasses.get(className),jbossClassloader);
        } 

 

 

三.  Provider启动

当APP启动时,会用spring加载hsf的配置文件,典型provider如下:

 

  <beanclass="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init">
      <propertyname="serviceInterface">
         <value>com.xxxx.ump.core.service.PromotionReadService</value>
      </property>
      <propertyname="serviceName">
        <value>PromotionReadService</value>
      </property>
      <propertyname="target">
        <ref bean="promotionReadService"/>
      </property>

 

 

……

  因为容器初始化时已经将HSF的类注册到了jboss的classloader中,所以在spring中可以找到HSFSpringProviderBean类定义,开始provider的初始化。

  Provider角度看,类图如下:

 

某服务框架简单分析

 

ProcessService是核心控制流程类,掌管发布和消费的入口。从provider端来看,基本流程如下:

1.根据服务类型,注册服务提供者,保证服务在本机的唯一性,关联业务层和通讯层。在这里会做应用服务器的初始化,服务线程池分配(如果配置)。最终的TBRemotingRPCProtocolComponent.registerProvider代码如下:

 

// 仅启动一次HSF SERVER
        …….
providerServer.startHSFServer();
……
       // 注册对象到HSFServer上
       providerServer.addMetadata(metadata.getUniqueName(), metadata);
                 providerServer.addWorker(metadata.getUniqueName(),metadata.getTarget());

 

 

应用服务器初始化后,本地hsf端口12200打开,可以接受请求。在这一步,我们可以通过配置修改hsf的运行期参数,比如端口,业务线程数等。

2.通过Publisher将服务注册到configServer上

四.  Consumer启动

     当消费者启动时,我们会这样配置:

 

<beanid="shopReadServiceImpl"class="com.xxxx.hsf.app.spring.util.HSFSpringConsumerBean" init-method="init">
        <property name="interfaceName">
           <value>com.xxxx.shopservice.core.client.ShopReadService</value>
        </property>

 

 

  同样通过jboss的classloader我们可以找到HSFSpringConsumerBean这个类定义,开始consumer的初始化。

  从consumer角度看,类图如下:

 

某服务框架简单分析

 

同样通过ProcessService的consume方法生成一个调用的代理类。流程如下:

1. 使用jdk动态代理,生成调用远程HSF服务的代理

 

InvocationHandler handler = newHSFServiceProxy(metadata);
       Object proxyObj = Proxy.newProxyInstance(getClass().getClassLoader(), newClass[] { interfaceClass }, handler);

 

生成的代理类叫HSFServiceProxy,其invoke方法使用TBRemotingRPCProtocalComponent组件调用通讯层接口,发送请求。

2.     通过metadataService订阅服务信息,包括:

a.     通过diamond订阅服务路由规则和流量规则,路由规则即调用哪些机器,hsf可以限制consumer的调用机器范围,流量规则即流控策略,hsf可以通过推送规则限流。

b.     通过configServer的client订阅服务地址信息,这里可以拿到所有提供该service的机器地址,consumer根据之前获得的路由规则和访问策略(默认随机)来决定请求哪台机器。

 

 

五.             小结

本文简单分析了hsf容器的启动,后续将分析具体的consume和provide过程

分享到:
评论
1 楼 wuwenyu 2014-10-30  
我想知道淘宝HSF使用OSGi集成进去 目的是什么???
有哪些场景会用到???

相关推荐

    taobao-hsf.tgz

    淘宝HSF(High Speed Service Framework)是阿里巴巴开源的一款高性能、轻量级的服务框架,主要用于构建大规模分布式服务系统。HSF全称为High Speed Service Framework,它基于Java语言开发,旨在提高服务调用的效率...

    阿里hsf接口 sar包

    在阿里巴巴的HSF框架中,`.sar`文件是一种特殊格式的压缩包,全称为Service Archive,它是HSF服务的容器,包含了服务提供者所需要的所有依赖和配置信息。`.sar`文件的作用类似于Java的`.war`或`.ear`文件,用于打包...

    taobao-hsf

    【标题】"taobao-hsf" 是一个与阿里巴巴云服务相关的技术组件,它主要用于构建分布式服务框架。在阿里云的生态系统中,HSF(High Speed Service Framework)是为大规模分布式服务设计的一种高性能、高可用的服务化...

    阿里云分布式应用服务EDAS-快速入门.pdf

    * 链路分析:在于服务化的架构体系中,对于任何一次业务上的请求,底层都会有很多远程的HSF服务化调用,访问数据库,收发消息,或者其它的操作,通过链路分析的功能,可以准确的描绘出上层一次用户请求,所经历的...

    阿里云分布式应用服务EDAS-快速入门-D.docx

    EDAS的特色之一是其服务化架构,基于淘宝的互联网架构经验,可以帮助用户构建高性能、易扩展的Web应用。服务框架包含同机房优先、动态归组、服务限流等功能,确保服务调用的高效和稳定。例如,同机房优先策略可以...

    hsfjetty插件,eclipse用

    HSF(High Speed Service Framework)是阿里巴巴开源的一款基于Java的高性能服务框架,它主要用于构建分布式服务系统。Jetty则是一个轻量级的HTTP服务器和Servlet容器,常用于测试和部署Java Web应用。 标题中的...

    阿里云分布式应用服务EDAS-产品简介.pdf

    服务框架包括基本的远程服务调用、同机房优先策略(优化跨机房通信)、动态归组(自动服务分组)以及服务限流功能,确保服务稳定性和性能。 3. **运维管控**:内置的运维工具允许用户实时监控应用运行状态,快速...

    藏经阁-EDAS—轻松搞定分布式应用服务.pdf

    1. **服务化高性能服务框架**: - 提供服务鉴权机制,确保服务的安全性。 - 应用生命周期管理,支持应用的创建、启动、停止、部署、回滚、扩容和删除。 - 应用Beta和分批发布,便于逐步推广新版本。 - 弹性伸缩...

    阿里云分布式应用服务EDAS-产品简介-D.docx

    其服务框架不仅支持基本的远程服务调用,还具备如同机房优先、动态归组、服务限流等特性,以优化服务调用的性能和稳定性。 - **同机房优先**:确保HSF(High Speed Service Framework)服务消费者优先选择同机房的...

    edas-edas-developer-guide-cn-zh-2017-12-14

    阿里巴巴推出的EDAS(企业级分布式应用服务)是一个为开发、部署和管理分布式应用系统提供支持的平台。在本开发指南中,涉及了开发环境的配置、API的开发以及示例程序(dome)的开发等内容。本指南主要面向使用Ali-...

Global site tag (gtag.js) - Google Analytics