大家平时都在用这个服务框架。简单阅读了下代码,了解其原理可以方便解决一些常见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优先加载:

  1. 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 指定初始化类:

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

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

  1. HSFContainer.setThirdContainerClassLoader(jbossClassloader);

4.     启动hsf容器

  1. HSFContainer.start(null);

4.1  寻找HSF的plugins

4.2 配置Equinox

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

4.3  启动 Equinox

  1. 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下的配置文件

  1. <?xml version="1.0"encoding="UTF-8"?>
  2. <component name="ConfigurationComponent">
  3. <service>
  4. <provide
  5. interface="com.xxxx.hsf.configuration.service.ConfigurationService"/>
  6. </service>
  7. <implementation
  8. class="com.xxxx.hsf.configuration.component.ConfigurationComponent"/>
  9. </component>:

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

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

  1. context = EclipseStarter.getSystemBundleContext();

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

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

三.  Provider启动

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

  1. <beanclass="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init">
  2. <propertyname="serviceInterface">
  3. <value>com.xxxx.ump.core.service.PromotionReadService</value>
  4. </property>
  5. <propertyname="serviceName">
  6. <value>PromotionReadService</value>
  7. </property>
  8. <propertyname="target">
  9. <ref bean="promotionReadService"/>
  10. </property>

……

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

Provider角度看,类图如下:

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

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

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

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

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

四.  Consumer启动

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

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

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

从consumer角度看,类图如下:

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

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

  1. InvocationHandler handler = newHSFServiceProxy(metadata);
  2. 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过程

服务框架HSF分析之一容器启动的更多相关文章

  1. 阿里巴巴分布式服务框架HSF

    HSF称之为高速服务框架HSF(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架. HSF连通不同的业务系统,解耦系统间的实现依赖.HSF从分布式 ...

  2. 分布式服务框架HSF

    最近在读阿里巴巴中台战略思想与架构这本书,so和大家分享一些我get到的东东. HSF是阿里巴巴内部的分布式服务框架,这个大家都很熟悉了,先上一张HSF的工作原理图: 这个图说明了HSF框架中每个组件 ...

  3. 分布式服务框架HSF学习

    HSF提供的是分布式服务开发框架,taobao内部使用较多,总体来说其提供的功能及一些实现基础:1.标准Service方式的RPC  1).Service定义:基于OSGI的Service定义方式  ...

  4. 分布式服务框架选型:面对Dubbo,阿里巴巴为什么选择了HSF?

    转载:http://www.sohu.com/a/141490021_268033 阿里巴巴集团内部使用的分布式服务框架 HSF(High Speed Framework,也有人戏称“好舒服”)已经被 ...

  5. 003-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-分布式服务框架的选择

    3.1.淘宝平台“服务化”历程 大约2007年,淘宝500人团队,维护一个war包,200多个功能模块. 1)项目团队协同成本高,业务响应越来越慢 2)应用复杂度超出人的认知负载. 3)错误难于隔离[ ...

  6. php微服务框架 PHP-MSF 的容器部署和使用

    评论:1 · 阅读:8412· 喜欢:1 一.需求 PHP-msf 是 Carema360 开发的 PHP 微服务框架,目前我没有实际用过,但是市面上的微服务框架要么在推崇 Spring 系,要么是  ...

  7. 唯品会RPC服务框架与容器化演进--转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25 ...

  8. Spring源码分析专题 —— IOC容器启动过程(上篇)

    声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...

  9. abp vNext微服务框架分析

    本文转载自:https://www.cnblogs.com/william-xu/p/11245738.html abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了 ...

随机推荐

  1. 由abcd四个字符取5个作允许重复的排列,要求a出现次数不超过2次,但不能不出现;b不超过1个;c不超过3个;d出现的次数为偶数。求满足以上条件的排列数。

    一.我的解法       由于没复习,我在想一般的方法,那就是d取0.2.4,然后分步计算,得到225这个错误答案. 二.指数型母函数       设满足以上条件取个排列的排列数为,的指数型母函数为 ...

  2. APT攻防对抗

    APT(高级持续性威胁)攻击是指近年来,专业甚至是有组织和国家背景支持的黑客,针对重要目标和系统发起的一种攻击手段,主要特征有 1)持续性:攻击者为了重要的目标长时间持续攻击直到攻破为止.攻击成功用上 ...

  3. php多线程thread开发与应用的例子

    Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/kra ...

  4. Python和C|C++的混编(一):Python调用C、C++---Boost库

    不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C.C++的调用 1 首先确定已经安装python和boost库,本例测试环境是python2 ...

  5. springmvc工作流程

    Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...

  6. 更换手机号或者更换手机后QQ设备锁的设置问题

    更换手机号 一步到位,更改密保手机号,OK了 更换手机 老卡插入 登录QQ,OK了 更换手机号和手机 老卡插入新手机 登录QQ 新卡插入新手机 更改密保手机号,OK了

  7. cgi ISAP sapi等

    1.CGI和FastCGI是apache处理php脚本的其中两种工作模式,还有ISAPI,SAPI等 2.而php-fpm并不是一种工作模式,而是一个PHP在FastCGI模式运行下的进程管理器,全称 ...

  8. A标签执行JS脚本

    A标签执行JS脚本 分类: Web2012-12-25 22:48 1368人阅读 评论(0) 收藏 举报 前言 A标签是html中常用的标签,它与button按钮是实现页面跳转的两种最常用的方式,经 ...

  9. 教你如何通过ICCID找回丢失的的iPhone

    22日晚买了FACETIME,在某宝上买的.价格不贵,可以查到偷手机的人注册FT的号码,还可以查询手机被刷机和被维修的日期(这个很关键) 27日手机被刷机,遂买了某宝查询ICCID的服务,找到一串IC ...

  10. vs2010 和 svn的结合运用,svn的安装

    转自:http://www.cnblogs.com/joeylee/archive/2012/10/08/2715142.html 1:svn的安装,如何在vs2010里面添加 svn的插件呢? 在这 ...