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-09-04 09:10:26 UTC


README

Consul PHP SDK 是一个围绕 Consul HTTP API 的薄封装。

兼容性

查看 README.md 的早期版本以找到与旧版本的 symfony/http-client 或 guzzle 兼容的版本

安装

此库可以使用 composer 安装

composer require friendsofphp/consul-php-sdk

支持的服务

  • agent
  • catalog
  • health
  • kv
  • session
  • txn

用法

实例化一个服务,并开始使用它

$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