fuermao / eureka_php
使用eureka服务注册PHP服务
Requires
- php: >=7.1
- guzzlehttp/guzzle: ^6.3
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");