大家平时都在用这个服务框架。简单阅读了下代码,了解其原理可以方便解决一些常见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. java代码整理---正则表达式

    1. 邮箱验证 : package javaRegx2016311; import java.util.regex.Matcher; import java.util.regex.Pattern; p ...

  2. Yours 的博客开张啦!

    虽然申请博客已经1个月了,但是一直没有来写,没办法,题都刷不完,哪有心思写啊``` 现在集训终于完了,有了属于自己的时间了.所以该把以前做的题,学的算法好好的整理整理了.一来顺顺思路,二来也可以给后来 ...

  3. 用AjaxPro实现二级联动

    在实际asp.net项目中经常会遇到无刷新二级或者N级(N>=2)联动情况,其实N级联动和二级联动的原理都是一样的,实现这种办法有很多,一种是纯脚本实现(动态生成Array数组),一种 是采用微 ...

  4. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  5. 内存不足时Android 系统如何Kill进程

    [转]内存不足时Android 系统如何Kill进程 大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可 ...

  6. 【HDOJ】1408 盐水的故事

    简单题,感觉非常简单,像小学奥数的植树问题. #include <stdio.h> #include <math.h> #define MAXNUM 5001 int main ...

  7. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  8. USACO3.24Feed Ratios

    直接枚举到100水过 /* ID: shangca2 LANG: C++ TASK: ratios */ #include <iostream> #include<cstdio> ...

  9. WPF——数据绑定及属性改变事件

    一.首先需要封装一下文本框的属性,并且在实体类中添加一个实体类的属性改变函数 public class User : INotifyPropertyChanged //INotifyPropertyC ...

  10. bzoj1443

    首先要思考的问题肯定是,什么点可以是ans, 不难想到对图黑白染色,假如一个棋子不管怎么走,都只能走到和它同色的点上时,这就是一个ans 再考虑,每次棋子的移动都是黑白相间的 再考虑,黑白染色是可以构 ...