digidip/url-rewriter

带有熔断器的 digidip URL 重写器。

v0.3.0 2020-01-23 15:40 UTC

This package is auto-updated.

Last update: 2024-09-15 16:58:56 UTC


README

该库是为了允许 digidip 客户将他们的联盟 URL 重写为 digidip 联盟 URL 以进行跟踪购买等。该库利用熔断器方法来帮助减少在服务器或网络问题存在时通过 digidip 服务器重定向的用户数量。当检测到服务器中断时,熔断器将打开,所有重写的 URL 都将返回给库的原始 URL。

如果熔断器打开,这意味着交易不能通过 digidip 进行跟踪,尽管大多数用户将经历将页面重定向到商家页面的积极操作,而不是遇到错误页面。

安装

您可以通过 Composer 安装 UrlRewriter

composer require digidip/url-rewriter

依赖项

如果您想使用 Memcached 或 Redis 适配器,您必须安装相应的 PECL 扩展

  • Redis (pecl install redis)
  • Memcached (pecl install memcached)

示例

// Basic example of the implementation.

$redis = new \Redis();
$redis->connect('....');

$adapter = new RedisCircuitBreakerAdapter($redis);
$circuit = new CircuitBreaker($adapter);
$rewriter = new UrlRewriter($circuit, new DigidipSubdomainRewriterStrategy('mydomain'));

$url = $rewriter->getUrl('http://www.merchant.com');

// ... $url is used elsewhere as part of your implementation...

更多信息请查看示例目录。

关键概念

  • 熔断器模式 的解释。
  • 当失败计数为零时,则电路被认为是 关闭 的。
  • 当失败计数大于零但小于失败阈值时,电路被认为是 半开 的。
  • 当失败计数大于零且等于失败阈值时,电路被认为是 打开 的。
  • 当电路是 关闭半开 时,UrlRewriter 理论上将 https://mymerchant.com 转换为 http://visit.digidip.net/visit?url=http%3A%2F%2Fmymerchant.com
  • 当电路是 打开 时,UrlRewriter 将简单地返回 https://mymerchant.com,不使用任何重写策略。

Url Writer

此类用于将熔断器和 URL 写入策略绑定在一起,理想情况下,您只需在与现有代码库交互时与此类交互。有关可用策略,请参阅下面的 Url Writer 策略

use digidip\UrlRewriter;

$urlRewriter = new UrlRewriter(
    // ... CircuitBreaker $circuitBreaker,
    // ... RewriterStrategy $strategy,
    // ... LoggerInterface $logger = null       (PSR Logger Instance)
);

$url = $urlRewriter->getUrl('https://www.a-merchant.com/'); // Return a URL whiuch is defined by the <Method>RewriterStrategy.

熔断器

熔断器类负责决定 URL 重写器是否应执行 URL 重写。其最小要求是一个适配器,该适配器为熔断器提供与外部存储资源(例如文件、Redis、Memcache 或任何可以通过 CircuitBreakerAdapter 接口实现的定制方法)通信的机制。有关可用适配器,请参阅下面的 熔断器适配器

use digidip\CircuitBreaker;
use digidip\Adapters\FilePathCircuitBreakerAdapter;

$adapter = new FilePathCircuitBreakerAdapter('/path/to/file.json');
$circuit = new CircuitBreaker(
    $adapter,
    // ... ?array $options = [],
    // ... ?string $url = null,                 For testing purposes
    // ... ?Client $client = null,              For testing purposes
    // ... ?LoggerInterface $logger = null      (PSR Logger Instance)
);

熔断器选项 (?array $options = [])

  • CircuitBreaker::OPTION_TIMEOUT - 在 HTTP 请求超时并被视为服务失败之前的时间(毫秒)。默认值:1000
  • CircuitBreaker::OPTION_FAILURE_THRESHOLD - 必须发生失败的数量,才能打开电路。 默认值:5
  • CircuitBreaker::OPTION_OPENED_SAMPLE_RATE - 在检测到单个失败后,轮询服务可用性的时间(秒)。 默认值:1
  • CircuitBreaker::OPTION_CLOSED_SAMPLE_RATE - 在未检测到失败时轮询服务可用性的时间(秒)。 默认值:5

Url Writer 策略

当前可用的策略包括

  • 标准 Digidip 重写器策略 - DigidipRewriterStrategy(pid)
  • 基于子域的 Digidip 重写器策略 - DigidipSubdomainRewriterStrategy(subdomain)
  • 模板重写器 - TemplateRewriterStrategy(url template)

熔断器适配器

当前可用的适配器包括

  • 文件路径 - FilePathCircuitBreakerAdapter(filepath)
  • 文件读取器和写入器接口 - FileCircuitBreakerAdapter(Reader, Writer),请参考 src/Modules/Filesystem 获取可用的读取器和写入器。
  • Redis - RedisCircuitBreakerAdapter(\Redis 实例)
  • Memcached - MemcachedCircuitBreakerAdapter(\Memcached 实例)