HSF学习

HSF学习

1.HSF工作大概流程:
HSF(High-Speed Service Framework)是一个分布式的远程服务调用框架,本身不是一个单独的服务,而是一个附属在应用中的组件,一个RPC组件。(当然不止这个哈)
RPC:Remote Procedure Call,远程服务调用,是一种通过网络从远程计算机程序上请求服务,但是不需要了解底层网络技术的协议,RPC跨越了OSI网络模型中的传输层和应用层,使得开发分布式应用更加容易。
通信过程简图:

12367ae91fd7327f.png

这个跟http过程区别就是client与server之间有一个长连接,并且有自己的协议体:RPCRequest和RPCResponse。
上面的过程只是理论上这样实现通信,但是有一个问题啊,客户端怎么知道服务端能够提供哪些服务呢?也就是服务端要怎么告诉客户端他能够提供的服务呢?这时候就需要一个服务注册与发现的地方,在HSF框架中,configserver就是干这个的。

a9d75b42aa470a62.png

如上图,客户端、服务端与注册中心(configserver)之间保持一段长连接与心跳,当sever端启动时会向configserver注册自己提供的服务,client会向configserver订阅自己需要的服务,configserver通过订阅信息将相关服务提供者的地址以及其他关键信息推送给client。这样就实现了基本功能,但是还有一些高级功能,如如何动态配置负载(线程池的大小),默认配置(configserver地址等),路由规则啊等等,这就需要一个持久化的配置中心

f8e5d3c0860f46dc.png

server会上传相应的归组配置和路由配置到配置中心(diamond),当client需要调用远端服务,会根据服务接口名+版本号作为ID去diamond调用相应的路由规则,根据路由规则得到提供服务的server的IP地址,通过RPCRequest将服务接口、服务版本号、调用方法名、调用参数传给远端服务提供者;server根据传过来的接口名,将方法的执行提交给相应的线程池(每个服务都有与之对应的线程池),执行完毕之后,将参数封装返回给client。

6752cba5776c1851.png

redis功能:HSF使用redis存储元数据,每一个HSF comsumer/provider都会在启动后、每隔一段时间向redis上报元数据,这些元数据收集起来提供给HSFOPS做服务治理,可以看到有哪些服务,服务提供者是谁,有多少提供者,具体消费者是谁...

2.服务的注册发布

374faaed55a3e2ce.png

1).服务初始化,首先要有一个提供服务的service实现类(spring bean)和接口,并注册到spring.xml中;
2).初始化HSFSpringProviderBean,将xml中配置的服务接口名、服务版本号、服务实现类、服务名赋值给HSFProviderBean的对象属性;
3).HSFSpringProviderBean中有一个HSFApiProvider类型的providerBean对象,2)中的一系列服务属性最后都传给了这个providerBean对象;
4)providerBean中有一个ServerMetaData对象metadata,这个对象作为信息载体,在各个对象之间进行传递,以及最后的注册、发布都是传递该对象;
5)根据Spring原理,当设值注入后就会调用HSFSpringProviderBean的init-method方法init(),在init()内部会调用PublishIfNotSpringContainer()方法,然后调用providerBean.publish(),其实providerBean.publish()调用的是processService.publish(metadata),其实metadata就是需要发布的服务内容;
6)processService.publish(metadata)内部调用processComponent;
7)processComponent主要做了以下工作:
① 给每个服务创建一个线程池,当请求到来之时,调用相应线程池进行处理,并返回结果;
② 根据服务发布时单元化发布还是中心发布,设置服务的路由规则;
③ 通过MetadataService类将服务发布到configServer;
④ 通过MetadataInfoStoreService类将服务提交给redis服务治理。

3.服务的订阅阿布的服务内容和被推送
1).服务初始化,首先是引入服务接口相关的pom,然后写配置文件;
2)将需要被调用的服务注册成spring.bean,也就是上面配置文件的内容;
3)接下来采用动态代理的方法,HSFSpringConsumerBean实现了FactoryBean,因此该类配置在spring.xml,注入容器的对象是通过getObject()(FactoryBean的接口方法)方法返回的对象,HSFSpringConsumerBean对象的getObject()内部调用了HSFApiConsumerBean对象consumerBean.getObject()=>metaData.getTarget();
4)其实metaData对象在HSFSpringConsumerBean类的init方法中就已经创建了,配置了。init内部调用processService对象的consumer(),consumer()会先从缓冲区查看是否已经有拉取过得target,如果有就直接使用,如果没有就生成代理对象,并通过代理对象订阅相关服务,最后将订阅信息上传到redis服务治理。

ac6622c78b7b0f47.png

4.服务的调用
上面两个部分就已经把框架定好了,服务信息已经注册发布,客户端也获取了服务的调用地址,接下来就是调用服务就行了,调用就是真正的RPC请求了,HSF的RPC是通过netty来实现的。
1).在方法执行时就进入了代理类执行,执行HSFServiceProxy的invoke方法,invoke会调用trueInvoke方法;
2)trueInvoke里调用RPCProtocolService,在这里封装HSFRequest,执行具体的invoke方法;
3)具体的invoke方法调用RPCProtocolService,在这里主要根据invokeType来确定具体的InvokeService实现,最基本的同步调用啊,异步调用啊,具体实现就在这里;
4)最后在具体的实现类获取NettyClient,跟server进行通信,返回HSFResponse。

 

转载于:https://my.oschina.net/huyuBlog/blog/1590383

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值