服务框架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过程
服务框架HSF分析之一容器启动的更多相关文章
- 阿里巴巴分布式服务框架HSF
HSF称之为高速服务框架HSF(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架. HSF连通不同的业务系统,解耦系统间的实现依赖.HSF从分布式 ...
- 分布式服务框架HSF
最近在读阿里巴巴中台战略思想与架构这本书,so和大家分享一些我get到的东东. HSF是阿里巴巴内部的分布式服务框架,这个大家都很熟悉了,先上一张HSF的工作原理图: 这个图说明了HSF框架中每个组件 ...
- 分布式服务框架HSF学习
HSF提供的是分布式服务开发框架,taobao内部使用较多,总体来说其提供的功能及一些实现基础:1.标准Service方式的RPC 1).Service定义:基于OSGI的Service定义方式 ...
- 分布式服务框架选型:面对Dubbo,阿里巴巴为什么选择了HSF?
转载:http://www.sohu.com/a/141490021_268033 阿里巴巴集团内部使用的分布式服务框架 HSF(High Speed Framework,也有人戏称“好舒服”)已经被 ...
- 003-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-分布式服务框架的选择
3.1.淘宝平台“服务化”历程 大约2007年,淘宝500人团队,维护一个war包,200多个功能模块. 1)项目团队协同成本高,业务响应越来越慢 2)应用复杂度超出人的认知负载. 3)错误难于隔离[ ...
- php微服务框架 PHP-MSF 的容器部署和使用
评论:1 · 阅读:8412· 喜欢:1 一.需求 PHP-msf 是 Carema360 开发的 PHP 微服务框架,目前我没有实际用过,但是市面上的微服务框架要么在推崇 Spring 系,要么是 ...
- 唯品会RPC服务框架与容器化演进--转
原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25 ...
- Spring源码分析专题 —— IOC容器启动过程(上篇)
声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...
- abp vNext微服务框架分析
本文转载自:https://www.cnblogs.com/william-xu/p/11245738.html abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了 ...
随机推荐
- 由abcd四个字符取5个作允许重复的排列,要求a出现次数不超过2次,但不能不出现;b不超过1个;c不超过3个;d出现的次数为偶数。求满足以上条件的排列数。
一.我的解法 由于没复习,我在想一般的方法,那就是d取0.2.4,然后分步计算,得到225这个错误答案. 二.指数型母函数 设满足以上条件取个排列的排列数为,的指数型母函数为 ...
- APT攻防对抗
APT(高级持续性威胁)攻击是指近年来,专业甚至是有组织和国家背景支持的黑客,针对重要目标和系统发起的一种攻击手段,主要特征有 1)持续性:攻击者为了重要的目标长时间持续攻击直到攻破为止.攻击成功用上 ...
- php多线程thread开发与应用的例子
Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/kra ...
- Python和C|C++的混编(一):Python调用C、C++---Boost库
不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C.C++的调用 1 首先确定已经安装python和boost库,本例测试环境是python2 ...
- springmvc工作流程
Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...
- 更换手机号或者更换手机后QQ设备锁的设置问题
更换手机号 一步到位,更改密保手机号,OK了 更换手机 老卡插入 登录QQ,OK了 更换手机号和手机 老卡插入新手机 登录QQ 新卡插入新手机 更改密保手机号,OK了
- cgi ISAP sapi等
1.CGI和FastCGI是apache处理php脚本的其中两种工作模式,还有ISAPI,SAPI等 2.而php-fpm并不是一种工作模式,而是一个PHP在FastCGI模式运行下的进程管理器,全称 ...
- A标签执行JS脚本
A标签执行JS脚本 分类: Web2012-12-25 22:48 1368人阅读 评论(0) 收藏 举报 前言 A标签是html中常用的标签,它与button按钮是实现页面跳转的两种最常用的方式,经 ...
- 教你如何通过ICCID找回丢失的的iPhone
22日晚买了FACETIME,在某宝上买的.价格不贵,可以查到偷手机的人注册FT的号码,还可以查询手机被刷机和被维修的日期(这个很关键) 27日手机被刷机,遂买了某宝查询ICCID的服务,找到一串IC ...
- vs2010 和 svn的结合运用,svn的安装
转自:http://www.cnblogs.com/joeylee/archive/2012/10/08/2715142.html 1:svn的安装,如何在vs2010里面添加 svn的插件呢? 在这 ...