workbunny / webman-nacos
Webman 插件 workbunny/webman-nacos
Requires
- php: >=7.4
- ext-json: *
- ext-mbstring: *
- guzzlehttp/guzzle: ^7.4
- guzzlehttp/promises: ^1.5 | ^2.0
- monolog/monolog: ^2.8
- workerman/http-client: ^1.0 | ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- workerman/webman-framework: ^1.3.0
README
workbunny/webman-nacos
🐇 Webman 插件的 Nacos OpenAPI PHP 实现。🐇
Webman 插件的 Nacos OpenAPI PHP 实现
Nacos 插件问答帖
https://www.workerman.net/q/9134
简介
什么是 Nacos?
Nacos 致力于帮助您发现、配置和管理微服务;是微服务/SOA 架构体系中服务治理环节的重要成员服务;简单的可以把 Nacos 理解为一个配置中心和一个服务注册中心。
何时使用 Nacos?
-
当我们的服务越来越大、越来越复杂,需要配置的地方越来越多,配置存放的地方也越来越多的时候,为了可以方便统一管理配置,这时候就可以引入 Nacos。
-
当我们的服务越来越多,有些时候部署需要做到弹性伸缩,需要用到一些负载策略的时候,可以引入 Nacos 进行服务的治理。
生态
-
Webman-nacos 是基于 PHP 开发的 Webman 插件生态下的 Nacos 客户端;
-
本项目来源于 Tinywan/nacos,对 Tinywan 表示感谢!区别于 Tinywan/nacos,workbunny/webman-nacos 在配置监听和实例注册上有不同的实现方式,其他的使用方法与之无异;
-
Webman-nacos 使用的主要组件:
安装
composer require workbunny/webman-nacos
使用
1. Nacos 文档地址
2. 服务的使用
- 创建连接通道
// 使用默认通道【建议使用】 $client = \Workbunny\WebmanNacos\Client::channel(); // 使用channel.php中键名为ABC的连接配置 $client = \Workbunny\WebmanNacos\Client::channel('ABC');
注:该方案默认使用 channel.php 中的连接配置,支持多通道连接,建议使用!
注:获取一个不存在的配置信息时,会抛出一个 NacosException 异常。
// 旧版保留方式【不建议使用】 $client = new Workbunny\WebmanNacos\Client();
注:该方案默认使用 app.php 中的连接配置,后续会将其移除,不建议继续使用!
- 以监听配置举例
$client = \Workbunny\WebmanNacos\Client::channel(); // 异步非阻塞监听 // 注:在webman中是异步非阻塞的,不会阻塞当前进程 $response = $client->config->listenerAsyncUseEventLoop(); // 异步阻塞监听 // 注:在webman中是异步阻塞的,返回的是Guzzle/PromiseInterface,配合wait()可以多条请求并行执行; // 请求会阻塞在 **wait()** 直到执行完毕;详见 **ConfigListernerProcess.php** $response = $client->config->listenerAsync(); // 同步阻塞监听 $response = $client->config->listener();
- 断开连接
$client = \Workbunny\WebmanNacos\Client::channel(); $client->cancel();
配置说明:
- app.php 为基础配置;
- channel.php 为连接通道配置;
- process.php 为默认启动进程配置;
3. Nacos 相关服务
配置相关
- 监听配置
webman-nacos 组件默认会启动一个名为 config-listener 的进程,用于监听在配置文件 plugin/workbunny/webman-nacos/app.php 中 config_listeners 下的配置内容。
如果想自行掌控调用,可以使用如下服务:
$client = \Workbunny\WebmanNacos\Client::channel(); // 异步非阻塞监听 // 注:在webman中是异步非阻塞的,不会阻塞当前进程 $response = $client->config->listenerAsyncUseEventLoop(); // 异步阻塞监听 // 注:在webman中是异步阻塞的,返回的是Guzzle/PromiseInterface,配合wait()可以多条请求并行执行; // 请求会阻塞在 **wait()** 直到执行完毕;详见 **ConfigListernerProcess.php** $response = $client->config->listenerAsync(); # 同步阻塞监听 $response = $client->config->listener();
- 获取配置
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->config->get('database', 'DEFAULT_GROUP'); // 获取有命名空间的配置文件,第三个参数填写对应的命名空间 $response = $client->config->get('database', 'DEFAULT_GROUP', 'b34ea59f-e240-413b-ba3d-bb040981d773'); if (false === $response) { var_dump($nacos->config->getMessage()); }
- 提交配置
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->config->publish('database', 'DEFAULT_GROUP', file_get_contents('.env')); if (false === $response) { var_dump($nacos->config->getMessage()); }
- 移除配置
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->config->delete('database', 'DEFAULT_GROUP');; if (false === $response) { var_dump($nacos->config->getMessage()); }
服务相关:
- 实例注册
webman-nacos 组件默认会启动一个名为 instance-registrar 的进程,用于注册在配置文件 plugin/workbunny/webman-nacos/app.php 中 instance-registrar 下的配置内容。
如需动态注册实例,请使用:
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->instance->register('127.0.0.1', 8848, '猜猜我是谁', [ 'groupName' => 'DEFAULT_GROUP', ]); if (false === $response) { var_dump($nacos->config->getMessage()); }
- 移除实例
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->instance->delete('猜猜我是谁', 'DEFAULT_GROUP', '127.0.0.1', 8848, []); if (false === $response) { var_dump($nacos->config->getMessage()); }
- 实例列表
$client = \Workbunny\WebmanNacos\Client::channel(); $response = $client->instance->list('猜猜我是谁', []); if (false === $response) { var_dump($nacos->config->getMessage()); }
注:实例与服务的区别请参看 Nacos 文档;
其他:
-
具体使用参数都在源码内已标注,使用方法很简单,参考 Nacos 官方文档即可;
-
后缀为 Async 的方法是 Guzzle 异步请求,在当前业务执行周期中阻塞,多个请求可并行执行;
-
后缀为 AsyncUseEventLoop 的方法是 workerman/http-client 异步请求,在当前业务周期中非阻塞;
$client = \Workbunny\WebmanNacos\Client::channel(); # 配置相关接口 $client->config; # 鉴权相关接口 $client->auth; # 实例相关接口 $client->instance; # 系统相关接口 $client->operator; # 服务相关接口 $client->service;
说明
-
目前这套代码在我司生产环境运行,我会做及时的维护,欢迎 issue 和 PR;
-
对于不知道 Nacos 有什么用的/在什么时候用,可以参考这篇文章 Nacos 在我司的应用及 SOA 初尝;
-
nacos 的配置监听项采用了服务端长轮询,有点类似于 stream_select,当配置没有改变的时候,会阻塞至请求结束;但当配置有变化时候,会立即返回其配置 dataId;这里我的做法是开启一个 Timer 对配置进行监听,定时器间隔与长轮询最大阻塞时间一致
-
ConfigListenerProcess 使用 Guzzle 的异步请求对配置监听器进行请求处理, onWorkerStart 中的 Guzzle 客户端会阻塞请求,workerman status 中会显示 BUSY 状态;
-
AsyncConfigListenerProcess 使用 wokerman/http-client 异步请求对配置监听器进行请求,workerman/http-client 使用了 workerman 的 event-loop 进行 I/O 处理,不会阻塞当前进程,推荐使用;
-
-
所有的配置同步后会触发 workerman reload 对所有进程进行重载,保证了 config 的刷新,包括已经在内存中的各种单例,如 数据库连接、Redis 连接等,保证即时将配置传达至需要的业务点;
-
使用配置方式不必改变,使用 webman 的
config()
即可,降低封装组件的心智负担;