Swoft 2.x Rpc调用

蔚落 2022-08-28 12:43 128阅读 0赞

Swoft框架的初始化

Swoft初始化有六个步骤:

  1. ENV环境文件初始化
  2. 注解信息扫描收集
  3. 配置初始化
  4. 注册类到bean容器
  5. 收集事件监听器
  6. 启动console控制台,启动相应的服务

官方文档

而Rpc作为Swoft提供的基础模块之一,其初始化流程也与框架的初始化一致

Rpc服务调用

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16

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服务配置

20210924105236420.png

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 1

Rpc 服务注入

在 /app/Http/Controller/RpcController 中声明并注入配置文件中配置好的Rpc服务

2021092410540265.png

Client启动时,通过控制器当中的接口注解,去访问Rpc服务,所以框架启动时通过代理类解析接口注解,并加载对象到附加容器中,在调用时可以从容器中获取并调用

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 2

【注意】 更底层的服务注入和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

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 3

如图, Rpc服务成功启动

20210924105728953.png

1.Rpc请求过来后,进行dispatch, 触发dispatch
watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 4

2.在服务分发类中调用 serviceHandle 处理请求

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_19_color_FFFFFF_t_70_g_se_x_16

3.加载对应中间件处理请求

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 5

4.进行路由匹配,通过获取发送的打包数据,决定调用的接口方法及版本

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 6

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oi05Zu96L-b_size_20_color_FFFFFF_t_70_g_se_x_16 7

至此一个完整的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

发表评论

表情:
评论列表 (有 0 条评论,128人围观)

还没有评论,来说两句吧...

相关阅读

    相关 RPC调用的流程

    RPC调用的流程      要让网络通信细节对使用者透明,我们自然需要对通信细节进行封装,我们先看下一个RPC调用的流程: ![522490-2015100312

    相关 Swoft 2.x Rpc调用

    Swoft框架的初始化 Swoft初始化有六个步骤: 1. ENV环境文件初始化 2. 注解信息扫描收集 3. 配置初始化 4. 注册类到bean容器 5.

    相关 swoft单元测试

    1.1 为什么要使用单元测试 在编写代码的过程中,一定会反复调试保证它能够编译通过。但代码通过编译,只是说明了它的语法正确。无法保证它的语义也一定正确,没有任何人可以轻易