ssh / nacos-sdk-php
PHP SDK for Nacos service discovery and configuration
Requires
- php: >=8.0
- google/protobuf: ^3.15
- grpc/grpc: ^1.30
- guzzlehttp/guzzle: ^6.0 || ^7.0
- psr/log: ^1.0 || ^2.0 || ^3.0
- symfony/options-resolver: ^5.0 || ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.4
- phpunit/phpunit: ^8.0 || ^9.0
README
适用于 Nacos 2.x / 3.x 的 PHP SDK,提供服务配置管理、服务发现、服务调用、gRPC 通信等完整能力。
特性
- 配置管理 — 发布 / 获取 / 删除 / 监听配置变更
- 服务发现 — 注册 / 注销实例,获取实例列表与健康实例
- 服务调用 — 自动发现健康实例并调用,内置缓存与重试
- Feign 声明式客户端 — 类 OpenFeign 的声明式 API 调用
- 双通道通信 — gRPC 优先 → HTTP 自动降级
- 双认证方式 — 用户名密码 (accessToken) / AK-SK 签名
- 版本自适应 — 自动检测 Nacos 服务器版本,适配 v1 / v2 API 路径
- 领域模型 — Instance / Config / Service 数据模型,支持序列化与反序列化
安装
composer require ssh/nacos-sdk-php
系统要求
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| PHP | >= 8.0 | |
| guzzlehttp/guzzle | ^6.0 || ^7.0 | HTTP 客户端 |
| psr/log | ^1.0 || ^2.0 || ^3.0 | 日志接口 |
| grpc 扩展 | 可选 | 启用 gRPC 通道 |
| protobuf 扩展 | 可选 | 配合 gRPC 使用 |
快速开始
创建客户端
use Nacos\Nacos; $nacos = new Nacos( string $serverUrl = 'http://localhost:8848', // Nacos 服务器地址 string $namespaceId = 'public', // 命名空间 ID string $accessKey = '', // AK/SK 认证的 AccessKey string $secretKey = '', // AK/SK 认证的 SecretKey int $grpcPort = 9848, // gRPC 端口 ?LoggerInterface $logger = null, // 日志接口(PSR-3) string $username = '', // 用户名密码认证的用户名 string $password = '', // 用户名密码认证的密码 );
用户名密码认证(自建 Nacos)
$nacos = new Nacos( 'http://localhost:8848', // serverUrl 'public', // namespaceId '', // accessKey(不使用 AK/SK 时留空) '', // secretKey 9848, // gRPC 端口 null, // logger 'nacos', // username 'nacos' // password );
AK/SK 认证(阿里云 MSE 等)
$nacos = new Nacos( 'http://localhost:8848', // serverUrl 'dev-namespace', // namespaceId 'your-access-key', // accessKey 'your-secret-key' // secretKey // 其余参数使用默认值:grpcPort=9848, logger=null, username='', password='' );
自定义命名空间
$nacos = new Nacos( 'http://localhost:8848', 'dev-namespace', // 非 public 的命名空间 '', '', 9848, null, 'nacos', 'nacos' );
配置管理
// 发布配置 bool $nacos->config()->publishConfig( string $dataId, // 配置 ID string $group = 'DEFAULT_GROUP', // 分组 string $content, // 配置内容 string $type = 'text' // 配置类型:text / json / yaml / properties / xml / html ); // 获取配置(返回原始字符串,不会误解析 JSON 内容) string $nacos->config()->getConfig( string $dataId, string $group = 'DEFAULT_GROUP' ); // 删除配置 bool $nacos->config()->deleteConfig( string $dataId, string $group = 'DEFAULT_GROUP' ); // 监听配置变更(长轮询) $nacos->config()->listenConfig( string $dataId, // 配置 ID string $group, // 分组 callable $callback, // 变更回调函数 int $timeout = 30 // 长轮询超时(秒) );
使用示例:
// 发布 properties 配置 $nacos->config()->publishConfig('app.properties', 'DEFAULT_GROUP', 'host=127.0.0.1\nport=8080', 'properties'); // 发布 JSON 配置 $nacos->config()->publishConfig('app.json', 'DEFAULT_GROUP', '{"db":"mysql"}', 'json'); // 发布 YAML 配置 $nacos->config()->publishConfig('app.yml', 'DEFAULT_GROUP', 'server:\n port: 8080', 'yaml'); // 获取配置 $content = $nacos->config()->getConfig('app.json', 'DEFAULT_GROUP'); // 返回: '{"db":"mysql"}'(字符串,不会被解析为数组) // 监听配置变更 $nacos->config()->listenConfig('app.yml', 'DEFAULT_GROUP', function ($data) { echo "配置已变更: " . json_encode($data); }, 30);
服务发现
// 注册服务实例 bool $nacos->discovery()->registerInstance( string $serviceName, // 服务名 string $ip, // 实例 IP int $port, // 实例端口 string $group = 'DEFAULT_GROUP', // 分组名 array $metadata = [], // 元数据(键值对) int $weight = 1, // 权重 bool $ephemeral = true // true=临时实例 false=持久化实例 ); // 注销服务实例 bool $nacos->discovery()->deregisterInstance( string $serviceName, string $ip, int $port, string $group = 'DEFAULT_GROUP', bool $ephemeral = true ); // 获取所有实例 array $nacos->discovery()->getAllInstances( string $serviceName, string $group = 'DEFAULT_GROUP', bool $healthyOnly = true ); // 选择一个健康实例 ?array $nacos->discovery()->selectOneHealthyInstance( string $serviceName, string $group = 'DEFAULT_GROUP' ); // 发送心跳(临时实例保活) bool $nacos->discovery()->sendHeartbeat( string $serviceName, string $ip, int $port, string $group = 'DEFAULT_GROUP' );
使用示例:
// 注册临时实例(推荐) $nacos->discovery()->registerInstance( 'user-service', '127.0.0.1', 8080, 'DEFAULT_GROUP', ['version' => '1.0.0'], 10, true ); // 注册持久化实例 $nacos->discovery()->registerInstance( 'user-service', '127.0.0.1', 8081, 'DEFAULT_GROUP', [], 5, false ); // 注销实例 $nacos->discovery()->deregisterInstance('user-service', '127.0.0.1', 8080, 'DEFAULT_GROUP', true); // 获取所有实例(含不健康) $instances = $nacos->discovery()->getAllInstances('user-service', 'DEFAULT_GROUP', false); // $instances['hosts'] 为实例数组 // 选择一个健康实例(随机负载均衡) $instance = $nacos->discovery()->selectOneHealthyInstance('user-service'); // $instance['ip'], $instance['port'], $instance['metadata'] // 发送心跳 $nacos->discovery()->sendHeartbeat('user-service', '127.0.0.1', 8080);
服务调用
// GET 请求 array $nacos->invoker()->get( string $serviceName, string $path, // 接口路径 array $params = [], // 查询参数 string $group = 'DEFAULT_GROUP', int $retryCount = 3 // 重试次数 ); // POST 请求 array $nacos->invoker()->post( string $serviceName, string $path, array $data = [], // 请求体(JSON) string $group = 'DEFAULT_GROUP', int $retryCount = 3 ); // 通用请求 array $nacos->invoker()->request( string $method, // HTTP 方法:GET/POST/PUT/DELETE/PATCH string $serviceName, string $path, array $data = [], string $group = 'DEFAULT_GROUP', int $retryCount = 3 ); // 获取健康实例(30 秒缓存) ?array $nacos->invoker()->getHealthyInstance( string $serviceName, string $group = 'DEFAULT_GROUP' ); // 构建服务 URL string $nacos->invoker()->buildUrl( array|Instance $instance, // 实例信息 string $path = '/' // 接口路径 ); // 清除缓存 $nacos->invoker()->clearCache(?string $serviceName = null, string $group = 'DEFAULT_GROUP');
使用示例:
// GET 调用 $result = $nacos->invoker()->get('user-service', '/api/users', ['page' => 1]); // POST 调用 $result = $nacos->invoker()->post('user-service', '/api/users', ['name' => 'test']); // 获取健康实例 $instance = $nacos->invoker()->getHealthyInstance('user-service'); // 构建服务 URL(不发送请求) $url = $nacos->invoker()->buildUrl($instance, '/api/users'); // http://127.0.0.1:8080/api/users // 清除缓存 $nacos->invoker()->clearCache('user-service'); // 指定服务 $nacos->invoker()->clearCache(); // 所有服务
响应结构:
[
'success' => true,
'status_code' => 200,
'data' => [...], // JSON 解码后的数据
'raw' => '...', // 原始响应体
]
Feign 声明式客户端
// 创建 Feign 客户端(自动缓存,同服务名+分组复用实例) FeignClient $nacos->feign( string $serviceName, string $groupName = 'DEFAULT_GROUP' ); // Feign 客户端方法 array $feign->get(string $path, array $params = [], int $retryCount = 3); array $feign->post(string $path, array $data = [], int $retryCount = 3); array $feign->put(string $path, array $data = [], int $retryCount = 3); array $feign->delete(string $path, array $params = [], int $retryCount = 3); array $feign->request(string $method, string $path, array $data = [], int $retryCount = 3);
使用示例:
// 创建 Feign 客户端 $userClient = $nacos->feign('user-service'); $orderClient = $nacos->feign('order-service', 'PROD_GROUP'); // 声明式调用 $users = $userClient->get('/api/users', ['page' => 1]); $result = $userClient->post('/api/users', ['name' => 'test']); $result = $userClient->put('/api/users/1', ['name' => 'updated']); $result = $userClient->delete('/api/users/1'); // 自定义重试次数 $result = $userClient->get('/api/users', [], 5); // 同时使用多个 Feign 客户端 $productClient = $nacos->feign('product-service'); $products = $productClient->get('/api/products');
gRPC 客户端
SDK 自动检测 gRPC 扩展和服务可用性,优先使用 gRPC,不可用时自动降级为 HTTP。
// 检查 gRPC 可用性 bool $nacos->grpc()->isGrpcAvailable(); // gRPC 客户端自动共享 NacosClient 的 accessToken ?NacosClient $nacos->grpc()->getHttpClient(); // 重置可用性缓存(强制下次重新检测) $nacos->grpc()->resetAvailabilityCache();
使用示例:
// 检测 gRPC 是否可用 if ($nacos->grpc()->isGrpcAvailable()) { echo "gRPC 可用,配置和服务操作将优先走 gRPC 通道\n"; } else { echo "gRPC 不可用,自动使用 HTTP 通道\n"; } // 验证 Token 共享 $httpClient = $nacos->grpc()->getHttpClient(); if ($httpClient) { echo "accessToken: " . substr($httpClient->getAccessToken(), 0, 16) . "...\n"; }
无需额外代码,配置管理和服务发现操作会自动优先走 gRPC 通道。
领域模型
use Nacos\Model\Instance; use Nacos\Model\Config; use Nacos\Model\Service; // ── Instance 模型 ── // 从 Nacos 响应数组创建 $instance = Instance::fromArray([ 'serviceName' => 'my-service', 'ip' => '192.168.1.1', 'port' => 8080, 'metadata' => ['secure' => 'true'], ]); // 直接构造 $instance = new Instance( string $serviceName, string $ip, int $port, string $groupName = 'DEFAULT_GROUP', array $metadata = [], int $weight = 1, bool $ephemeral = true, string $namespaceId = 'public' ); // 常用方法 $instance->isSecure(); // bool — metadata 中 secure=true 时返回 true $instance->buildUrl('/api/test'); // string — 自动根据 secure 选择 http/https $instance->toRequestParams(); // array — 转换为 API 请求参数 $instance->toArray(); // array — 序列化为数组 // ── Config 模型 ── // 从 Nacos 响应数组创建 $config = Config::fromArray([ 'dataId' => 'app.yml', 'group' => 'PROD_GROUP', 'content' => 'key: value', 'type' => 'yaml', ]); // 直接构造 $config = new Config( string $dataId, string $group = 'DEFAULT_GROUP', string $content = '', string $type = 'text' ); // 常用方法 $config->setContent('new content'); // 自动更新 md5 $config->getMd5(); // string — 内容的 MD5 哈希 $config->parseContentAsArray(); // ?array — JSON 内容自动解析为数组 $config->toRequestParams(); // array — 转换为 API 请求参数 $config->toArray(); // array — 序列化为数组 // ── Service 模型 ── $service = Service::fromArray([ 'serviceName' => 'my-svc', 'groupName' => 'TEST_GROUP', 'protectThreshold' => 0.5, ]); $service->getServiceName(); // string $service->getGroupName(); // string $service->getProtectThreshold(); // float $service->toArray(); // array
项目结构
src/
├── Client/
│ ├── NacosClient.php # HTTP 客户端(认证、请求、Token 管理)
│ └── NacosGrpcClient.php # gRPC 客户端(可用性检测、Token 共享)
├── Config/
│ └── ConfigClient.php # 配置管理(发布 / 获取 / 删除 / 监听)
├── Discovery/
│ └── DiscoveryClient.php # 服务发现(注册 / 注销 / 查询 / 心跳)
├── Model/
│ ├── Instance.php # 服务实例模型
│ ├── Config.php # 配置模型
│ └── Service.php # 服务模型
├── Utils/
│ ├── ServiceInvoker.php # 服务调用(发现 + 调用 + 缓存 + 重试)
│ └── FeignClient.php # Feign 声明式客户端
├── Exception/
│ └── NacosException.php # 异常类
└── Nacos.php # 主入口
通信策略
┌──────────────┐ gRPC 可用 ┌──────────────┐
│ │ ─────────────────→ │ gRPC 9848 │
│ SDK 调用 │ └──────────────┘
│ │ gRPC 不可用 ┌──────────────┐
│ │ ─────────────────→ │ HTTP 8848 │
└──────────────┘ └──────────────┘
所有配置管理和服务发现操作自动遵循此策略,开发者无需手动切换。
认证方式
| 方式 | 配置 | 适用场景 |
|---|---|---|
| 用户名密码 | 构造函数传入 username / password |
自建 Nacos 集群 |
| AK/SK | 构造函数传入 accessKey / secretKey |
阿里云 MSE 等托管服务 |
两种方式可以同时配置,SDK 会按需使用。用户名密码认证会自动登录获取 accessToken 并定期刷新;gRPC 客户端自动共享 HTTP 客户端的 accessToken。
注意事项
-
命名空间
public:Nacos 的public命名空间实际 ID 为空字符串,SDK 内部自动处理,用户传入'public'即可。 -
JSON 格式配置:
getConfig()使用原始响应体获取配置内容,不会将 JSON 格式的配置误解析为数组。 -
持久化实例:Nacos standalone 模式下持久化实例可能因 Raft 一致性限制返回 500 错误,这是 Nacos 服务端已知问题,集群模式不受影响。
-
gRPC 扩展:gRPC 通道需要安装
grpc和protobufPHP 扩展。未安装时 SDK 自动降级为 HTTP,不影响功能使用。 -
服务调用缓存:
ServiceInvoker默认缓存健康实例 30 秒,可通过clearCache()手动清除。
许可证
MIT License
Nacos SDK for PHP
PHP SDK for Nacos service discovery and configuration management.
安装
composer require ssh/nacos-sdk-php
功能特性
-
配置管理
- 发布配置
- 获取配置
- 删除配置
- 监听配置变更
-
服务发现
- 注册服务实例(支持临时和持久化服务)
- 注销服务实例
- 获取服务实例列表
- 获取单个健康实例
- 发送心跳(临时服务)
-
服务调用
- 自动获取健康服务实例
- 支持GET/POST等HTTP方法
- 服务实例缓存(30秒)
- 自动重试机制(默认3次)
- 支持HTTPS(通过元数据配置)
-
Feign风格声明式客户端
- 声明式API调用,类似OpenFeign
- 自动服务发现和HTTP调用
- 简单易用,减少样板代码
- 支持缓存多个Feign客户端
-
gRPC支持(Nacos 2.x/3.x)
- 支持 Nacos 9848 端口的 gRPC 服务
- 自动检测 gRPC 服务可用性
- 优先使用 gRPC,HTTP 作为后备方案
- 支持配置管理和服务发现的所有功能
使用方法
初始化客户端
use Nacos\Nacos; // 初始化Nacos客户端 $nacos = new Nacos( 'http://localhost:8848', // Nacos服务器地址 'public', // 命名空间ID,默认为'public' '', // Access Key(可选) '', // Secret Key(可选) 9848, // gRPC端口(可选,默认9848) null // 日志接口(可选,实现Psr\Log\LoggerInterface) );
配置管理
1. 发布配置
// 发布配置 $result = $nacos->config()->publishConfig( 'test-config', // dataId 'DEFAULT_GROUP', // group 'Hello Nacos!', // 配置内容 'text' // 配置类型 ); if ($result) { echo "配置发布成功!\n"; }
2. 获取配置
// 获取配置 $content = $nacos->config()->getConfig( 'test-config', // dataId 'DEFAULT_GROUP' // group ); echo "配置内容: " . $content . "\n";
3. 删除配置
// 删除配置 $result = $nacos->config()->deleteConfig( 'test-config', // dataId 'DEFAULT_GROUP' // group ); if ($result) { echo "配置删除成功!\n"; }
4. 监听配置变更
// 监听配置变更(长轮询) $nacos->config()->listenConfig( 'test-config', // dataId 'DEFAULT_GROUP', // group function($data) { // 回调函数 echo "配置变更了!\n"; echo "变更数据: " . json_encode($data) . "\n"; }, 30 // 超时时间(秒) );
服务发现
1. 注册服务实例
// 注册持久化服务实例 $result = $nacos->discovery()->registerInstance( 'user-service', // 服务名 '127.0.0.1', // IP地址 8080, // 端口 'DEFAULT_GROUP', // 分组 ['version' => '1.0.0'], // 元数据 10, // 权重 false // 是否为临时服务(false表示持久化) ); if ($result) { echo "服务注册成功!\n"; }
2. 注销服务实例
// 注销服务实例 $result = $nacos->discovery()->deregisterInstance( 'user-service', // 服务名 '127.0.0.1', // IP地址 8080, // 端口 'DEFAULT_GROUP' // 分组 ); if ($result) { echo "服务注销成功!\n"; }
3. 获取所有服务实例
// 获取所有服务实例 $instances = $nacos->discovery()->getAllInstances( 'user-service', // 服务名 'DEFAULT_GROUP', // 分组 true // 是否只获取健康实例 ); echo "实例数量: " . count($instances['hosts']) . "\n"; echo "实例列表: " . json_encode($instances, JSON_PRETTY_PRINT) . "\n";
4. 获取单个健康实例
// 获取单个健康实例 $instance = $nacos->discovery()->selectOneHealthyInstance( 'user-service', // 服务名 'DEFAULT_GROUP' // 分组 ); if ($instance) { echo "健康实例: " . json_encode($instance) . "\n"; echo "IP: " . $instance['ip'] . "\n"; echo "端口: " . $instance['port'] . "\n"; }
服务调用
1. 调用服务(GET方法)
// 调用服务的GET接口 $result = $nacos->invoker()->get( 'user-service', // 服务名 '/api/users', // 接口路径 ['page' => 1, 'limit' => 10], // 查询参数 'DEFAULT_GROUP', // 分组(可选) 3 // 重试次数(可选) ); // 处理响应 if ($result['success']) { echo "状态码: " . $result['status_code'] . "\n"; echo "数据: " . json_encode($result['data']) . "\n"; echo "原始响应: " . $result['raw'] . "\n"; }
2. 调用服务(POST方法)
// 调用服务的POST接口 $result = $nacos->invoker()->post( 'user-service', // 服务名 '/api/users', // 接口路径 [ // 请求数据 'name' => '张三', 'email' => 'zhangsan@example.com', 'age' => 25 ], 'DEFAULT_GROUP', // 分组(可选) 3 // 重试次数(可选) );
3. 调用服务(通用方法)
// 调用服务的PUT接口 $result = $nacos->invoker()->request( 'PUT', // HTTP方法 'user-service', // 服务名 '/api/users/1', // 接口路径 ['name' => '更新后的名字'], // 请求数据 'DEFAULT_GROUP', // 分组(可选) 3 // 重试次数(可选) );
4. 获取健康实例
// 单独获取健康实例 $instance = $nacos->invoker()->getHealthyInstance( 'user-service', 'DEFAULT_GROUP' ); if ($instance) { echo "找到健康实例!\n"; echo "IP: " . $instance['ip'] . "\n"; echo "端口: " . $instance['port'] . "\n"; echo "元数据: " . json_encode($instance['metadata']) . "\n"; }
5. 构建服务URL
// 构建服务URL(不发送请求) $instance = $nacos->invoker()->getHealthyInstance('user-service'); if ($instance) { $url = $nacos->invoker()->buildUrl($instance, '/api/users'); echo "服务URL: " . $url . "\n"; // 输出: http://127.0.0.1:8080/api/users }
6. 清除缓存
// 清除指定服务的缓存 $nacos->invoker()->clearCache('user-service'); // 清除所有服务的缓存 $nacos->invoker()->clearCache();
7. 配置HTTPS
在注册服务时,通过元数据设置secure为true来启用HTTPS:
// 注册HTTPS服务 $nacos->discovery()->registerInstance( 'secure-service', '127.0.0.1', 443, 'DEFAULT_GROUP', ['secure' => 'true'] // 标记为安全服务 ); // 调用时会自动使用HTTPS $result = $nacos->invoker()->get('secure-service', '/api/data');
Feign风格声明式客户端
FeignClient提供了声明式的API调用方式,类似Java的OpenFeign,让服务调用更加简单直观。
1. 创建Feign客户端
// 创建Feign客户端(声明式) $userClient = $nacos->feign('user-service'); // 指定分组 $orderClient = $nacos->feign('order-service', 'DEFAULT_GROUP');
2. GET请求
// 获取用户列表 $result = $userClient->get('/api/users', [ 'page' => 1, 'limit' => 10 ]); // 处理响应 if ($result['success']) { echo "状态码: " . $result['status_code'] . "\n"; echo "用户列表: " . json_encode($result['data']) . "\n"; }
3. POST请求
// 创建用户 $result = $userClient->post('/api/users', [ 'name' => '张三', 'email' => 'zhangsan@example.com', 'age' => 25 ]); if ($result['success']) { echo "创建用户成功,ID: " . $result['data']['id'] . "\n"; }
4. PUT请求
// 更新用户 $result = $userClient->put('/api/users/1', [ 'name' => '更新后的名字', 'email' => 'updated@example.com' ]);
5. DELETE请求
// 删除用户 $result = $userClient->delete('/api/users/1');
6. 通用请求方法
// 使用任意HTTP方法 $result = $userClient->request('PATCH', '/api/users/1', [ 'status' => 'active' ]);
7. 自定义重试次数
// 自定义重试次数(默认3次) $result = $userClient->get('/api/users', ['page' => 1], 5);
8. 同时使用多个Feign客户端
// 为不同服务创建不同的Feign客户端 $userClient = $nacos->feign('user-service'); $orderClient = $nacos->feign('order-service'); $productClient = $nacos->feign('product-service'); // 调用不同的服务 $users = $userClient->get('/api/users'); $orders = $orderClient->get('/api/orders'); $products = $productClient->get('/api/products');
9. FeignClient与ServiceInvoker对比
ServiceInvoker方式:
$result = $nacos->invoker()->get('user-service', '/api/users', ['page' => 1]);
FeignClient方式(推荐):
$userClient = $nacos->feign('user-service'); $result = $userClient->get('/api/users', ['page' => 1]);
FeignClient方式更加简洁,不需要每次都指定服务名,代码更易读。
gRPC功能使用
SDK 支持 Nacos 9848 端口的 gRPC 服务,可以通过 gRPC 协议与 Nacos 服务器通信,获得更好的性能。
1. 使用 gRPC 客户端
// 获取 gRPC 客户端 $grpcClient = $nacos->grpc(); // 检查 gRPC 服务是否可用 if ($grpcClient->isAvailable()) { echo "gRPC 服务可用!\n"; } else { echo "gRPC 服务不可用,将使用 HTTP 协议\n"; }
2. 使用 gRPC 进行配置管理
// 发布配置(通过 gRPC) $result = $nacos->config()->publishConfig( 'test-config', 'DEFAULT_GROUP', 'Hello Nacos gRPC!' ); // 获取配置(通过 gRPC) $content = $nacos->config()->getConfig( 'test-config', 'DEFAULT_GROUP' ); // 删除配置(通过 gRPC) $result = $nacos->config()->deleteConfig( 'test-config', 'DEFAULT_GROUP' );
3. 使用 gRPC 进行服务发现
// 注册服务实例(通过 gRPC) $result = $nacos->discovery()->registerInstance( 'user-service', '127.0.0.1', 8080, 'DEFAULT_GROUP', ['version' => '1.0.0'], 10, true ); // 获取服务实例(通过 gRPC) $instances = $nacos->discovery()->getAllInstances( 'user-service', 'DEFAULT_GROUP', true ); // 注销服务实例(通过 gRPC) $result = $nacos->discovery()->deregisterInstance( 'user-service', '127.0.0.1', 8080, 'DEFAULT_GROUP' );
注意:SDK 会自动检测 gRPC 服务可用性。如果 gRPC 服务不可用,会自动回退到 HTTP 协议,确保功能正常。
测试
SDK提供了完整的测试脚本:
分步测试
php test-step-by-step.php
这个脚本会依次测试所有功能:
- 配置管理:发布、获取、删除配置
- 服务发现:注册、获取实例列表、获取健康实例、注销
配置监听测试
php test-config-listener.php
这个脚本会演示如何监听配置变更。
gRPC 功能测试
php test-grpc.php
这个脚本会测试 gRPC 客户端功能,包括:
- gRPC 服务可用性检测
- 配置管理(发布、获取、删除)
- 服务发现(注册、获取实例、注销)
系统要求
- PHP >= 7.2
- GuzzleHTTP >= 7.0
- PSR-Log >= 1.1
- Symfony OptionsResolver >= 5.0
- gRPC扩展(可选,用于使用gRPC协议)
- Protobuf扩展(可选,用于使用gRPC协议)
启动Nacos服务器
要完全测试SDK功能,需要启动Nacos服务器:
- 下载Nacos服务器:https://github.com/alibaba/nacos/releases
- 解压并运行:
# Linux/Mac sh startup.sh -m standalone # Windows cmd startup.cmd -m standalone
- 访问 http://localhost:8848/nacos 确认服务器运行
- 默认用户名:nacos
- 默认密码:nacos
项目结构
nacos-sdk/
├── src/
│ ├── Client/
│ │ ├── NacosClient.php # 核心HTTP客户端
│ │ └── NacosGrpcClient.php # gRPC客户端
│ ├── Config/
│ │ └── ConfigClient.php # 配置管理客户端
│ ├── Discovery/
│ │ └── DiscoveryClient.php # 服务发现客户端
│ ├── Utils/
│ │ ├── ServiceInvoker.php # 服务调用工具类
│ │ └── FeignClient.php # Feign风格声明式客户端
│ ├── Exception/
│ │ └── NacosException.php # 异常类
│ └── Nacos.php # 主入口类
├── composer.json # Composer配置
├── README.md # 使用说明
├── nacos_grpc_service.proto # gRPC服务定义
├── test-step-by-step.php # 分步测试脚本
├── test-service-invoker.php # 服务调用测试脚本
├── test-feign.php # Feign客户端测试脚本
├── test-config-listener.php # 配置监听测试脚本
└── test-grpc.php # gRPC功能测试脚本
许可证
MIT License