imi 介绍
imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。
imi 拥有丰富的功能组件,v2.1 版本内置了 2 个分布式长连接服务的解决方案。
imi 框架现在已经稳定运行在:文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端、数据迁移服务(虎扑)等项目中。
imi 第一个版本发布于 2018 年 6 月 21 日
项目地址
- Github:https://github.com/imiphp/imi
- Gitee:https://gitee.com/yurunsoft/IMI
- 官网:https://www.imiphp.com/
- 文档:https://doc.imiphp.com/v2.1/
获得过的荣誉
- InfoQ 推荐:https://mp.weixin.qq.com/s/oB...
- 码云 GVP 项目:https://gitee.com/yurunsoft/IMI
作者介绍
宇润(张润宇),Swoole 开发组成员、php-src 内核贡献者、TDengine 贡献者、2021 中国开源码力榜前百名
进度说明(20220709)
宇润在 imi 四周年直播活动中,向大家介绍了下一步的开发计划。
其中,明确指出了 imi 开发组要大力发展微服务生态,为 PHP 微服务添砖加瓦。
第一步,是为 imi 接入配置中心。
目前已经实现了 imi-config-center 配置中心组件的抽象化。
以及基于 Nacos 开发了一个 imi-nacos 用于实现配置中心组件。
都已编写并通过了自动化集成测试,有测试用例是 imi 开发组对 imi 相关开发的基本要求
正在开发中,随时可能修改,请勿用于生产环境!(但也欢迎大家尝鲜和提建议)
在开发 imi-nacos 的时候,因为现有的 PHP Nacos 组件都有各种各样的问题,所以我自己开发了一个: nacos-php
开发 nacos-php 的过程中发现了 Nacos 文档里的一些问题(其实可能是设计和规范问题),顺手帮他们完善了文档:https://github.com/nacos-grou...
配置中心的好处
我们通常会把一些配置放到专门的配置文件里,一般会随着代码分发和部署。
在需要修改配置的时候,需要重新走发版流程,显得非常笨重和不方便。
这时候,配置中心的作用就体现了。
我们从配置中心拿配置,而不是写死在项目里,可以比较灵活地实现不中断服务的配置发布。
imi 配置中心组件设计
监听模式
工作进程模式
每个进程自己监听,适用于 Swoole 环境。
进程模式
由一个专门的进程监听,并通知到其它进程。适用于 Swoole、Workerman 环境。
对配置中心压力更小。
php-fpm 模式比较特殊,是走的文件缓存逻辑。超过一定时间才去请求配置中心,获取数据,实时性有一定影响。
监听方式
客户端轮询
客户端定时请求配置中心,对配置中心服务端压力较大,但是最为通用。
服务端推送(长轮询)
如果配置中心支持服务端推送(长轮询),建议用这个方式,对配置中心服务端压力较小。
imi-nacos 的使用
安装
composer require imiphp/imi-nacos
使用说明
配置
@app.beans
:
[
'ConfigCenter' => [
// 'mode' => \Imi\ConfigCenter\Enum\Mode::WORKER, // 工作进程模式
'mode' => \Imi\ConfigCenter\Enum\Mode::PROCESS, // 进程模式
'configs' => [
'nacos' => [
'driver' => \Imi\Nacos\Config\NacosConfigDriver::class,
// 客户端连接配置
'client' => [
'host' => '127.0.0.1', // 主机名
'port' => 8848, // 端口号
'prefix' => '/', // 前缀
'username' => 'nacos', // 用户名
'password' => 'nacos', // 密码
'timeout' => 60000, // 网络请求超时时间,单位:毫秒
'ssl' => false, // 是否使用 ssl(https) 请求
'authorizationBearer' => false, // 是否使用请求头 Authorization: Bearer {accessToken} 方式传递 Token,旧版本 Nacos 需要设为 true
],
// 监听器配置
'listener' => [
'timeout' => 30000, // 配置监听器长轮询超时时间,单位:毫秒
'failedWaitTime' => 3000, // 失败后等待重试时间,单位:毫秒
'savePath' => Imi::getRuntimePath('config-cache'), // 配置保存路径,默认为空不保存到文件。php-fpm 模式请一定要设置!
'fileCacheTime' => 30, // 文件缓存时间,默认为0时不受缓存影响,此配置只影响 pull 操作。php-fpm 模式请一定要设置为大于0的值!
'pollingInterval' => 10000, // 客户端轮询间隔时间,单位:毫秒
],
// 配置项
'configs' => [
'nacos' => [
'key' => 'imi-nacos-key1',
'group' => 'imi',
],
],
],
],
],
]
获取配置
\Imi\Config::get('nacos'); // 对应 imi-nacos-key1
写入配置
/** @var \Imi\ConfigCenter\ConfigCenter $configCenter */
$configCenter = App::getBean('ConfigCenter');
$name = 'imi-nacos-key1';
$group = 'imi';
$type = 'json';
$value = json_encode(['imi' => 'niubi']);
$configCenter->getDriver('nacos')->push($name, $value, [
'group' => $group,
'type' => $type,
]);
近期开发计划
- 继续维护迭代 imi 核心功能万年不变
- 开发更多 imi 配置中心的具体实现(Apollo、etcd、Zookeeper、Consul)
如果你对开源和 imi 项目感兴趣,不妨一起来开发。
只需开发一个受认可的 imi 组件或基于 imi 的开源项目,即可成为 imi 开发组成员之一。