piwvh/php-eureka

Spring Cloud Eureka 发现服务器的 PHP 客户端。

0.0.3 2022-08-21 15:53 UTC

This package is not auto-updated.

Last update: 2024-09-21 19:09:09 UTC


README

Spring Cloud Netflix Eureka 服务注册和发现的 PHP 客户端。

安装

您可以使用 Composer 安装此包

composer require "piwvh/php-eureka"

文档

创建 Eureka 客户端

您需要做的第一件事是使用自己的配置创建 EurekaClient 的实例

$client = new EurekaClient([
    'eurekaDefaultUrl' => 'https://:8761/eureka',
    'hostName' => 'service.hamid.work',
    'appName' => 'service',
    'ip' => '127.0.0.1',
    'port' => ['8080', true],
    'homePageUrl' => 'https://:8080',
    'statusPageUrl' => 'https://:8080/info',
    'healthCheckUrl' => 'https://:8080/health'
]);

所有可用的配置如下

  • eurekaDefaultUrl (默认: https://:8761);
  • 主机名
  • 应用名
  • IP
  • 状态 (默认: UP)
  • 覆盖状态 (默认: UNKNOWN)
  • 端口
  • 安全端口 (默认: ['443', false])
  • 国家ID (默认: 1)
  • 数据中心信息 (默认: ['com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo', 'MyOwn'])
  • 主页URL
  • 状态页URL
  • 健康检查URL
  • 虚拟IP地址
  • 安全虚拟IP地址
  • 心跳间隔 (默认: 30)
  • 发现策略 (默认: RandomStrategy)
  • 实例提供者

您也可以在创建 EurekaClient 实例后使用设置方法更改配置

$client->getConfig()->setAppName("my-service");

操作

创建 EurekaClient 实例后,将执行多个操作

  • 注册:将服务实例注册到 Eureka
$client->register();
  • 注销:从 Eureka 注销服务实例
$client->deRegister();
  • 心跳:向 Eureka 发送心跳,以显示客户端正在运行(一次性心跳)
$client->heartbeat();

您可以使用 start() 方法注册实例并定期发送心跳

$client->start();

使用此方法,首先您的服务使用您提供的配置注册到 Eureka。然后,将根据 heartbeatInterval 配置值定期向 Eureka 发送心跳。此间隔时间可以像任何其他配置项一样更改

$client->getConfig()->setHeartbeatInterval(60); // 60 seconds

显然,此方法应在 CLI 中使用。

  • 服务发现:从 Eureka 获取服务的实例
$instance = $client->fetchInstance("the-service");
$homePageUrl = $instance->homePageUrl;

发现策略

当从 Eureka 获取服务的实例时,您可能会得到一个可用的实例列表。您可以根据您想要的负载均衡策略选择其中一个。例如,轮询或随机策略可能是您的选择。

目前,此库仅支持 RandomStrategy,但是您可以创建自己的策略,通过实现 DiscoveryStrategy 接口的 getInstance() 方法

class RoundRobinStrategy implements DiscoveryStrategy {

    public function getInstance($instances) {
        // return an instance
    }
    
}

然后,您只需将您的自定义策略引入 EurekaClient 实例即可

$client->getConfig()->setDiscoveryStrategy(new RoundRobinStrategy());

本地注册表和缓存

失败是不可避免的,特别是在云原生应用程序中。因此,有时由于故障,Eureka 可能不可用。在这些情况下,我们应该有一个本地服务注册表以避免级联故障。

默认情况下,如果 Eureka 不可用,则 fetchInstance() 方法失败,因此会抛出异常,并且应用程序无法继续工作。为了解决这个问题,您应该创建一个服务本地注册表。

有一个名为 InstanceProvider 的接口,您可以通过实现此接口的 getInstances() 方法并返回基于您理想逻辑的服务实例来使用它。

class MyProvider implements InstanceProvider {

    public function getInstances($appName) { 
        // return cached instances of the service from the Redis 
    }
}

在此示例中,我们已将服务的实例缓存在 Redis 中,并在 Eureka 不可用时加载它们。

创建您的自定义提供者后,只需将其添加到配置中即可使其工作

$client->getConfig()->setInstanceProvider(new MyProvider());

您的自定义提供者仅在 Eureka 不可用或未正确响应时才会被调用。

这就是你需要做的全部。通过添加这个功能,即使Eureka服务停止,你的应用也能继续运行。

为了缓存特定服务的所有实例,你可以调用fetchInstances()方法,该方法从Eureka获取服务的所有实例。

$instances = $client->fetchInstances("the-service");