服务框架 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 个部分

  1. HSF Provider 服务提供方:绑定一个端口,接受请求并提供服务给消费者,地址信息发布到注册中心
  2. HSF Consumer 服务消费方:通过注册中心订阅服务,根据订阅到的服务地址进行服务调用
  3. 地址注册中心:接受服务提供者发布的地址,消费者进行订阅时将地址推送给消费者,提供服务注册发现的功能。如果没有注册中心,HSF 只能完成点对点的调用。使用 ConfigServer 作为注册中心
  4. 持久化配置中心:存储 HSF 服务的各种治理规则,路由规则、归组规则、权重规则等,从而根据规则对调用过程的选址逻辑进行干预,使用 Diamond 作为持久化配置中心
  5. 元数据存储中心:HSF 服务对应的方法列表和参数结构等信息,不是必须的。使用 Redis 作为存储中心
  6. 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 使用

HSF API 手册:http://mw.alibaba-inc.com/products/hsf/_book/mw-docs/hsf-manuel-book/chapter25.html?spm=a1zco.hsf.0.0.11d3122em3ierW

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的主要内容,如果未能解决你的问题,请参考以下文章

HSF 概述

HSF和Dubbo有什么区别

淘宝HSF 框架使用 总结

分布式服务框架选型:面对Dubbo,阿里巴巴为什么选择了HSF?

HSF原理细述

Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务