so-php/service-registry

本软件包最新版本(0.0.2-alpha)没有可用的许可证信息。

服务注册实现

0.0.2-alpha 2014-06-16 06:06 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:17:38 UTC


README

基于 php-amqplib 和 Zookeeper php 扩展构建的服务注册库。

服务注册模式

为了解释服务注册模式,让我们看看程序员如何在一些典型场景下利用一个服务。

无服务注册模式

使用本地可用的服务

$service = new Service();
$service->method();

使用远程可用的服务

$rpc = new XmlRpc('path/to/service/descriptor.wsdl');
$rpc->call('method');

使用可能远程和本地都可用的服务

if(class_exists('Service')){
    $service = new Service();
    $service->method();
} else {
    $rpc = new XmlRpc('path/to/service/descriptor.wsdl');
    $rpc->call('method');
}

使用多个远程服务提供的服务,例如使用负载均衡或 A/B 测试来选择远程提供商

??? what?

不幸的是,这种类型的操作甚至无法用足够简单的方式进行伪编码,以提供示例。实际上,并没有实现此类功能的通用方法——如果您想在应用程序中添加此类行为,您将不得不自己处理。

服务注册模式

让我们看看服务注册模式如何简化这些场景。

使用本地可用的服务

$service = ServiceRegistry::getInstance('Service');
$service->method();

使用远程可用的服务

$service = ServiceRegistry::getInstance('Service');
$service->method();

使用可能远程和本地都可用的服务

$service = ServiceRegistry::getInstance('Service');
$service->method();

使用多个远程服务提供的服务,例如使用负载均衡或 A/B 测试来选择远程提供商

ServiceRegistry::setStrategy(new RoundRobin());
// or:  ServiceRegistry::setStrategy(new FirstAvailable());
// or:  ServiceRegistry::setStrategy(new ABTesting());

$service = ServiceRegistry::getInstance('Service');
$service->method();

注意,在这些场景中,程序员都面临着对 Service 的完全相同的用法。

因此,简单地说,服务注册模式是一种注册服务实例(无论是本地还是远程)的方法。然后,您可以要求注册表提供这些实例之一的一个引用。

现在,服务注册模式解决了更多尚未涉及的问题。例如,能够为服务提供多个(不同的)实现,或者提供任何给定实现的多个版本。许多有趣的事情,我们在这里不会详细说明。

Service Registry 库本身提供了对该模式的实现,该实现协调注册、注销和提供本地或远程的服务实例的机制。如果选择的服务实例是远程可用的,它会隐藏这种复杂性。它无形中提供了一个完美的代理,完美映射服务接口,这样您就可以像处理常规服务实例一样处理它。

操作原理

正如其名称所暗示的,模式的一个必要条件是跟踪服务(这些服务可能在多个不同的进程和服务器中实例化)。除了维护这些服务的列表之外,可能还需要在实例引用代理和远程服务器上的实际实例之间协调远程过程调用 (RPC)。

服务注册通过 Zookeeper 实现,每个实例的注册存储在临时节点下。

RPC 通过 Active MQ 协议 (AMQP) 在 php-amqplib(专门针对 RabbitMQ)之上提供。