服务框架 HSF
Posted 思想累积
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务框架 HSF相关的知识,希望对你有一定的参考价值。
1、HSF 概述
1.1 HSF 简介
HSF(High-speed Service Framework)高速服务框架,是在阿里巴巴内部广泛使用的分布式 RPC 框架,HSF 作为阿里巴巴的基础中间件,联通不同业务系统,解耦系统间的实现依赖,屏蔽了各种分布式的复杂技术细节,从而帮助用户方便、快速的开发分布式应用。
1.2 HSF 特性
服务调用
- 低侵入式:基于 Java 接口完成 RPC 调用,用户对服务是否在本地无感知
- 高性能:HSF 提供基于非阻塞 I/O 的高性能调用
- 多语言:提供 C++、nodejs 客户端,支持 HTTP REST 调用
高并发
- 客户端负载均衡:在客户端基于服务地址列表做负载均衡
- 多种选址策略:HSF 提供了基于可用地址的选址策略,地址链接不可用会移出地址列表并尝试恢复链接
- 上下线策略:服务在重启时对客户端的影响面减到最小,客户端在调用服务端重启时表现平滑
服务治理
- 服务管理功能:控制台提供了服务查询、测试和 Mock 功能,支持通过服务名查询服务提供者,或者通过输入参数对已有服务进行调用测试
- 规则管理功能:支持使用归组、路由及同机房等规则对客户端发起的调用进行干预,使客户端调用变得更加智能
1.3 HSF 架构
HSF 作为一个纯客户端架构的 RPC 框架,本身没有服务端集群,所有的 HSF 服务调用都是服务消费方(Consumer)和提供方(Provider)点对点进行的
HSF 功能结构上分为 6 个部分
- HSF Provider 服务提供方:绑定一个端口,接受请求并提供服务给消费者,地址信息发布到注册中心
- HSF Consumer 服务消费方:通过注册中心订阅服务,根据订阅到的服务地址进行服务调用
- 地址注册中心:接受服务提供者发布的地址,消费者进行订阅时将地址推送给消费者,提供服务注册发现的功能。如果没有注册中心,HSF 只能完成点对点的调用。使用 ConfigServer 作为注册中心
- 持久化配置中心:存储 HSF 服务的各种治理规则,路由规则、归组规则、权重规则等,从而根据规则对调用过程的选址逻辑进行干预,使用 Diamond 作为持久化配置中心
- 元数据存储中心:HSF 服务对应的方法列表和参数结构等信息,不是必须的。使用 Redis 作为存储中心
- HSF 运维平台(控制台):提供运维服务功能,提高 HSF 服务研发的效率,运维的便捷性。使用 HSFOPS 作为 HSF 控制台
1.4 HSF 提供服务流程
- server 启动时向 configserver 注册
- client 启动时向 configserver 请求 list
- client 缓存 list,发现不可用的 server,从缓存中 remove
- configserver 维护可用 server 的 list
- list 更新时,configserver 通过带 version 的报文通知 client 更新
2、HSF 使用
2.1 服务端编写
首先定义接口,打成 jar 包,发布到 maven 仓库
public interface OrderService {
// 通过 id 查询订单
OrderDto queryById(Long id);
}
服务端通过 maven 找到目标依赖服务的接口(导入 maven 依赖),服务提供方实现接口
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderRepository orderRepository;
@Override
public OrderDto queryById(Long id) {
return orderRepository.queryOrder(id);
}
}
配置并发布 HSF 服务
添加 HSF 依赖
<dependency>
<groupId>com.taobao.hsf</groupId>
<artifactId>hsf-all</artifactId>
</dependency>
基本配置属性
配置项 | 方法 | 含义 | 是否必须 | 默认值 |
---|---|---|---|---|
服务的接口 | setServiceInterface | 设置服务接口,客户端通过这个进行订阅 | 是 | 无 |
实现对象 | setTarget | 设置服务实现 | 是 | 无 |
服务的版本 | setServiceVersion | 设置服务版本,客户端通过此属性进行订阅 | 是 | 1.0.0 |
服务的归组 | setServiceGroup | 设置服务归组,客户端通过此属性订阅 | 是 | HSF |
响应时间 | setClientTimeout | 响应时间,单位为毫秒 | 否 | 3000 |
序列化类型 | setPreferSerializeType | 设置参数与响应的序列化方式 | 否 | hessian2 |
SpringBoot 项目基于注解配置 HSF 服务
import com.alibaba.boot.hsf.annotation.HSFProvider;
// 服务名和组别唯一决定了服务的发布、订阅关系
@HSFProvider(serviceInterface = OrderService.class, serviceGroup = "HSF", serviceVersion = "1.0.0", clientTimeout = 3000)
public interface OrderService {
// 通过 id 查询订单
OrderDto queryById(Long id);
}
2.2 消费 HSF 服务
服务调用与发布相对,需要对服务尽心配置,配置前需要先依赖服务提供方发布在 maven 仓库中的客户端 jar 包
通过 Spring boot 使用注解配置
// HSF Consumer 需要在多个地方使用,可以写一个统一的 Config 类,在需要的地方注入即可
@Configuration
public class HsfConfig {
@HSFConsumer(serviceVersion = "1.0.0", serviceGroup = "HSF")
OrderService orderService;
}
// 使用时直接注入
@Autowired
OrderService orderService;
Future 异步调用
@Configuration
public class HsfConfig {
@HSFConsumer(serviceVersion = "1.0.0", serviceGroup = "HSF", futureMethods = "queryById")
OrderService orderService;
}
// 使用时直接注入
@Autowired
OrderService orderService;
// HSF 提供了方法级别的异步调用,格式为 name:${methodName};type:future,只用方法名字来标识方法,不区分重载的方法。同名方法会被设置为同样的调用方式
Callback 异步调用
// 实现 HSFResponseCallback 接口的 listener,结果返回后,HSF 会调用 HSFResponseCallback 中的方法
@AsyncOn(interfaceName = OrderService.class, method = "queryById")
public class CallbackHandler implements HSFResponseCallback {
// 业务异常触发
@Override
public void onAppException(Throwable t) {
t.printStackTrace();
}
// 业务返回结果
@Override
public void onAppResponse(Object result) {
// 调用 callback 调用设置的上下文
Object context = CallbackInvocationContext.getContext();
System.out.println(result.toString() + context);
}
// HSF 异常
@Override
public void onHSFException(HSFException e) {
e.printStackTrace();
}
}
future 和 callback 两种调用方式的区别
- callback 调用没有 future.get(timeout) 的阻塞问题
- 在调用线程中可以设置上下文,然后在 listener 中获取使用
- callback 会立即知晓结果的返回
以上是关于服务框架 HSF的主要内容,如果未能解决你的问题,请参考以下文章