apu / php-eureka-server
Spring Cloud Eureka 发现服务器的 PHP 客户端。
Requires
- php: >=5.4.0
- guzzlehttp/guzzle: ^6.3|^7.0.1
This package is auto-updated.
Last update: 2024-09-15 14:23:02 UTC
README
Spring Cloud Netflix Eureka 服务的注册和发现 PHP 客户端。
安装
您可以使用 Composer 安装此包
composer require apu/php-eureka-server
文档
创建 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' 'additionalHeaders' = [], ]);
以下是可以用的所有配置项:
eurekaDefaultUrl(默认:https://:8761);hostNameappNameipstatus(默认:UP)overriddenStatus(默认:UNKNOWN)portsecurePort(默认:['443', false])countryId(默认:1)dataCenterInfo(默认:['com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo', 'MyOwn'])homePageUrlstatusPageUrlhealthCheckUrlvipAddresssecureVipAddressheartbeatInterval(默认:30)discoveryStrategy(默认:RandomStrategy)instanceProvideradditionalHeaders
您也可以在创建 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");