FastD 构建服务发现初探

今天来分享的是如何用 FastD 去构建自己的服务架构体系,其实 FastD 的定位是API,提供数据。那如果抛开其他的因素去思考什么是服务的话,我会觉得服务的本质也是给外部提供数据。所以其实可以将 FastD 理解为就是一个单点的服务,从他本身部署的那一刻开始,他就算是一个对外提供数据的服务了。 基于 FastD 与 swoole 的优势,在使用 FastD 去做一些服务的时候,会显得尤为简单,并且现在周边的组件和插件已经有提供使用。

架构概述:

  • Server提供服务,向Registry注册自身服务,并向注册中心定期发送心跳汇报状态;
  • Client使用服务,需要向注册中心订阅RPC服务,Client根据Registry返回的服务列表,与具体的Sever建立连接,并进行RPC调用。
  • 当Server发生变更时,Registry会同步变更,Client感知后会对本地的服务列表作相应调整。

注册中心

注册中心目前支持 Redis 存储,zookeeper 的支持在计划中。由于 Redis 相对简单,那么就先用 Redis 进行实现,原理都是一样的。

执行流程:

当注册服务启动的时候,会创建一个HTTP与TCP两个协议端口进行监听,默认分别是: 95279528 端口,HTTP主要是提供给外部查询与管理,TCP则更多是用于监听服务(Server)与客户端(Client)连接,用来同步节点信息。 Client 在首次连接的时候,注册中心会同步所有节点数据,有 Client 进行记录,保持连接,一旦发生中断,Client 会尝试重连。如果注册中心接受到新的服务的时候,会立即广播当前节点信息到所有 Client 中,让 Client 保持最新的节点信息

客户端

Client 的作用是保持最新的可用节点信息,更加高效稳定地完成请求和调用。

执行流程

原理参考数据采集,在服务器上面安装 agent,启动 agent 后,该 agent 会与注册中心产生通信。当注册中心一旦发生以上变更的时候,agent 就会即刻更新本地可用节点信息。

服务端

服务端就是一个对外提供数据调用,每个 FastD 都可以理解成为一个服务端。

执行流程

服务端要做的仅仅是将节点的信息提交给注册中心。

操作上以上的步骤后,打开注册中心 /services,可以看到已经注册的所有服务节点。

调用

当注册中心和agent 启动之后,就是使用 sentinel 对可用服务进行调用,使用方式非常简单,但是由于明前仅仅支持同步调用,尚未支持异步和并行调用,所以操作方式与 curl 类似,底层使用 swoole_client 作为客户端调用。

<?php

$client = new \FastD\Sentinel\Client('dobee');

$response = $client->call('root', []);

print_r($response);  

在实例化 Client 的时候,注入服务节点名称,Client 会选取一个可用节点作为调用目标,使用 call 方法进行调用,得到响应数据,整个过程不用调整 client 调用url,目标数据来源于 agent,与注册中心同步更新。调用的方法请看服务节点的路由列表。

总结

以上是使用 FastD 研发的一个服务发现初版,未来还会以这个作为基础进行不断的优化,希望在得到大家批评的时候能够得到更多的建议与指导。

使用文档: FastD 服务发现