eureka-js-client

npm version Build Status Coverage Status Dependency Status bitHound Overall Score

Eureka ( https://github.com/Netflix/eureka ) 客户端的JavaScript实现,Netflix 操作系统 服务注册表。

用法

首先,将 MODULE 安装到 node 项目中:


npm install eureka-js-client --save

将尤里卡客户端添加到 node 应用程序。

尤里卡 MODULE 导出了一个可以构造的JavaScript函数。


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,


 },


});

尤里卡客户端在当前工作目录中搜索YAML文件 eureka-client.yml 它进一步搜索环境特定的YAML文件中的环境特定替代( 比如 。 eureka-client-test.yml ) 。环境通常是 development 或者 production,并由 NODE_ENV 环境变量决定。 传递给构造函数的选项覆盖配置文件中设置的任何值。

在传递给 Eureka 构造函数的对象中指定 cwd 选项,你可以配置自定义目录来加载配置文件。


const client = new Eureka({


 cwd: `${__dirname}/config`,


});

如果愿意,还可以覆盖使用 filename 属性加载的文件的NAME 。 你可以混合使用 cwdfilename 选项。


const client = new Eureka({


 filename: 'eureka',


 cwd: `${__dirname}/config`,


});

带有尤里卡&启动应用程序心跳的 register


client.start();

带有尤里卡&停止应用心跳的寄存器


client.stop();

通过 APP ID 获取实例


const instances = client.getInstancesByAppId('YOURSERVICE');

通过Vip地址获取实例


const instances = client.getInstancesByVipAddress('YOURSERVICEVIP');

提供定制请求中间件

客户端暴露了在尤里卡调用之前修改传出请求选项对象的能力。 这在添加诸如OAuth之类的认证方法或者其他自定义头时很有用。 这将在每个尤里卡请求上调用,因此强烈建议在中间件中进行的任何长期的外部调用都是缓存或者 memoized 。 如果中间件返回对象以外的任何东西,尤里卡请求将立即失败,并在配置后执行重试。


// example using middleware to set-up HTTP authentication


const client = new Eureka({


 requestMiddleware: (requestOpts, done) => {


 requestOpts.auth = {


 user: 'username',


 password: 'somepassword'


 };


 done(requestOpts);


 }


});

为AWS环境配置

对于AWS环境,客户机构建了逻辑来请求AWS元数据,这是尤里卡服务器需要的。 有关更多信息,请参见尤里卡REST架构插件。


// 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,


 },


});

注释:

使用DNS查找尤里卡服务器

如果你在EC2项目中设置了多个可用性区域,并且你的DNS项目根据Wiki部署 Eureka-Servers,你将希望设置 config.eureka.useDnstrue 并将 config.eureka.ec2Region 设置为当前区域。

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

非全局区域关联

默认情况下,客户端首先尝试连接到位于同一可以用区域中的is服务器。 如果在实例元数据中没有设置 availability-zone,将选择一个随机服务器。 在静态配置群集( 按区域映射,请参见下面) 时也适用这里。 要禁用这里功能,将 config.eureka.preferSameZone 设置为 false,并选择一个随机服务器。

静态配置尤里卡服务器列表

推荐解决尤里卡集群的方法是使用 DNS,你也可以通过区域或者简单的缺省列表静态配置尤里卡服务器列表。 请确保在使用这里方法时提供了Eureka服务( 通常 /apps/ )的完整协议。主机。端口和路径。

static 群集配置( 按区域映射)

// example configuration for AWS (static map of Eureka cluster by availability-zone)


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': [...]


 }


 },


});

static 集群配置( 列表)

// example configuration (static list of Eureka cluster servers)


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 定制中间件功能来修改传出请求到尤里卡
logger 控制台日志记录 要使用的客户端的记录器实现
shouldUseDelta false 从尤里卡获取增量的实验模式,而不是在更新时
eureka.maxRetries 3 重新尝试所有请求到尤里卡的次数
eureka.requestRetryDelay 500 重试之间等待的毫秒数。 这将乘以失败重试的# 。
eureka.heartbeatInterval 30000 心跳之间等待的毫秒数
eureka.registryFetchInterval 30000 注册表获取之间等待的毫秒数
eureka.registerWithEureka true 启用/禁用尤里卡注册
eureka.fetchRegistry true 启用/禁用注册表获取
eureka.filterUpInstances true 启用/禁用对状态 === UP的实例筛选
eureka.servicePath /eureka/v2/apps/ 尤里卡REST服务的路径
eureka.ssl false 启用与尤里卡服务器的SSL通信
eureka.useDns false 在使用DNS查找尤里卡服务器时,请参阅使用DNS服务器查找AWS中的尤里卡服务器。
eureka.preferSameZone true 在定位尤里卡服务器时启用/禁用区域关联
eureka.clusterRefreshInterval 300000 刷新群集主机之间的毫秒数( 仅适用于DNS解析)
eureka.fetchMetadata true 在AWS环境中获取AWS元数据时,请参见AWS环境的配置。
eureka.useLocalMetadata false AWS环境中使用元数据时使用本地IP和本地主机名。
eureka.preferIpAddress false 使用IP地址( 本地或者 public ) 作为AWS环境中注册的主机名。

事件

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

事件数据提供描述
started n/a 当尤里卡客户端完全注册并且所有注册都已经更新时激发。
registered n/a 当尤里卡客户端注册尤里卡时激发。
deregistered n/a 当尤里卡客户端取消注册尤里卡时激发。
heartbeat n/a 当尤里卡客户成功地续订了尤里卡的租约时激发。
registryUpdated n/a 当尤里卡客户端成功更新它的注册表时激发。

命令行调试

库在所有服务调用中都使用 ,在启动 node 时,通过传递 NODE_DEBUG=request 可以打开调试。 这允许你再次检查被调用的URL以及其他请求属性。


NODE_DEBUG=request node example.js


还可以通过将日志级别设置为调试,在库中启用调试:


client.logger.level('debug');

已知问题

来自尤里卡服务器的错误请求错误

Eureka的版本需要在注册时使用稍微不同的JSON POST体。 如果注册时看到 400错误,可以能是配置问题,它可以能是格式差异 below 。 历史 behind 这还不清楚,这里有一个讨论 主要区别如下:

有关示例,请参见 below:


const client = new Eureka({


 // application instance information


 instance: {


 app: 'jqservice',


 hostName: 'localhost',


 ipAddr: '127.0.0.1',


 port: {


 '$': 8080,


 '@enabled': true,


 },


 vipAddress: 'jq.test.something.com',


 dataCenterInfo: {


 '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',


 name: 'MyOwn',


 },


 },


 eureka: {


 // eureka server host/port


 host: '192.168.99.100',


 port: 32768,


 },


});

如果你打算连接AWS中的尤里卡服务,你需要添加相应的dataCenterInfo 信息:


 dataCenterInfo: {


 '@class': 'com.netflix.appinfo.AmazonInfo',


 name: 'Amazon',


 }

404没有发现来自尤里卡服务器的错误

这可能意味着Eureka服务位于你环境中的不同路径上。 默认值为 http://<EUREKA_HOST>/eureka/v2/apps 但是,根据你的设置,你可能需要将 eureka.servicePath 中的设置为其他路径。 REST服务可能挂在 /eureka/apps/ 或者 /apps/ 下。

与云的使用

如果你使用 spring 云,你可能需要以下设置:

下面是一个应该与 spring 云尤里卡服务器一起使用的配置示例:


const client = new Eureka({


 instance: {


 app: 'jqservice',


 hostName: 'localhost',


 ipAddr: '127.0.0.1',


 statusPageUrl: 'http://localhost:8080/info',


 port: {


 '$': 8080,


 '@enabled': 'true',


 },


 vipAddress: 'jq.test.something.com',


 dataCenterInfo: {


 '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',


 name: 'MyOwn',


 },


 },


 eureka: {


 host: '192.168.99.100',


 port: 32768,


 servicePath: '/eureka/apps/'


 },


});

测试

对 MODULE的测试使用 mocha 和chain编写。 若要运行单元测试,可以使用吞咽 test 任务:


gulp test

如果要让测试观察 src/test/ 目录进行更改,可以以使用 test:watch 吞吐任务:


gulp test:watch