Swoft框架的初始化
Swoft初始化有六个步骤:
- ENV环境文件初始化
- 注解信息扫描收集
- 配置初始化
- 注册类到bean容器
- 收集事件监听器
- 启动console控制台,启动相应的服务
而Rpc作为Swoft提供的基础模块之一,其初始化流程也与框架的初始化一致
Rpc服务调用
Rpc的本质也是一个请求的发送和处理,所以会有发送请求的Client和接收请求的Server,这两者在Swoft中都需要进行Bean容器的注册
Rpc 服务初始化
Rpc Client是发起Rpc请求的客户端,在Swoft中其底层实现是Swoole的协程客户端,即 Swoole\Coroutine\Client, 且Swoft对客户端进行了连接池的实现,每次进行Rpc请求的调用时,无需不断初始化Client,只需要在Rpc Client的连接池中获取Client即可
在Swoft中是以服务的形式来声明不同的功能模块,具体在 /app/bean.php中 声明配置
官方提供了一个user的rpc 服务:
Rpc Client服务配置
Rpc 服务注入
在 /app/Http/Controller/RpcController 中声明并注入配置文件中配置好的Rpc服务
Client启动时,通过控制器当中的接口注解,去访问Rpc服务,所以框架启动时通过代理类解析接口注解,并加载对象到附加容器中,在调用时可以从容器中获取并调用
【注意】 更底层的服务注入和Rpc服务初始化要看 Bean容器初始化及 Rpc 的框架底层源码
具体位置在 /vendor/swoft/bean 及 /vendor/swoft/rpc-client /vendor/swoft/rpc-server
服务编写
服务的具体业务内容编写在 app/Rpc 中,这个在官方文档中有详细介绍
大体流程就是需要先 声明服务接口,然后再实现这个服务接口
【注意】 当然上述是基于swoft框架的Rpc服务,若调用的是其他系统的rpc,则需要根据事先规定好的rpc协议进行通信
Rpc服务启动
swoft的Rpc服务有单独启动和集成其他服务(http/Websocket)两种方式,无论哪种方式,都需要在 bean.php 中配置Rpc
如图, Rpc服务成功启动
1.Rpc请求过来后,进行dispatch, 触发dispatch
2.在服务分发类中调用 serviceHandle 处理请求
3.加载对应中间件处理请求
4.进行路由匹配,通过获取发送的打包数据,决定调用的接口方法及版本
至此一个完整的Rpc请求完成,但是Swoft2.0中并没有提供远程Rpc的服务发现组件,需要手动进行集成和封装
swoole官方文档
协程客户端 https://wiki.swoole.com/#/coroutine_client/init
连接池 https://wiki.swoole.com/#/coroutine/conn_pool
多端口监听 https://wiki.swoole.com/#/server/port
swoft2.0 文档
rpc-server https://www.bookstack.cn/read/swoft-doc-v2.x/rpc-server-index.md
rpc-client https://www.bookstack.cn/read/swoft-doc-v2.x/rpc-client-index.md