InstanceBeatProcess.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * This file is part of Hyperf.
  5. *
  6. * @link https://www.hyperf.io
  7. * @document https://hyperf.wiki
  8. * @contact group@hyperf.io
  9. * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
  10. */
  11. namespace Hyperf\ServiceGovernanceNacos\Process;
  12. use Hyperf\Contract\ConfigInterface;
  13. use Hyperf\Contract\IPReaderInterface;
  14. use Hyperf\Contract\StdoutLoggerInterface;
  15. use Hyperf\Nacos\Application;
  16. use Hyperf\Process\AbstractProcess;
  17. use Hyperf\Process\ProcessManager;
  18. class InstanceBeatProcess extends AbstractProcess
  19. {
  20. public string $name = 'nacos-heartbeat';
  21. public function handle(): void
  22. {
  23. $config = $this->container->get(ConfigInterface::class);
  24. $logger = $this->container->get(StdoutLoggerInterface::class);
  25. $client = $this->container->get(Application::class);
  26. $serviceConfig = $config->get('nacos.service', []);
  27. $serviceName = $serviceConfig['service_name'];
  28. $namespaceId = $serviceConfig['namespace_id'];
  29. $groupName = $serviceConfig['group_name'] ?? null;
  30. $instanceConfig = $serviceConfig['instance'] ?? [];
  31. $ephemeral = $instanceConfig['ephemeral'] ?? null;
  32. $cluster = $instanceConfig['cluster'] ?? null;
  33. $weight = $instanceConfig['weight'] ?? null;
  34. $ipReader = $this->container->get(IPReaderInterface::class);
  35. $ip = $ipReader->read();
  36. while (ProcessManager::isRunning()) {
  37. $heartbeat = $config->get('nacos.service.instance.heartbeat', 5);
  38. sleep($heartbeat ?: 5);
  39. $ports = $config->get('server.servers', []);
  40. foreach ($ports as $portServer) {
  41. $port = (int) $portServer['port'];
  42. $response = $client->instance->beat(
  43. $serviceName,
  44. [
  45. 'ip' => $ip,
  46. 'port' => $port,
  47. 'serviceName' => $groupName . '@@' . $serviceName,
  48. 'cluster' => $cluster,
  49. 'weight' => $weight,
  50. ],
  51. $groupName,
  52. $namespaceId,
  53. $ephemeral
  54. );
  55. if ($response->getStatusCode() === 200) {
  56. $logger->debug(sprintf('Instance %s:%d heartbeat successfully!', $ip, $port));
  57. } else {
  58. $logger->error(sprintf('Instance %s:%d heartbeat failed!', $ip, $port));
  59. }
  60. }
  61. }
  62. }
  63. public function isEnable($server): bool
  64. {
  65. $config = $this->container->get(ConfigInterface::class);
  66. return $config->get('nacos.service.enable', true) && $config->get('nacos.service.instance.heartbeat', 0);
  67. }
  68. }