eureka-js-client:Nodejs 与 Java 的通讯

eureka-js-client (opens new window)Eureka (opens new window) 客户端的JavaScript实现。

Eureka是一种RESTful(表现层状态转化)服务,主要用于AWS云中,用于中间层服务器的发现、负载平衡和故障转移。它在Netflix中端基础设施中发挥着关键作用。

image from dependency

# 使用方法

# 安装

npm install eureka-js-client --save

#Nodejs应用中加入Eureka客户端

import Eureka from 'eureka-js-client';

// Or, if you're not using a transpiler:
const Eureka = require('eureka-js-client').Eureka;

// example configuration
const client = new Eureka({
  // application instance information
  instance: {
    app: 'jqservice',
    hostName: 'localhost',
    ipAddr: '127.0.0.1',
    port: 8080,
    vipAddress: 'jq.test.something.com',
    dataCenterInfo: {
      name: 'MyOwn',
    },
  },
  eureka: {
    // eureka server host / port
    host: '192.168.99.100',
    port: 32768,
  },
});

Eureka会在当前工作目录下搜索eureka-client.yml这个配置文件,更进一步地,Eureka会根据不同的环境来覆盖eureka-client.yml,比如测试环境eureka-client-test.yml就会覆盖eureka-client.yml

当前环境是开发环境还是生产环境取决于环境变量。环境变量优先级的顺序:EUREKA_ENV --> NODE_ENV -> development (默认)

传递给Eureka构造函数的选项将会覆盖配置文件中的值。

你可以配置自定义的目录来加载配置文件,在传递给Eureka构造函数的选项中加上cwd属性就可以实现。

const client = new Eureka({
  cwd: `${__dirname}/config`,
});

# 注册Eureka,开始应该心跳

client.start();

# 取消注册,停止心跳

client.stop();

# 自定义请求中间件

eureka客户端可以修改发送到eureka请求 (opens new window)选项对象,并且这种修改的优先级高于eureka的调用。当添加权限验证比如OAuth或者其他自定义请求头时,这是很有用的。每个eureka请求都会调用这个函数,因此它强烈建议对中间件中任何长期存在的外部调用进行缓存或记忆。如果中间件返回的不是对象,则eureka请求将立即失败,并执行重试,如果有配置重试。

const client = new Eureka({
  requestMiddleware: (requestOpts, done) => {
    requestOpts.auth = {
      user: 'username',
      password: 'yourpassword'
    };
    done(requestOpts)
  }
})

#AWS环境配置

对于AWS环境(dataCenterInfo.name == 'Amazon'),客户端具有请求Eureka服务器所需的AWS元数据的内置逻辑。查看详情 (opens new window)

// example configuration for AWS
const client = new Eureka({
  // application instance information
  instance: {
    app: 'jqservice',
    port: 8080,
    vipAddress: 'jq.test.something.com',
    statusPageUrl: 'http://__HOST__:8080/info',
    healthCheckUrl: 'http://__HOST__:8077/healthcheck',
    homePageUrl: 'http://__HOST__:8080/',
    dataCenterInfo: {
      name: 'Amazon',
    },
  },
  eureka: {
    // eureka server host / port / EC2 region
    host: 'eureka.test.mydomain.com',
    port: 80,
  },
});

注意:

  1. 在此配置下,实例hostNameipAddr将被设置为AWS元数据提供的公共host和公共IP。你可以设置eureka.useLocalMetadata设置为true以使用私有主机和私有IP地址代替。
  2. 如果需要使用IP地址作为主机名进行注册,请设置eureka.preferIpAddresstrue。这可能与eureka.useLocalMetadata结合使用用于选择私有或公有IP
  3. 对于status和healthcheck url,您可以从元数据中使用__HOST__替换来作为主机。
  4. 如果你想在AWS环境中提供自己的元数据,可以通过将config.eureka.fetchMetadata设置为false来禁用元数据获取。

#DNS来查找Eureka服务器

如果你有多个可用性区域,并且根据Wiki文章EC2中部署Eureka服务器 (opens new window)设置了DNS条目,那么您需要将config.eureka.useDns设置为true并将config.eureka.ec2Region添加到当前区域(通常可以通过环境变量将其注入应用程序,或者在启动时直接传入)。

这将导致客户端使用config.eureka.hostconfig.eureka.ec2Region执行DNS查找。上面的Wiki文章还描述了DNS TXT记录的命名约定。只要DNS记录符合相同的约定,这个特性也可以在非ec2环境中工作。默认情况下,DNS解析结果缓存在内存中,每5分钟刷新一次(设置config.eureka.clusterRefreshInterval来覆盖)。

# 地区亲和力

默认情况下,客户端将首先尝试连接与当前所在可用性区域相同的Eureka服务器。如果在实例元数据中没有设置availability-zone,那么将选择一个随机服务器。这也适用于静态配置集群(由zone映射,参见下面)。要禁用该特性,请将config.eureka.preferSameZone设置为false,然后将选择一个随机服务器。

# 配置静态的服务器列表

虽然推荐使用DNS(上面介绍的)方法来解析Eureka集群,但你也可以按区域静态配置Eureka服务器列表,或者只使用简单的默认列表。在使用这种方法时,请确保提供完整的协议、主机、端口和Eureka REST服务(通常是/apps/)的路径。

# 静态集群配置(按区域映射)

const client = new Eureka({
  instance: {
    ... // application instance information
  },
  eureka: {
    availabilityZones: {
      'us-east-1': ['us-east-1c', 'us-east-1d', 'us-east-1e']
    },
    serviceUrls: {
      'us-east-1c': [
        'http://ec2-fake-552-627-568-165.compute-1.amazonaws.com:7001/eureka/v2/apps/',
        'http://ec2-fake-368-101-182-134.compute-1.amazonaws.com:7001/eureka/v2/apps/'
      ],
      'us-east-1d': [...],
      'us-east-1e': [...]
    }
  },
});

# 静态集群配置(列表)

const client = new Eureka({
  instance: {
    ... // application instance information
  },
  eureka: {
    serviceUrls: {
      default: [
        'http://ec2-fake-552-627-568-165.compute-1.amazonaws.com:7001/eureka/v2/apps/',
        'http://ec2-fake-368-101-182-134.compute-1.amazonaws.com:7001/eureka/v2/apps/'
      ]
    }
  },
});

# 高级配置选项

选项 默认值 描述
requestMiddleware noop 自定义中间件函数来修改发送到eureka请求 (opens new window)选项
logger console logging eureka客户端中日志的实现
shouldUseDelta false 实验模式, 在更新时从eureka而不是完整注册表中获取增量
eureka.maxRetries 3 所有请求重试发送到 eureka的次数
eureka.requestRetryDelay 500 重试之间等待的毫秒数。这将乘以失败的重试次数。
eureka.heartbeatInterval 30000 心跳之间间隔的毫秒数
eureka.registryFetchInterval 30000 获取注册表之间等待的毫秒数
eureka.registerWithEureka true 是否开启Eureka注册
eureka.fetchRegistry true 是否开启获取注册表
eureka.filterUpInstances true 是否开启实例过滤,通过status === UP
eureka.servicePath /eureka/v2/apps/ eureka REST服务的路径
eureka.ssl false 是否开启ssleureka服务器的交互
eureka.useDns false 通过DNS来查找Eureka服务器,详情 (opens new window)
eureka.preferSameZone true 定位Eureka服务器时启用/禁用区域亲和性
eureka.clusterRefreshInterval 300000 刷新集群主机之间等待的毫秒数(仅DNS解析)
eureka.fetchMetadata true AWS环境中获取AWS元数据,详情 (opens new window)
eureka.useLocalMetadata false AWS环境中使用元数据中的本地IP和本地主机名
eureka.preferIpAddress false AWS环境中使用IP地址(本地或公共)作为注册主机名

# 事件

Eureka客户端是EventEmitter的一个实例,提供了以下事件供消费:

event 提供的数据 描述
started N/A eureka客户端完全注册并更新所有注册表时触发。
registered N/A eureka客户端注册到eureka是触发
deregistered N/A eureka客户端取消注册时触发
heartbeat N/A eureka客户端成功更新与eureka的租约时触发。
registryUpdated N/A eureka客户端已成功更新其注册表时触发