PHP 基于 SW-X 框架,搭建RPC微服务支持

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: SW-X的微服务也可用于优化FPM业务,底层使用了TCP通讯协议,支持基于AES的数据加解密支持,官方提供了Swoole/FPM下的RPC客户端,并提供了纯基于Redis存储管理的RPC服务中心。

前言

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

希望各大佬举起小手,GitHub - swoolex/swoolex: SwooleX一款专注于高性能、便捷开发的PHP协程框架

场景一

在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、需要先安装Redis服务,与PHP-Redis扩展
2、需要准备2个端口,与2份SW-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界面,执行以下代码:

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

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

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

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

具体UI如下图:

部署微服务-服务端

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

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

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

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

服务日常管理

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

1、服务调试

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

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

2、服务统计

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

[
    // +-----------------------------
    // | 服务请求统计相关
    // +-----------------------------
    // 是否开启统计
    'chat_status' => true,
    // 统计记录的Redis连接池标识
    'chat_redis_driver' => 'default',
    // 统计记录保留天数
    'chat_days' => 14,
];

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

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

3、添加服务

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

具体流程如下图:

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

<?php
// 微服务-同步调用演示
namespace app\rpc\order;
use x\controller\Rpc;
class test extends Rpc{
    // 对应 order/test->run 服务
    public function run() {
        // 可以这样获取请求头
        $headers = $this->headers();
        // 可以这样获取请求参数
        $param = $this->param();
        // 可以return值就是调用结果值
        return $param;
    }
}

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

4、FPM安装微服务客户端

打开官网:组件 | SW-X框架

根据项目的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,为如下代码:

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

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

5、异步投递调用

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

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

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

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

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

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

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

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

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

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

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


更多的客户端支持,可以在SW-X官网中进行查看:组件 | SW-X框架

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
143 3
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
260 17
微服务框架Dubbo环境部署实战
|
3月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
87 5
|
3月前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
110 5
|
3月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
77 2
|
3月前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
189 2
|
4月前
|
Cloud Native JavaScript API
一文读懂云原生 go-zero 微服务框架
一文读懂云原生 go-zero 微服务框架
|
4月前
|
开发框架 Dubbo 应用服务中间件
微服务开发框架-----Apache Dubbo
这篇文章介绍了Apache Dubbo微服务开发框架,它提供RPC通信和微服务治理能力,支持服务发现、负载均衡和流量治理等功能,并强调了Dubbo在微服务规模化实践和企业级治理方面的优势。
微服务开发框架-----Apache Dubbo
|
4月前
|
负载均衡 Dubbo 应用服务中间件
框架巨擘:Dubbo如何一统异构微服务江湖,成为开发者的超级武器!
【8月更文挑战第8天】在软件开发中,微服务架构因灵活性和可扩展性备受欢迎。面对异构微服务的挑战,Apache Dubbo作为高性能Java RPC框架脱颖而出。它具备服务注册与发现、负载均衡及容错机制等核心特性,支持多种通信协议和序列化方式,能有效连接不同技术栈的微服务。Dubbo的插件化设计保证了面向未来的扩展性,使其成为构建稳定高效分布式系统的理想选择。
61 5