sensiolabs/consul-php-sdk

此包已被弃用,不再维护。作者建议使用 friendsofphp/consul-php-sdk 包。

与 consul.io API 通信的 SDK

v5.2.0 2024-03-04 08:03 UTC

This package is auto-updated.

Last update: 2024-03-04 08:05:11 UTC


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