fuermao/eureka_php

使用eureka服务注册PHP服务

V0.0.2 2020-01-07 06:48 UTC

This package is not auto-updated.

Last update: 2024-09-26 03:38:58 UTC


README

说明

该版本是在piwvh/php-eureka基础上进行了一些配置优化。

使用说明

安装

使用composer依赖管理工具进行安装即可;

composer require "yckj/eureka_php"

使用

该组件基本未改变原始用法,仅增加了日志记录功能。可参考原作者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)
  • overriddenStatus (默认: UNKNOWN)
  • 端口号
  • securePort (默认: ['443', false])
  • countryId (默认: 1)
  • dataCenterInfo (默认: ['com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo', 'MyOwn'])
  • 主页URL
  • 状态页URL
  • 健康检查URL
  • vip地址
  • secureVipAddress
  • heartbeatInterval (默认: 30)
  • discoveryStrategy (默认: RandomStrategy)
  • 实例提供者

您也可以在创建EurekaClient实例后通过setter方法更改配置

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

发现策略

当从Eureka获取服务的实例时,您可能会得到一个已注册到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的接口,您可以利用它。您应该实现此接口的getInstance()方法,并根据您的理想逻辑返回服务的实例。

class MyProvider implements InstanceProvider {

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

在此示例中,我们将服务的实例缓存在数据库中,并在Eureka不可用时从数据库中检索它们。

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

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

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

这就是全部内容。通过添加此功能,即使Eureka关闭,您的应用程序也可以继续运行。

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

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