HSF (RPC远程调用框架)

article/2025/10/21 6:44:38

HSF

  • 1. HSF概述
    • 1.1 概述
    • 1.2 HSF架构
    • 1.3 功能
    • 1.4 应用开发方式
  • 2. 使用 Ali-Tomcat 开发
    • 2.1 Ali-Tomcat概述
    • 2.2 安装及开发环境配置
      • 2.2.1 安装Ali-Tomcat和Pandora
      • 2.2.2 配置IntelliJ IDEA开发环境
    • 2.3 开发HSF应用
      • 2.3.1 定义服务接口
      • 2.3.2 开发服务提供者
      • 2.3.3 开发服务消费者
      • 2.3.4 本地运行服务
      • 2.3.5 部署到SAE
  • 3. 使用Pandora Boot
  • 4. ali HSF 官网地址

1. HSF概述

高速服务框架HSF(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架。
官方文档: https://help.aliyun.com/document_detail/149503.html

1.1 概述

HSF连通不同的业务系统,解耦系统间的实现依赖。HSF从分布式应用的层面,统一了服务的发布与调用方式,从而帮助用户更加方便、快速地开发分布式应用,以及提供或使用公共功能模块。HSF为用户屏蔽了分布式领域中的各种复杂技术细节,如远程通讯、序列化实现、性能损耗、同步与异步调用方式的实现等。

1.2 HSF架构

HSF作为一个纯客户端架构的RPC框架,没有服务端集群,所有HSF服务调用均是通过服务消费方(Consumer)与服务提供方(Provider)点对点进行。为了实现整套分布式服务体系,HSF还需要依赖以下外部系统。
在这里插入图片描述

  • 服务提供方
    服务提供方绑定了12200端口,用于接受请求并提供服务,同时将地址信息发布到地址注册中心。
  • 服务消费方
    服务消费者通过地址注册中心订阅服务,根据订阅到的地址信息发起调用,地址注册中心不参与调用。
  • SAE地址注册中心
    HSF依赖注册中心进行服务发现,如果没有注册中心,HSF只能完成简单的点对点调用。
    服务提供端无法将服务信息对外暴露,服务消费端可能已经明确了待调用的服务,但是无法获取该服务。因此注册中心是服务信息的中介,为服务提供了注册与发现的功能。
  • SAE持久化配置中心
    持久化的配置中心用于存储HSF服务的各种治理规则,HSF客户端在启动的过程中向持久化配置中心订阅服务治理规则,如路由规则、归组规则、权重规则等,从而根据规则对调用过程的选址逻辑进行干预。
  • SAE元数据存储中心
    元数据指HSF服务对应的方法列表以及参数结构等信息。元数据对HSF的调用过程不会产生影响,因此元数据存储中心是可选的。由于服务运维的便捷性,HSF客户端在启动时会将元数据上报到元数据存储中心,方便服务运维。
  • SAE控制台
    SAE控制台打通了服务地址注册中心、持久化配置中心、元数据存储中心等,为用户提供了服务运维功能,包括服务查询、服务治理规则管理等,提高HSF服务研发的效率、运维的便捷性。

1.3 功能

HSF作为分布式RPC服务框架,支持多种服务的调用方式。

  • 同步调用
    HSF客户端默认以同步调用的方式消费服务,客户端代码需要同步等待返回结果。

  • 异步调用
    对于服务调用的客户端,并非所有HSF服务都需要同步等待返回结果。HSF提供异步调用,帮助客户端无需同步阻塞在HSF调用上。HSF的异步调用,有Future调用和Callback调用2种。
    Future调用
    客户端在需要获取调用的返回结果时,通过HSFResponseFuture.getResponse(int timeout)主动获取结果。
    Callback调用
    Callback调用利用HSF内部提供的回调机制,在指定HSF服务消费完毕拿到返回结果时,HSF框架会回调用户实现的HSFResponseCallback接口,客户端通过回调通知的方式获取结果。

  • 泛化调用
    对于一般的HSF调用来说,HSF客户端需要依赖服务的二方包,通过依赖二方包中的API进行编程调用,获取返回结果。但是泛化调用不需要依赖服务的二方包,可以发起HSF调用、获取返回结果。在平台型的产品中,泛化调用的方式可以有效减少平台型产品的二方包依赖,实现系统的轻量级运行。

  • 调用链路Filter扩展
    HSF内部设计了调用过滤器,能够主动发现用户的调用过滤器扩展点,将其集成到HSF调用链路中,便于扩展方对HSF的请求进行扩展处理。

1.4 应用开发方式

使用HSF框架开发应用有Ali-Tomcat和Pandora Boot两种方式。

  • Ali-Tomcat:依赖Ali-Tomcat和Pandora,提供了完整的HSF功能,包括服务注册与发现、隐式传参、异步调用、泛化调用和调用链路Filter扩展。应用程序须以WAR包方式部署。
  • Pandora Boot:依赖Pandora,提供了比较完整的HSF功能,包括服务注册与发现、异步调用。应用程序编译为可运行的JAR包并部署即可。

2. 使用 Ali-Tomcat 开发

2.1 Ali-Tomcat概述

开发HSF应用需要依赖Ali-Tomcat和Pandora。

Ali-Tomcat是SAE中的服务运行时可依赖的一个容器,它主要集成了服务的发布、订阅、调用链追踪等一系列的核心功能。无论是开发环境还是运行时,您均可将应用程序发布在该容器中。

Pandora是一个轻量级的隔离容器,也就是taobao-hsf.sar。它用来隔离应用和中间件的依赖,也用来隔离中间件之间的依赖。SAE的Pandora中集成了服务发现、配置推送和调用链跟踪等各种中间件功能产品插件。您可以利用该插件对SAE应用进行服务监控、治理、跟踪、分析等全方位运维管理。

  • 注意 在SAE中,只有WAR包格式的HSF应用才需要使用Ali-Tomcat。

2.2 安装及开发环境配置

2.2.1 安装Ali-Tomcat和Pandora

Ali-Tomcat和Pandora为SAE中的服务运行时所依赖的容器,集成了服务的发布、订阅、调用链追踪等一系列核心功能,应用程序须发布在该容器中运行。

  • 下载Ali-Tomcat-8或Ali-Tomcat-7,保存并解压至相应的目录(如:d:\work\tomcat\)。
  • 下载Pandora容器,保存并解压至Ali-Tomcat的deploy目录(d:\work\tomcat\deploy)下。
  • 查看Pandora容器的目录结构。
    Linux系统中,在相应路径下执行tree -L 2 deploy/ 命令查看目录结构。
    在这里插入图片描述
    Windows中,直接进入相应路径进行查看。
    在这里插入图片描述

2.2.2 配置IntelliJ IDEA开发环境

  1. 在菜单栏中选择Run > Edit Configurations。

  2. 在Run/Debug Configurations页面左侧的导航栏中选择Defaults > Tomcat Server > Local。

  3. 配置AliTomcat。
    在右侧页面单击Server页签,并在Application Server区域单击Configure。
    在Application Server页面右上角单击+,并在Tomcat Server对话框中设置Tomcat Home和Tomcat base directory 路径,且单击OK。
    将Tomcat Home的路径设置为本地解压后的Ali-Tomcat路径,Tomcat base directory可以自动使用该路径,无需再设置。

  4. 在Application Server区域的下拉菜单中,选择刚刚配置好的Ali-Tomcat。

  5. 在VM Options区域的文本框中,设置JVM启动参数指向Pandora的路径及设置本地轻量级配置及注册中心的vipserver端口。
    例如:-Dpandora.location=d:\work\tomcat\deploy\taobao-hsf.sar -Dvipserver.server.port=8080
    将d:\work\tomcat\deploy\taobao-hsf.sar替换为在本地安装Pandora的实际路径。 -Dvipserver.server.port=8080 该参数用于指定应用连接本地轻量级配置及注册中心的vipserver端口,在本地开发环境使用新版本的轻量级配置及注册中心时,能有效提升本地应用启动速度。
    当应用部署到EDAS时,不需要添加上面这个JVM属性参数。

  6. 单击Apply或OK 完成配置。

2.3 开发HSF应用

2.3.1 定义服务接口

HSF服务基于接口实现,当接口定义好之后,生产者将使用该接口实现具体的服务,消费者也基于此接口去订阅服务。

在Demo的itemcenter-api工程中,定义了一个服务接口com.alibaba.edas.carshop.itemcenter.ItemService。

public interface ItemService {public Item getItemById(long id);public Item getItemByName(String name);
}

该服务接口将提供两个方法:getItemById与getItemByName

2.3.2 开发服务提供者

服务提供者将实现服务接口以提供具体服务。同时,如果使用了Spring框架,还需要在xml文件中配置服务属性。

  1. 实现服务接口。
    请参考ItemServiceImpl.java文件中的示例代码构建服务接口。
public class ItemServiceImpl implements ItemService {@Overridepublic Item getItemById( long id ) {Item car = new Item();car.setItemId( 1l );car.setItemName( "Mercedes Benz" );return car;}@Overridepublic Item getItemByName( String name ) {Item car = new Item();car.setItemId( 1l );car.setItemName( "Mercedes Benz" );return car;}
}
  1. POM 坐标配置
<dependencies><!-- 添加servlet的依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- 添加服务接口的依赖 -->      <dependency><groupId>com.alibaba.edas.carshop</groupId><artifactId>itemcenter-api</artifactId><version>1.0.0-SNAPSHOT</version></dependency><!-- 添加Spring的依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>2.5.6(及其以上版本)</version></dependency><!-- 添加edas-sdk的依赖 --><dependency><groupId>com.alibaba.edas</groupId><artifactId>edas-sdk</artifactId><version>1.8.1</version></dependency></dependencies>
  1. hsf-provider-beans.xml 配置
 <?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:hsf="http://www.taobao.com/hsf"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.taobao.com/hsfhttp://www.taobao.com/hsf/hsf.xsd" default-autowire="byName"><!-- 定义该服务的具体实现 --><bean id="itemService" class="com.alibaba.edas.carshop.itemcenter.ItemServiceImpl" /><!-- 用hsf:provider标签表明提供一个服务生产者 --><hsf:provider id=“itemServiceProvider"<!--interface属性说明该服务为此类的一个实现 -->interface=com.alibaba.edas.carshop.itemcenter.ItemService"<!-- 此服务具体实现的Spring对象 -->ref=“itemService"<!-- 发布该服务的版本号,可任意指定,默认为1.0.0 -->version=1.0.0"</hsf:provider></beans>

上面的示例为基本配置,您也可以根据您的实际需求,参考下面的生产者服务属性列表,增加其它配置。
在这里插入图片描述
服务提供者属性配置示例

<bean id="impl" class="com.taobao.edas.service.impl.SimpleServiceImpl" />
<hsf:providerid="simpleService"interface="com.taobao.edas.service.SimpleService"ref="impl"version="1.0.1"clientTimeout="3000"enableTXC="true"serializeType="hessian"><hsf:methodSpecials><hsf:methodSpecial name="sum" timeout="2000" /></hsf:methodSpecials>
</hsf:provider>

2.3.3 开发服务消费者

消费者订阅服务从代码编写的角度分为两个部分。

  • Spring的配置文件使用标签hsf:consumer/定义好一个Bean。
  • 在使用的时候从Spring的context中将Bean取出来。

与生产者相同,消费者的服务属性配置分为Maven依赖配置与Spring的配置。

  1. pom 坐标配置
  <dependencies><!-- 添加 servlet 的依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- 添加 Spring 的依赖 --><dependency><groupId>com.alibaba.edas.carshop</groupId><artifactId>itemcenter-api</artifactId><version>1.0.0-SNAPSHOT</version></dependency><!-- 添加服务接口的依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>2.5.6(及其以上版本)</version></dependency><!-- 添加 edas-sdk 的依赖 --><dependency><groupId>com.alibaba.edas</groupId><artifactId>edas-sdk</artifactId><version>1.8.1</version></dependency></dependencies>
  1. hsf-consumer-beans.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:hsf="http://www.taobao.com/hsf"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.taobao.com/hsfhttp://www.taobao.com/hsf/hsf.xsd" default-autowire="byName"><!-- 消费一个服务示例 --><hsf:consumer<!-- Bean ID,在代码中可根据此ID进行注入从而获取consumer对象  -->id="item"<!-- 服务名,与服务提供者的相应配置对应,HSF将根据interface + version查询并订阅所需服务  -->interface="com.alibaba.edas.carshop.itemcenter.ItemService"<!-- 版本号,与服务提供者的相应配置对应,HSF将根据interface + version查询并订阅所需服务  -->version="1.0.0"></hsf:consumer>
</beans>
  1. 测试
public class StartListener implements ServletContextListener{@Overridepublic void contextInitialized( ServletContextEvent sce ) {ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( sce.getServletContext() );// 根据Spring配置中的Bean ID“item” 获取订阅到的服务final ItemService itemService = ( ItemService ) ctx.getBean( "item" );……// 调用服务ItemService的getItemById方法System.out.println( itemService.getItemById( 1111 ) );// 调用服务ItemService的getItemByName方法System.out.println( itemService.getItemByName( "myname is le" ) );……}
}
  1. 参考下面的服务属性列表,增加其它配置
    在这里插入图片描述

  2. 消费者服务属性配置示例

<hsf:consumerid="service"interface="com.taobao.edas.service.SimpleService"version="1.1.0"clientTimeout="3000"target="10.1.6.57:12200?_TIMEOUT=1000"maxWaitTimeForCsAddress="5000"><hsf:methodSpecials><hsf:methodSpecial name="sum" timeout="2000" ></hsf:methodSpecial></hsf:methodSpecials>
</hsf:consumer>

2.3.4 本地运行服务

完成代码、接口开发和服务配置后,在IDEA中,可直接以Ali-Tomcat运行该服务(具体请参见安装及开发环境配置)。
在开发环境配置时,有一些额外JVM启动参数来改变HSF的行为,具体如下:
在这里插入图片描述

2.3.5 部署到SAE

本地使用轻量级配置及注册中心的应用可以直接部署到SAE中,无需做任何修改,注册中心会被自动替换为SAE上的注册中心。

正常打包出可供EDAS-Container运行的WAR包,需要添加如下的Maven打包插件

  • 在pom.xml文件中添加以下打包插件的配置。
   <build><finalName>itemcenter</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version></plugin></plugins></build>
  • 执行mvn clean package将本地的程序打成WAR包。

3. 使用Pandora Boot

https://help.aliyun.com/document_detail/149503.html

4. ali HSF 官网地址

https://help.aliyun.com/document_detail/149503.html


http://chatgpt.dhexx.cn/article/ckuh2Qwj.shtml

相关文章

分布式服务框架HSF简介

高速服务框架 HSF (High-speed Service Framework)&#xff0c;是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 统一了分布式应用中服务的发布/调用方式&#xff0c;从而帮助您方便、快速的开发分布式应用 HSF 架构 HSF 作为一个纯客户端架构的 RPC 框架&#xff0c;本…

分布式服务框架HSF

HSF提供的是分布式服务开发框架&#xff0c;taobao内部使用较多&#xff0c;总体来说其提供的功能及一些实现基础&#xff1a; 1.标准Service方式的RPC 1&#xff09;、Service定义&#xff1a;基于OSGI的Service定义方式 2&#xff09;、TCP/IP通信&#xff1a; IO方式…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework)&#xff0c;高速服务框架&#xff0c;是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件&#xff0c;联通不同的业务系统&#xff0c;解耦系统间的…

关于 HSF框架 (一)简单介绍

HSF介绍 HSF全称 high speed frameworkd, 是Alibaba内部使用的RPC框架&#xff0c;最初与Dubbo进行内部竞争&#xff0c;由于多方面的原因最终选择了HSF。 主要原因如下&#xff1a; HSF代码量少一些&#xff0c;轻量一些&#xff0c;代码量大概2/3, Dubbo设计更加全面功能更多…

hsaf框架

一.技术分层 a&#xff09;.前端展现层&#xff0c;泛指一切在客户端直接与用户打交道的客户界面&#xff08;&#xff09;&#xff0c;MVC架构中的view层 b&#xff09;.控制层&#xff1a;分为过滤器拦截器层&#xff0c;Controller控制器层 c&#xff09;.业务逻辑层&…

高速服务框架HSF

一、简述 HSF(High-speed Service Framework)&#xff0c;是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。 HSF 连通不同的业务系统&#xff0c;解耦系统间的实现依赖。HSF 从分布式应用的层面&#xff0c;统一了服务的发布与调用方式&#xff0c;从而帮助用户更加方便、快…

阿里HSF(服务框架)

文章目录 HSF&#xff08;服务框架&#xff09;简介架构设计Provider——服务提供者Consumer——服务消费者ConfigServer——配置服务器Diamond——持久化配置中心addressServer——地址服务元数据存储 HSF&#xff08;服务框架&#xff09; 文章地址 简介 高速服务框架 HS…

MySQL的批量更新和批量新增优化

MySQL的批量更新和批量插入优化 如果需要批量插入和批量更新操作就需要进行sql 的优化&#xff0c;否则近30万条数据的插入或更新就会耗费几分钟甚至更多的时间&#xff0c; 此文仅批量插入和批量更新的几种优化。 批量插入篇&#xff08;使用多条insert语句、使用union all创…

mybatis 批量更新

1 更新单条记录 UPDATE course SET name course1 WHEREid id1; 2 更新多条记录的同一个字段为同一个值 UPDATE course SET name course1 WHERE id in (id1,id2,id3); 3 更新多条记录为多个字段为不同的值 3.1 比较普通的写法&#xff0c;是通过循环&#xff0c;依次执行…

Update批量更新(高性能、动态化)

文章目录 前言一、环境开发环境测试环境 二、灵光乍现MyBatis-Plus源码2.初见真正的批量更新语法 三、开工基础类搭建SysUser&#xff08;表sys_user实体类&#xff09;Stash&#xff08;拼接SQL服务&#xff0c;内部类&#xff09;TableCacheDTO&#xff08;数据表信息存储&am…

mybatis-plus批量更新updateBatchById

前言 在使用mybatis-plus过程中&#xff0c;有很多插件都特别优秀&#xff0c;不仅使我们代码更加优雅&#xff0c;也提升了效率。其中有个批量插入的插件insertBatchSomeColumn使用起来也挺方便的&#xff0c;但是批量更新一直没有官方插件&#xff0c;网络上面也没有找到靠谱…

mysql批量更新方法

目录 方法一 replace into 批量更新 方法二 insert into 批量更新 方法三 临时表 批量更新 方法四 case when 批量更新 本篇文章实验mysql版本为5.7.20 隔离级别为rr&#xff0c;加锁场景的问题在mysql8.0.18中为复现 方法一 replace into 批量更新 原理&#xff1a;replace i…

mybatis批量更新数据三种方法

具体的可以参考下面链接&#xff1a; ​​​​​​mybatis批量更新数据三种方法效率对比_PreciousLife的博客-CSDN博客_mybatis 批量更新 此处说明下&#xff0c;若是使用for循环遍历方式&#xff0c;来生成N条sql&#xff0c;那么就需要注意两个地方&#xff1a; 第一个地方…

MySql中4种批量更新的方法

https://yq.aliyun.com/ziliao/59813 MySql中4种批量更新的方法 最近在完成MySql项目集成的情况下&#xff0c;需要增加批量更新的功能&#xff0c;根据网上的资料整理了一下&#xff0c;很好用&#xff0c;都测试过&#xff0c;可以直接使用。 mysql 批量更新共有以下四种办法…

MySQL批量更新的四种方法

最近做一个需求&#xff0c;更新3w条数据&#xff0c;一个一个update去更新的&#xff0c;结果花了80分钟&#xff0c;这样性能上很差&#xff0c;也容易阻塞&#xff0c;所以就找了一些MySQL批量更新的方式&#xff0c;在此记录一下 方法一&#xff1b;replace into 这种更新…

Mybatis之批量更新数据(批量update)

前言 当我们使用mybatis的时候&#xff0c;可能经常会碰到一批数据的批量更新问题&#xff0c;因为如果一条数据一更新&#xff0c;那每一条数据就需要涉及到一次数据库的操作&#xff0c;包括网络IO以及磁盘IO&#xff0c;可想而知&#xff0c;这个效率是非常低下的。而平时我…

List和Set之间的转换:达到集合元素去重复

在项目中看到一段代码&#xff1a; return new ArrayList<>(new HashSet<LabelEnum>(list)); 当时我的表情是这样的&#xff1a; 这把list作为构造参数创建新的集合来返回是要做什么&#xff0c;这里的list也是ArrayList集合&#xff0c;这样绕了一圈返回…

【JAVA】List转Set并按照List的顺序排序,HashSet、LinkedHashSet、TreeSet元素保存顺序List转换对比

话不多说 直接代码测试效果: // 简化代码 直接 数组转list 就不用 写很多add了 哈哈哈 String[] array {"f","a","r","q","b","e","o","z","v","p","g"};//…

java中Stream的使用以及List转set和map方法

Stream流的作用&#xff1a; 非常精简方便的去遍历集合实现过滤&#xff0c;排序等。 图解&#xff1a; 例&#xff1a; ArrayList<User> users new ArrayList<>();User user1 new User("赵六",33);users.add(new User("张三",12));users…

JAVA创建对象全过程详解

java世界里面对象无处不在&#xff0c;拿在创建对象的时候都经过哪些步骤&#xff1f; 总结下来大概分为这几步。 对象创建的过程(new 对象的时候) 判断类有没有被加载如果没有(就开始加载类(就是类的加载过程))初始化 &#xff1a;就是给一些变量进行初始化。设置对象头(比较…