sensiolabs / consul-php-sdk
v5.2.0
2024-03-04 08:03 UTC
Requires
- php: >=8.1
- psr/log: ^1|^2|^3
- symfony/http-client: ^5.4|^6.4|^7.0
Requires (Dev)
- symfony/phpunit-bridge: ^6.0|^7.0
README
Consul PHP SDK 是对 Consul HTTP API 的轻量级封装。
兼容性
查看 README.md 的上一个版本,以找到与旧版 symfony/http-client 或 guzzle 兼容的版本。
安装
此库可以使用 composer 安装
composer require friendsofphp/consul-php-sdk
支持的服务
- agent
- 目录
- 健康
- kv
- 会话
- 事务
用法
实例化一个服务,并开始使用它
$kv = new Consul\Services\KV(); $kv->put('test/foo/bar', 'bazinga'); $kv->get('test/foo/bar', ['raw' => true]); $kv->delete('test/foo/bar');
服务公开了一些从 consul API 映射的方法
所有服务方法遵循相同的约定
$response = $service->method($mandatoryArgument, $someOptions);
- 所有 API 必须的参数都放在第一个位置;
- 所有 API 可选参数直接映射自
$someOptions
; - 所有方法返回一个
Consul\ConsulResponse
; - 如果 API 返回 4xx 响应,则抛出
Consul\Exception\ClientException
; - 如果 API 返回 5xx 响应,则抛出
Consul\Exception\ServeException
。
食谱
如何获取一个排他锁?
$session = new Consul\Services\Session(); $sessionId = $session->create()->json()['ID']; // Lock a key / value with the current session $lockAcquired = $kv->put('tests/session/a-lock', 'a value', ['acquire' => $sessionId])->json(); if (false === $lockAcquired) { $session->destroy($sessionId); echo "The lock is already acquire by another node.\n"; exit(1); } echo "Do you jobs here...."; sleep(5); echo "End\n"; $kv->delete('tests/session/a-lock'); $session->destroy($sessionId);
如何使用 MultiLockHandler?
$resources = ['resource1', 'resource2']; $multiLockHandler = new MultiLockHandler($resources, 60, new Session(), new KV(), 'my/lock/'); if ($multiLockHandler->lock()) { try { echo "Do you jobs here...."; } finally { $multiLockHandler->release(); } }
如何使用 MultiSemaphore?
$resources = [ new Resource('resource1', 2, 7), new Resource('resource2', 3, 6), new Resource('resource3', 1, 1), ]; $semaphore = new MultiSemaphore($resources, 60, new Session(), new KV(), 'my/semaphore'); if ($semaphore->acquire()) { try { echo "Do you jobs here...."; } finally { $semaphore->release(); } }
一些实用工具
Consul\Helper\LockHandler
: 实现分布式锁的简单类Consul\Helper\MultiLockHandler
: 实现多个资源分布式锁的简单类Consul\Helper\MultiSemaphore
: 实现多个资源分布式信号量的简单类
运行测试套件
您需要一个在 localhost:8500
上运行的 consul 代理。
但您可以覆盖此地址
export CONSUL_HTTP_ADDR=172.17.0.2:8500
如果您不想本地安装 Consul,可以使用 docker 容器
docker run -d --name=dev-consul -e CONSUL_BIND_INTERFACE=eth0 consul
然后,运行测试套件
vendor/bin/simple-phpunit