laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱。
笔者也参与过一些由laravel开发的项目。虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器,比如使用swoole进行加速。
一个项目立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身。项目微服务化,松耦合模块间的关系,是一个很好的选择,随然增加了维护成本,但是还是很值得的。
那么有什么办法使一个laravel项目改造成微服务呢?
最近研究thrift的时候发现thrift对php之城非常好,那么可不可以使用使用thrift作为rpc框架,使用swoole来实现异步TCP服务,打造一个微服务框架呢。
心动不如行动我们开始尝试一下吧。首先我们创建一个laravel的项目,笔者使用的laravel官方提供的homestead的环境。
laravel new laravel-thrift-app
安装laravel-s https://github.com/hhxsv5/laravel-s/blob/master/README-CN.md
composer require "hhxsv5/laravel-s:~3.5.0" -vvv
laravel-s是一个由swoole写的laravel扩展,赋予laravel更好的性能,具体使用方法参看官方文档。
在项目的根目录下新建一个thrift的目录,然后在该子目录下创建 Thrift IDL 文件 user.thrift,用于定义和用户相关的服务接口。
namespace php App.Thrift.User
// 定义用户接口
service User {
string getInfo(1:i32 id)
}
这里我们定义了一个接口,接着在项目根目录下运行如下命令,根据上述 IDL 文件生成相关的服务代码:
thrift -r --gen php:server -out ./ thrift/user.thrift
查看文件这时候我们会发现在AppThriftUser`目录下生成对应的服务代码。
通过 Composer 安装 Thrift PHP 依赖包:
composer require apache/thrift
编写服务代码,在 app目录下新建一个 Services/Server 子目录,然后在该目录下创建服务接口类 UserService,该类实现自 `AppThriftUserUserIf` 接口:
<?php
namespace AppServicesServer;
use AppThriftUserUserIf;
class UserService implements UserIf
{
public function getInfo($id)
{
return "chenSi".$id;
}
}
在 app 目录下新建一个 Sockets目录用于存放 Swoole 相关代码,首先我们创建一个 ServerTransport.php用来存放服务端代理类,并编写代码如下:
<?php
namespace AppSockets;
use ThriftServerTServerTransport;
class ServerTransport extends TServerTransport
{
/**
* @var array 服务器选项
*/
public $options = [
'dispatch_mode' => 1, //1: 轮循, 3: 争抢
'open_length_check' => true, //打开包长检测
'package_max_length' => 8192000, //最大的请求包长度,8M
'package_length_type' => 'N', //长度的类型,参见PHP的pack函数
'package_length_offset' => 0, //第N个字节是包长度的值
'package_body_offset' => 4, //从第几个字节计算长度
];
/**
* @var SwooleServer