digidip / url-rewriter
带有熔断器的 digidip URL 重写器。
v0.3.0
2020-01-23 15:40 UTC
Requires
- php: >=7.2
- guzzlehttp/guzzle: ^6.5
- psr/log: ^1.1
Requires (Dev)
- mockery/mockery: ^1.3
- phpunit/phpunit: ~8.5
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 请求超时并被视为服务失败之前的时间(毫秒)。默认值:1000CircuitBreaker::OPTION_FAILURE_THRESHOLD
- 必须发生失败的数量,才能打开电路。 默认值:5CircuitBreaker::OPTION_OPENED_SAMPLE_RATE
- 在检测到单个失败后,轮询服务可用性的时间(秒)。 默认值:1CircuitBreaker::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 实例)