大家平时都在用这个服务框架。简单阅读了下代码,了解其原理可以方便解决一些常见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过程
相关推荐
Springboot+HSF分布式服务框架+EDAS注册中心,实现发布订阅模式
EDAS中HSF方式启动服务入门文档,详细描述了EDAS中HSF方式的启动过程
HSF服务框架共28页.pdf.zip
分布式服务框架原理与实践(Dubbo,HSF)_李林锋著
HSF 框架的原理讲解,主要包含了知识点:rpc,动态代理,HSF可以作为微服务的基础框架进行二次开发
hsf框架所需工具包 taobao-hsf.sar 直接放入tomcat根目录tomcate/deploy/下即可
淘宝的HSF框架,用户手册,有兴趣的人欢迎下载~内部文档哦~
内部分享的hsf使用介绍文档(无涉密信息),有兴趣的同学可以看看
高速服务框架 HSF (High-speed Service Framework),HSF 作为一个纯客户端架构的 RPC 框架!HSF应用开发从安装、代码编写到部署详细教程!
taobao-hsf安装包
HSF 官网Demo、IDEA 与 eclipse 开发环境说明;HSF,包结构等等
SF全称为High-Speed Service Framework,旨在为淘宝应用提供一个分布式的服务框架,HSF从分布式应用层面以及统一的发布/调用方式层面为大家提供支持,从而可以很容易的开发分布式的应用以及提供戒使用公用功能模块,...
自己公司用的HSF架构培训手册,当时还有阿里的人来培训我们,希望帮助到需要用的HSF技术的人
HSF物料风险等级评估及抽样检验规范.docx
HFS网络文件服务器V2.3Beta完美汉化版很好的一个文件传输软件,和FTP一样的稳定性,但用的确实HTTP协议,文件传输好,汉化版简单易用!... HFS网络文件服务器V2.3Beta完美汉化版很好的一个文件传输软件,和FTP一样的...
笔者工作的这几年之中,总结并开发了如下几个框架: summercool(Web 框架,已经应用于某国内大型网络公司的等重要应用)、summercool-hsf(基于Netty实现的RPC框架,已经应用国内某移动互联网公司)、 summercool-...
NULL 博文链接:https://arlenye.iteye.com/blog/2294835
阿里云HSF用户开发指导手册 阿里云HSF用户开发指导手册
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员...