Blogger Information
Blog 12
fans 0
comment 0
visits 8780
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 基于 SW-X 框架,搭建RPC微服务支持
广州PHP
Original
1072 people have browsed it

前言

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架

希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex

场景一

在FPM项目中,很多业务情况下是挺无奈的,例如某个业务需要用到发送短信。

通常这类业务不管短信是否发送成功,都不应该应该影响该接口的执行结果,又或者是执行效率(CURL堵塞到了下面的业务代码)。

以往,这种情况一般会把发送短信当作一个任务,投递到某种消息队列中,然后在php-cli下使用多进程的方式另起一个独立的进程进行后台消耗执行。

由于受到PHP进程模型的影响,如果FPM的进程被堵塞,该队列就有可能被直接挂掉。

同时,这种方法的性能消耗严重,也不便于日常维护。

场景二

如果是允许异步执行的逻辑,在FPM下还有优化的空间,那如果是需要同步执行的代码呢。

例如需要调用百度地图的经纬度解析接口,这种同时需要等待获得请求结果,才能往下执行。

假设我们有一个项目,7个接口需要用到该接口,通常情况下都会基于框架,封装成一个扩展类,又或者是一个公共的函数进行调用。

但当公司业务扩张,可能会产生不同的业务线,但不同的业务所使用的语言,框架都不一定一致(不是所有公司都喜欢一个框架,启用多应用架构的)。

这时候扩展封装的方式就没办法使用了,因为我们可能会copy无数份相同的代码到各个应用下,当百度地图接口升级时,我们还有可能会遗漏某一个应用下的代码没有升级完成,从而导致业务错误,发生不可估量的损失。

场景三

如果说第三方接口还可以允许COPY封装的扩展到多个应用下,那公共的业务逻辑组件化封装就没办法了。

例如会员注册,当项目刚起步时,可能我们需要会员注册才能下单,忽然某天公司业务做大了,需要开发出渠道API,让渠道商部署平台,其中又有会员注册的功能。

之后,公司发现如果使用二维码直接下单,又会更加方便市场推广,就变成需要支持下单时直接注册用户。

再之后,又一堆后台创建会员、电话下单创建会员、积分兑换商城创建会员等等。

从一个会员注册的Model,忽然变成了N个应用的会员注册,这时候使用单个应用的Model封装已经无法承载业务了。

SW-X的微服务

SW-X的微服务都是为了应对以上这些场景所诞生,底层使用了TCP通讯协议,支持基于AES的数据加解密支持,官方提供了Swoole/FPM下的RPC客户端,并提供了纯基于Redis存储管理的RPC服务中心,可进行WEB界面化的服务日常管理。

微服务的部署条件

  1. 1、需要先安装Redis服务,与PHP-Redis扩展
  2. 2、需要准备2个端口,与2SW-X框架源码,因为服务中心(http)与微服务服务端(rpc)是需要分别启动不同的服务端口。

资料准备

先将Redis改成6379端口(默认),密码改成123456

安全组开放一个9501端口,用于搭建微服务-服务中心。

安全组开放一个9502端口,用于搭建微服务-服务端。

部署微服务-服务中心

1、将SW-X框架源码解压(拉取)到swoole_web/目录下,具体地址也可以改成自己测试的。

2、修改/config/server.php文件下的port端口为9501

3、修改/config/rpc.php文件下的http_rpc_is参数为true,表示当前HTTP服务为RPC服务中心应用。同时,该文件下的http_rpc_user_list参数为服务中心的账号配置,默认的超级账号密码是:swoolex

4、打开shell界面,执行以下代码:

  1. # 进入目录
  2. cd /www/wwwroot/swoole_web/
  3. # 安装服务中心-web组件
  4. php sw-x rpc start

安装成功会输出服务中心对应的路由地址,然后在shell界面,继续输入:

  1. # 启动HTTP服务后台运行
  2. php sw-x start http -d

完成后,就可以在浏览器打开IP地址:9501/HttpRpc/login访问到微服务-服务中心登陆地址了。

具体UI如下图:

部署微服务-服务端

1、将SW-X框架源码解压(拉取)到swoole_rpc/目录下,具体地址也可以改成自己测试的。

2、修改/config/server.php文件下的port端口为9502

3、打开shell界面,执行以下代码:

  1. # 进入目录
  2. cd /www/wwwroot/swoole_rpc/
  3. # 启动RPC服务[不退后台运行]
  4. php sw-x start rpc

服务日常管理

登入服务中心,我们可以看到有一个框架默认的测试服务,如下:

1、服务调试

点击调试按钮,可以直接对该服务进行在线调试,如下图:

可以对调试参数进行在线设置和保存,点击调试后对应的结果会在右侧窗口滑出。

2、服务统计

同时,服务中心也支持统计单个服务在一小时内的请求量,需要在RPC服务端,修改/config/rpc.php的配置参数,如下:

  1. [
  2. // +-----------------------------
  3. // | 服务请求统计相关
  4. // +-----------------------------
  5. // 是否开启统计
  6. 'chat_status' => true,
  7. // 统计记录的Redis连接池标识
  8. 'chat_redis_driver' => 'default',
  9. // 统计记录保留天数
  10. 'chat_days' => 14,
  11. ];

chat_status参数改为true,由于微服务的统计是依赖Redis计数器实现,所有微服务服务端也需要配置好Redis连接池(连接数必须大于1),然后重启RPC服务端即可。

最后回到服务中心,多发送几次调试请求,再点击统计按钮,就可以查看到下图效果:

3、添加服务

下面,我们就来创建一个order/test->run的服务,该服务是表示,服务调用于/app/rpc/order/test.php控制器下的run()方法。

具体流程如下图:

然后在swoole_rpc/服务端,创建/app/rpc/order/test.php文件,并写入以下代码:

  1. <?php
  2. // 微服务-同步调用演示
  3. namespace app\rpc\order;
  4. use x\controller\Rpc;
  5. class test extends Rpc{
  6. // 对应 order/test->run 服务
  7. public function run() {
  8. // 可以这样获取请求头
  9. $headers = $this->headers();
  10. // 可以这样获取请求参数
  11. $param = $this->param();
  12. // 可以return值就是调用结果值
  13. return $param;
  14. }
  15. }

如果你没有开启热重载,就需要先重启服务端,才能进行调试,下面是在服务中心里的调试结果:

4、FPM安装微服务客户端

打开官网:https://www.sw-x.cn/word/v2.5.x/client_rpc_assembly.html#a14

根据项目的PHP版本,下载对应的FPM客户端扩展包,解压到应用的/extend/自定义扩展应用目录下(不管是TP还是La都会有该支持)。

下面以一个ThinkPHP5.1的项目为例,下载PHP5.3+版本的客户端包。

解压后,修改/SwooleXRpc/config/rpc.php文件,主要是将里面的配置参数,改成与微服务服务中心的/config/rpc.php/config/redis.php配置一致即可。

然后修改TP默认控制器代码/app/index/controller/Index.php,为如下代码:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. class Index extends Controller{
  5. public function index() {
  6. // 调用微服务客户端
  7. $Rpc = new \SwooleXRpc\RpcClient();
  8. // 请求RPC服务
  9. $body = $Rpc->route('order/test') // 路由地址
  10. ->func('run') // 方法
  11. ->param([ // 请求参数
  12. 'longitude' => '113.383523',
  13. 'latitude' => '23.131044'
  14. ])
  15. ->header(array()) // 请求头
  16. ->max(3) // 当RPC请求失败时,最多递归几个服务节点直至成功为止,默认1
  17. // ->task() // 是否投递异步任务池
  18. // ->callback('http://baidu.com', 'post') // 异步任务可以设置回调通知
  19. ->send(); // 发送请求
  20. // 结果集
  21. dump($body);
  22. // 状态码 == 200 == 成功
  23. dump($Rpc->getStatus());
  24. // 错误原因
  25. dump($Rpc->getMsg());
  26. }
  27. }

最后访问该控制器查看调用结果即可。

5、异步投递调用

SW-X的微服务在客户端调用时,可以把该次服务请求投递到异步任务池,当前请求会即可返回true,表示任务投递成功。

投递成功的任务会从Swoole的onReceive事件,转发到onTask事件进行处理。

在服务中心添加以下服务,用于测试异步调用:

然后在swoole_rpc/服务端,创建/app/rpc/order/task.php文件,并写入以下代码:

  1. <?php
  2. // 微服务-异步调用演示
  3. namespace app\rpc\order;
  4. use x\controller\Rpc;
  5. class task extends Rpc{
  6. // 对应 order/task->run 服务
  7. public function run() {
  8. // 可以这样获取请求参数
  9. $param = $this->param();
  10. // 记录日志,看看服务是否调用成功
  11. error_log(json_encode($param).PHP_EOL, 3, ROOT_PATH.'/task_test.log');
  12. // 可以return值就是调用结果值,如果是设置了回调通知地址,就会发送过去
  13. return $param;
  14. }
  15. }

如果你没有开启热重载,就需要先重启服务端,才能进行调试。

再然后,修改TP默认控制器代码/app/index/controller/Index.php,为如下代码:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. class Index extends Controller{
  5. public function index() {
  6. // 调用微服务客户端
  7. $Rpc = new \SwooleXRpc\RpcClient();
  8. // 请求RPC服务
  9. $body = $Rpc->route('order/task') // 路由地址
  10. ->func('run') // 方法
  11. ->param([ // 请求参数
  12. 'longitude' => '113.383523',
  13. 'latitude' => '23.131044'
  14. ])
  15. ->header(array()) // 请求头
  16. ->max(3) // 当RPC请求失败时,最多递归几个服务节点直至成功为止,默认1
  17. ->task() // 投递异步任务池
  18. ->callback('http://你的TP测试地址/index.php/callback/index', 'post') // 异步任务可以设置回调通知,如果不需要回调通知,可以不设置
  19. ->send(); // 发送请求
  20. // 结果集
  21. dump($body);
  22. // 状态码 == 200 == 成功
  23. dump($Rpc->getStatus());
  24. // 错误原因
  25. dump($Rpc->getMsg());
  26. }
  27. }

创建一个/app/index/controller/Callback.php控制器,用于记录异步处理回调通知结果:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. class Callback extends Controller{
  5. // 测试-记录异步服务调用回调通知
  6. public function index() {
  7. $param = \think\facade\Request::param();
  8. error_log(json_encode($param).PHP_EOL, 3, 'task_test.log');
  9. }
  10. }

之后,就可以在浏览器访问TP的index/index控制器进行测试了,调用完成后分别查看两个task_test.log文件的记录结果。

更多的客户端支持,可以在SW-X官网中进行查看:https://www.sw-x.cn/word/v2.5.x/client_rpc_assembly.html

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post