服务发现: Node.js + Eureka

基于 Node.js 和 Eureka 的完整示例,涵盖了服务的注册、获取服务列表、监听服务变化,以及定期更新健康状态到 Eureka。

安装依赖

首先,安装所需的 Node.js 包,包括 Eureka 的客户端库和一个 HTTP 请求库:

npm install eureka-js-client express axios

完整示例代码

以下示例代码展示了如何注册服务到 Eureka,获取服务列表,定期更新健康状态,以及监听服务变化(通过轮询获取服务列表变化)。

const express = require('express');
const Eureka = require('eureka-js-client').Eureka;
const axios = require('axios');

const app = express();
const port = 3000;

const eurekaClient = new Eureka({
  // Eureka server's host and port
  // Replace with your Eureka server address
  instance: {
    app: 'my-service',
    instanceId: 'my-service-id',
    hostName: 'localhost',
    ipAddr: '127.0.0.1',
    port: {
      '$': port,
      '@enabled': true
    },
    vipAddress: 'my-service',
    secureVipAddress: 'my-service',
    dataCenterInfo: {
      '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
      name: 'MyOwn'
    },
    statusPageUrl: `http://localhost:${port}/info`,
    healthCheckUrl: `http://localhost:${port}/health`,
    homePageUrl: `http://localhost:${port}/`,
    leaseInfo: {
      renewalIntervalInSecs: 30,
      durationInSecs: 90
    }
  },
  eureka: {
    // Eureka server URL
    // Replace with your Eureka server address
    host: 'localhost',
    port: 8761,
    servicePath: '/eureka/apps/'
  }
});

// 注册服务到 Eureka
function registerService() {
  eurekaClient.start((error) => {
    if (error) {
      console.error('Failed to register service:', error);
    } else {
      console.log('Service registered with Eureka');
      startHealthCheck();
      loadServices();
    }
  });
}

// 健康检查路由
app.get('/health', (req, res) => {
  res.send('Service is up and running');
});

// 启动服务
app.listen(port, () => {
  console.log(`Service running on port ${port}`);
  registerService();
});

// 定期更新健康状态到 Eureka
function startHealthCheck() {
  setInterval(async () => {
    try {
      await axios.get(`http://localhost:${port}/health`);
      console.log('Service health check passed');
    } catch (error) {
      console.error('Service health check failed:', error);
    }
  }, 30000); // 每30秒检查一次
}

// 获取服务列表
async function loadServices() {
  try {
    const response = await axios.get(`http://localhost:8761/eureka/apps/my-service`);
    const services = response.data;
    console.log('Service list:', services);
  } catch (error) {
    console.error('Failed to get service list:', error);
  }
}

// 监听服务变化
function watchServiceChanges() {
  // 通过定时轮询服务列表
  setInterval(async () => {
    try {
      const response = await axios.get(`http://localhost:8761/eureka/apps/my-service`);
      const services = response.data;
      console.log('Updated service list:', services);
    } catch (error) {
      console.error('Failed to get updated service list:', error);
    }
  }, 30000); // 每30秒轮询一次
}

// 启动服务变化监听
watchServiceChanges();
说明
  1. 健康检查端点:
  • 使用 Express.js 创建了一个 /health 路由,用于检查服务是否正常。
  1. 注册服务:
  • 使用 eureka-js-client 库将服务注册到 Eureka。Eureka 客户端配置包括服务的基本信息,如 app 名称、端口、健康检查 URL 等。
  1. 定期更新健康状态:
  • 使用 setInterval 每30秒检查一次服务的健康状态,确保 Eureka 服务器上的服务状态是最新的。
  1. 获取服务列表:
  • 通过 HTTP 请求从 Eureka 获取服务列表,并打印到控制台。
  1. 监听服务变化:
  • 通过定时轮询服务列表的方式来监听服务变化。虽然 Eureka 没有内置的事件机制来监听服务变化,但轮询可以有效地检测服务的变化。

启动 Eureka 服务器

确保你已经启动了 Eureka 服务器。你可以使用 Spring Boot 来运行 Eureka 服务器,或者使用现有的 Eureka 实例。如果你使用 Spring Boot,可以通过以下命令启动 Eureka 服务器:

mvn spring-boot:run

总结

这个示例展示了如何在 Node.js 应用中实现服务的注册、健康检查、获取服务列表和监听服务变化。通过这种方式,你可以确保服务列表和健康状态在 Eureka 中始终是最新的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值