http://mw.alibaba-inc.com/products/hsf/_book/?spm=a1zco.8288981.0.0.5ecbf7d9JO2F0s
HSF 作为阿里巴巴的基础中间件,联通不同的业务系统,解耦系统间的实现依赖。HSF 从分布式应用的层面,统一了服务的发布/调用方式,从而帮助用户可以方便、快速的开发分布式应用,以及提供或使用公共功能模块。为用户屏蔽了分布式领域中的各种复杂技术细节,如:远程通讯、序列化实现、性能损耗、同步/异步调用方式的实现等。
注册中心的角色由ConfigServer扮演,用于服务注册和发现。
配置中心由Diamond扮演,可以配置和推送服务治理规则。应用开发人员可以在HSF-OPS上编辑规则并保存,然后规则会被推送到Diamond,接着由Diamond推送到消费端。
Hsf Provider
如下:就是创建一个Hsf服务提供者Provider
使用注解的方式指定了【接口地址、版本、超时时间、注册的单元】,这里使用了configServerCenters达到了多单元注册的目的...
/*** @author :luoyu* @version :1.0* @date : 2021/9/15 9:12 下午* @description*/public interface BPMSRoutingService {/*** 激活模型回调* @params [modelName, modelId, operator]* @return com.alibaba.security.workstation.model.Result<java.lang.Boolean>* @author luoyu* @date 2021/9/15 8:45 下午**/Result<Boolean> activateModelRouting(String modelName, String modelId, String operator, String ifAgree, String instanceId,Long taskId);/*** 拒绝激活模型回调* @params [modelName, modelId, operator]* @return com.alibaba.security.workstation.model.Result<java.lang.Boolean>* @author luoyu* @date 2021/9/15 8:45 下午**/Result<Boolean> deActivateModelRouting(String modelName, String modelId, String operator, String agree,Long taskId);}
/*** @author :luoyu* @version :1.0* @date : 2021/9/15 9:14 下午* @description*/
@Slf4j
@HSFProvider(serviceInterface = BPMSRoutingService.class, serviceVersion = "1.0.0", clientTimeout = 30000, configServerCenters = {"pre", "sh", "rg-sg", "lazada-sg", "lazada-sg-pre"})
public class BPMSRoutingServiceImpl implements BPMSRoutingService {@Autowiredprivate ProcessInstanceService processInstanceService;@Overridepublic Result<Boolean> activateModelRouting(String modelName, String modelId, String operator, String ifAgree, String instanceId,Long grsTaskId) {log.warn("modelName = {}, modelId={}, operator={}, agree={}, instanceId={},taskid={}", modelName, modelId, operator, ifAgree, instanceId,grsTaskId);return Results.success();}@Overridepublic Result<Boolean> deActivateModelRouting(String modelName, String modelId, String operator, String agree,Long grsTaskId) {return null;}}
HSF原理初探
1. RPC
现在从图中可以看着,client和server之间有一条长连接,并且我们有自己的协议体:RpcRequest和RpcResponse。
2. 架构
2.1 一般来说,我们的应用即是client,也是server?那问题来了:服务提供者如何告知客户端自己提供服务?ConfigServer注册中心来了
2.2 如何动态配置负载的大小(线程池)?如何配置路有规则(同机房调用)?如何获取注册中心地址信息?配置中心来了(持久化配置中心)
client和server启动的时候会先去diamond获取需要的配置信息,如最关键的服务注册中心的类型和地址,除此之外之外还有服务治理的类型和地址等。
2.3 服务治理
hsfops上面为什么可以看到有哪些服务,以及对应的调用规则配置?redis和hsfops来了
redis功能:HSF使用Redis存储元数据,每一个HSF Consumer/Provider 都会在启动后、每隔一段时间向redis上报元数据,这些元数据采集起来又提供给HSFOPS做服务治理,包括应用名和服务的映射、服务的元数据等。
3. 服务的注册和分布
<bean id="BPMSRecall" class="com.***.BPMSRecallImpl"/><bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init"><!--serviceInterface必须配置[String],为服务对外提供的接口--><property name="serviceInterface" value="com.***.provider.BPMSRecall"/><!-- 注册中心 --><property name="configserverCenter"><list><value>pre</value><value>sg-pre</value><value>sh</value></list></property><!--target必须配置[ref],为需要发布为HSF服务的spring bean id--><property name="target" ref="BPMSRecall"/><!--serviceVersion为可选配置[String],含义为服务的版本,默认为1.0.0--><property name="serviceVersion" value="1.0.0"/><!--serviceName为推荐配置[String],含义为服务的名称,便于管理,默认为null--><property name="serviceName" value="BPMSRecall"/><!--serviceDesc为可选配置[String],含义为服务的描述信息,便于管理,默认为null--><property name="serviceDesc" value="*** 调用BPMS回调接口"/><!--serviceGroup为可选配置[String],含义为服务所属的组别,以便按组别来管理服务的配置,默认为HSF--><property name="serviceGroup" value="HSF"/><!--clientTimeout为可选配置[int],含义为客户端调用此服务时的超时时间,单位为ms,默认为3000ms--><!--该配置对接口中的所有方法生效,但是如果客户端通过MethodSpecial属性对某方法配置了超时时间,则该方法的超时时间以客户端配置为准,其他方法不受影响,还是以服务端配置为准--><property name="clientTimeout" value="3000"/><!--clientIdleTimeout为可选配置[int],含义为客户端连接空闲的超时时间,单位为s,默认为60--><property name="clientIdleTimeout" value="60"/><!--serializeType为可选配置[String(hessian|java)],含义为序列化类型,默认为hessian--><property name="serializeType" value="java"/><!--methodToInjectConsumerIp为可选配置,含义为注入调用端IP的方法,这样业务服务也可以得知是哪个IP在调用,该方法的参数必须为String,所存的变量为threadlocal--><property name="methodToInjectConsumerIp" value="setConsumerIP"/><!--methodSpecials为可选配置,用于为方法单独配置超时(单位ms),这样接口中的方法可以采用不同的超时时间,该配置优先级高于上面的clientTimeout的超时配置,低于客户端的methodSpecials配置--><property name="methodSpecials"><list><bean class="com.taobao.hsf.model.metadata.MethodSpecial"><property name="methodName" value="activateModelRouting" /><property name="clientTimeout" value="3000" /></bean><bean class="com.taobao.hsf.model.metadata.MethodSpecial"><property name="methodName" value="actMgrApprovalCallBack" /><property name="clientTimeout" value="3000" /></bean></list></property></bean>
那么问题来了,为什么配置来这里,这个服务就可以被调用了呢?
从配置文件看,有个关键的bean(HSFSpringProviderBean),有一个关键的方法init,这里的init就是服务发布的过程
/*** 对外发布服务*/public void init() throws Exception {// 避免被初始化多次if (!inited.compareAndSet(false, true)) {return;}providerBean.initWithoutPub();doPublish();}private void doPublish() {//非延迟发布,或者是非spring容器初始化的情况,直接发布服务if (!providerBean.getMetadata().isDelayedPublish() || !isInSpringContainer) {providerBean.publish();if(isInSpringContainer) {setAppInitedStatus();} else {String errorCodeStr = LoggerHelper.getErrorCodeStr("HSF", "HSF-0051", "BIZ","HSFSpringProviderBean is not created in spring container");LOGGER.warn(errorCodeStr);}}}
HSF服务端应用的启动:
1. HSF源生的入口--HSFApiProviderBean
2. spring方式的入口--HSFSpringProviderBean
3. spring注解方式--HSFProvider
1. 如何查询Parada下hsf相关信息
请注意:parada会对外12201端口