【workbunny】Nacos客戶端

A PHP implementation of Nacos OpenAPI for webman plugin
Naocs插件問(wèn)答帖
常見(jiàn)問(wèn)題
-
什么是Nacos?
Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù);是微服務(wù)/SOA架構(gòu)體系中服務(wù)治理環(huán)節(jié)的重要成員服務(wù);簡(jiǎn)單的可以把Nacos理解為一個(gè)配置中心和一個(gè)服務(wù)注冊(cè)中心。
-
什么時(shí)候用Nacos?
-
當(dāng)我們的服務(wù)越來(lái)越大、越來(lái)越復(fù)雜,需要配置的地方越來(lái)越多,配置存放的地方也越來(lái)越多的時(shí)候,為了可以方便統(tǒng)一管理配置,這時(shí)候就可以引入Nacos;
-
當(dāng)我們的服務(wù)越來(lái)越多,有些時(shí)候部署需要做到彈性伸縮,需要用到一些負(fù)載策略的時(shí)候,可以引入Nacos進(jìn)行服務(wù)的治理;
-
簡(jiǎn)介
-
Webman-naocs是基于PHP開(kāi)發(fā)的Webman插件生態(tài)下的Nacos客戶端;
-
本項(xiàng)目來(lái)源于 Tinywan/nacos,對(duì) Tinywan 表示感謝!區(qū)別于 Tinywan/nacos,workbunny/webman-nacos在配置監(jiān)聽(tīng)和實(shí)例注冊(cè)上有不同的實(shí)現(xiàn)方式,其他的使用方法與之無(wú)異;
-
Webman-nacos使用的主要組件:
- workerman/http-client
- guzzlehttp/guzzle
安裝
composer require workbunny/webman-nacos
使用
1. Nacos文檔地址
2. 服務(wù)的使用
-
創(chuàng)建連接通道
// 使用默認(rèn)通道【建議使用】 $client = \Workbunny\WebmanNacos\Client::channel(); // 使用channel.php中鍵名為ABC的連接配置 $client = \Workbunny\WebmanNacos\Client::channel('ABC');
注:該方案默認(rèn)使用channel.php中的連接配置,支持多通道連接,建議使用!
注:獲取一個(gè)不存在的配置信息時(shí),會(huì)拋出一個(gè) NacosException 異常。// 舊版保留方式【不建議使用】 $client = new Workbunny\WebmanNacos\Client();
注:該方案默認(rèn)使用app.php中的連接配置,后續(xù)會(huì)將其移除,不建議繼續(xù)使用!
-
以監(jiān)聽(tīng)配置舉例
$client = \Workbunny\WebmanNacos\Client::channel(); // 異步非阻塞監(jiān)聽(tīng) // 注:在webman中是異步非阻塞的,不會(huì)阻塞當(dāng)前進(jìn)程 $response = $client->config->listenerAsyncUseEventLoop(); // 異步阻塞監(jiān)聽(tīng) // 注:在webman中是異步阻塞的,返回的是Guzzle/PromiseInterface,配合wait()可以多條請(qǐng)求并行執(zhí)行; // 請(qǐng)求會(huì)阻塞在 **wait()** 直到執(zhí)行完畢;詳見(jiàn) **ConfigListernerProcess.php** $response = $client->config->listenerAsync(); // 同步阻塞監(jiān)聽(tīng) $response = $client->config->listener();
-
斷開(kāi)連接
$client = \Workbunny\WebmanNacos\Client::channel(); $client->cancel();
配置說(shuō)明:
- app.php 為基礎(chǔ)配置;
- channel.php 為連接通道配置;
- process.php 為默認(rèn)啟動(dòng)進(jìn)程配置;
3. Nacos相關(guān)服務(wù)
配置相關(guān):
- 監(jiān)聽(tīng)配置
webman-nacos組件默認(rèn)會(huì)啟動(dòng)一個(gè)名為 config-listener 的進(jìn)程,用于監(jiān)聽(tīng)在配置文件
plugin/workbunny/webman-nacos/app.php 中 config_listeners
下的配置內(nèi)容。
如果想自行掌控調(diào)用,可以使用如下服務(wù):
$client = \Workbunny\WebmanNacos\Client::channel();
// 異步非阻塞監(jiān)聽(tīng)
// 注:在webman中是異步非阻塞的,不會(huì)阻塞當(dāng)前進(jìn)程
$response = $client->config->listenerAsyncUseEventLoop();
// 異步阻塞監(jiān)聽(tīng)
// 注:在webman中是異步阻塞的,返回的是Guzzle/PromiseInterface,配合wait()可以多條請(qǐng)求并行執(zhí)行;
// 請(qǐng)求會(huì)阻塞在 **wait()** 直到執(zhí)行完畢;詳見(jiàn) **ConfigListernerProcess.php**
$response = $client->config->listenerAsync();
# 同步阻塞監(jiān)聽(tīng)
$response = $client->config->listener();
- 獲取配置
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->config->get('database', 'DEFAULT_GROUP');
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());
}
服務(wù)相關(guān):
- 實(shí)例注冊(cè)
webman-nacos組件默認(rèn)會(huì)啟動(dòng)一個(gè)名為 instance-registrar 的進(jìn)程,用于注冊(cè)在配置文件
plugin/workbunny/webman-nacos/app.php 中 instance-registrar
下的配置內(nèi)容。
如需動(dòng)態(tài)注冊(cè)實(shí)例,請(qǐng)使用:
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->instance->register('127.0.0.1', 8848, '猜猜我是誰(shuí)', [
'groupName' => 'DEFAULT_GROUP',
]);
if (false === $response) {
var_dump($nacos->config->getMessage());
}
- 移除實(shí)例
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->instance->delete('猜猜我是誰(shuí)', 'DEFAULT_GROUP', '127.0.0.1', 8848, []);
if (false === $response) {
var_dump($nacos->config->getMessage());
}
- 實(shí)例列表
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->instance->list('猜猜我是誰(shuí)', []);
if (false === $response) {
var_dump($nacos->config->getMessage());
}
注:實(shí)例與服務(wù)的區(qū)別請(qǐng)參看Nacos文檔;
其他:
-
具體使用參數(shù)都在源碼內(nèi)已標(biāo)注,使用方法很簡(jiǎn)單,參考Nacos官方文檔即可;
-
后綴為Async的方法是Guzzle異步請(qǐng)求,在當(dāng)前業(yè)務(wù)執(zhí)行周期中阻塞,多個(gè)請(qǐng)求可并行執(zhí)行;
-
后綴為AsyncUseEventLoop的方法是workerman/http-client異步請(qǐng)求,在當(dāng)前業(yè)務(wù)周期中非阻塞;
$client = \Workbunny\WebmanNacos\Client::channel();
# 配置相關(guān)接口
$client->config;
# 鑒權(quán)相關(guān)接口
$client->auth;
# 實(shí)例相關(guān)接口
$client->instance;
# 系統(tǒng)相關(guān)接口
$client->operator;
# 服務(wù)相關(guān)接口
$client->service;
說(shuō)明
-
目前這套代碼在我司生產(chǎn)環(huán)境運(yùn)行,我會(huì)做及時(shí)的維護(hù),歡迎 issue 和 PR;
-
對(duì)于不知道Nacos有什么用的/在什么時(shí)候用,可以參考這篇文章 Nacos在我司的應(yīng)用及SOA初嘗;
-
nacos的配置監(jiān)聽(tīng)項(xiàng)采用了服務(wù)端長(zhǎng)輪詢(xún),有點(diǎn)類(lèi)似于stream_select,當(dāng)配置沒(méi)有改變的時(shí)候,會(huì)阻塞至請(qǐng)求結(jié)束;但當(dāng)配置有變化時(shí)候,會(huì)立即返回其配置dataId;這里我的做法是開(kāi)啟一個(gè)Timer對(duì)配置進(jìn)行監(jiān)聽(tīng),定時(shí)器間隔與長(zhǎng)輪詢(xún)最大阻塞時(shí)間一致:
-
ConfigListenerProcess使用Guzzle的異步請(qǐng)求對(duì)配置監(jiān)聽(tīng)器進(jìn)行請(qǐng)求處理,
onWorkerStart中的Guzzle客戶端會(huì)阻塞請(qǐng)求,workerman status中會(huì)顯示BUSY狀態(tài); -
AsyncConfigListenerProcess使用wokerman/http-client異步請(qǐng)求對(duì)配置監(jiān)聽(tīng)
器進(jìn)行請(qǐng)求,workerman/http-client使用了workerman的event-loop進(jìn)行I/O處理,
不會(huì)阻塞當(dāng)前進(jìn)程,推薦使用;
-
-
所有的配置同步后會(huì)觸發(fā) workerman reload 對(duì)所有進(jìn)程進(jìn)行重載,保證了config的刷新,包括已經(jīng)在內(nèi)存中的各種單例,如 數(shù)據(jù)庫(kù)連接、Redis連接等,保證即時(shí)將配置傳達(dá)至需要的業(yè)務(wù)點(diǎn);
-
使用配置方式不必改變,使用webman的config()即可,降低封裝組件的心智負(fù)擔(dān);