无法使用 JS 客户端从 Eureka 服务器检索实例
Unable to retrieve instance from Eureka server using JS client
我在尝试获取由 eureka 发现的服务 URL 时遇到问题。
我正在使用 eureka-js-client 连接到 Eureka,出于测试目的,我创建了两个微服务,我将其命名为:ms1 和 ms2.
我试过的是:
- 启动 Eureka 服务器以允许服务注册到其中
- 启动ms1并注册到Eureka
- 启动ms2,注册到Eureka并获取ms1 URL.
为了实现这一点,我使用 @EnableEurekaServer
作为 Spring 引导应用程序启动了尤里卡服务器。这部分工作正常,我可以访问 http://localhost:8761/
并查看仪表板。
然后,在我的微服务中我有这个配置
this._client = new Eureka({
instance: {
app: 'ms1',
instanceId: 'ms1',
hostName: 'localhost',
ipAddr: '127.0.0.1',
statusPageUrl: `http://localhost:${port ? port : this._port}`,
healthCheckUrl: `http://localhost:${port? port : this._port}/health`,
port: {
'$': port? port: this._port,
'@enabled': true,
},
vipAddress: 'myvip',
dataCenterInfo: {
'@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
name: 'MyOwn',
},
},
eureka: {
host: 'localhost',
port: 8761,
servicePath: '/eureka/apps/'
},
})
同样 ms2 更改名称。
当我 运行 输出 registered with eureka: ms1/ms1
的项目时,服务似乎已在 eureka 中正确注册:
但现在的问题是试图获取两个服务之一的URL。从这两个服务中的任何一个,如果我尝试获取 Eureka 实例,我总是得到一个空列表。
我有这个代码:
let instances: any = this.getClient().getInstancesByAppId(microserviceName);
let instance = null;
let url = ''
if (instances != null && instances.length > 0) {
instance = instances[0];
let protocol = instance.securePort["@enabled"] == "true" ? "https" : "http";
url = `${protocol}//${instance.ipAddr}:${instance.port.$}/`
}
我在“microserviceName”变量中尝试过的位置:
- “ms1”
- “MS1”
- "ms1/ms1"
但响应始终是一个空数组,输出为:
Unable to retrieve instances for appId: ms1
所以,问题是什么?我错过了什么吗?我认为流程是正确的:
- 启动尤里卡服务器。
- 将服务注册到服务器。
- 在服务器中查找实例。
提前致谢。
终于解决了我自己的问题。一切正常,ms2
能够使用我发布的代码找到 ms1
,所以问题是:
我的 ms2
文件是这样的:
EurekaService.getClient().start()
EurekaService.getUrl('ms1')
EurekaService.getClient()?.stop()
而且似乎 EurekaService.getClient().start()
直到它结束(或可用或其他)才阻塞,所以客户端没有启动并且无法获取实例 ms1
.
请注意,方法 getUrl()
具有 OP 中提供的代码:
let instances: any = this.getClient().getInstancesByAppId(microserviceName);
let instance = null;
...
所以我把代码改成了这样:
start()
async function start(){
EurekaService.getClient().start()
await new Promise(f => setTimeout(f, 1000));
const url = EurekaService.getUrl('ms1')
console.log("url = ",url)
EurekaService.getClient()?.stop()
}
并且完美运行,输出日志为:
registered with eureka: ms2/ms2
url = http//127.0.0.1:8002/
de-registered with eureka: ms2/ms2
所以,start
方法不是async
,所以我不能使用await
或.then()
,我必须设置超时并等待完成。
我不知道是否有更好的方法来做到这一点,或者架构的性质无法控制何时可用。
顺便说一句,对我来说,1 秒超时就足够了。
我在尝试获取由 eureka 发现的服务 URL 时遇到问题。
我正在使用 eureka-js-client 连接到 Eureka,出于测试目的,我创建了两个微服务,我将其命名为:ms1 和 ms2.
我试过的是:
- 启动 Eureka 服务器以允许服务注册到其中
- 启动ms1并注册到Eureka
- 启动ms2,注册到Eureka并获取ms1 URL.
为了实现这一点,我使用 @EnableEurekaServer
作为 Spring 引导应用程序启动了尤里卡服务器。这部分工作正常,我可以访问 http://localhost:8761/
并查看仪表板。
然后,在我的微服务中我有这个配置
this._client = new Eureka({
instance: {
app: 'ms1',
instanceId: 'ms1',
hostName: 'localhost',
ipAddr: '127.0.0.1',
statusPageUrl: `http://localhost:${port ? port : this._port}`,
healthCheckUrl: `http://localhost:${port? port : this._port}/health`,
port: {
'$': port? port: this._port,
'@enabled': true,
},
vipAddress: 'myvip',
dataCenterInfo: {
'@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
name: 'MyOwn',
},
},
eureka: {
host: 'localhost',
port: 8761,
servicePath: '/eureka/apps/'
},
})
同样 ms2 更改名称。
当我 运行 输出 registered with eureka: ms1/ms1
的项目时,服务似乎已在 eureka 中正确注册:
但现在的问题是试图获取两个服务之一的URL。从这两个服务中的任何一个,如果我尝试获取 Eureka 实例,我总是得到一个空列表。
我有这个代码:
let instances: any = this.getClient().getInstancesByAppId(microserviceName);
let instance = null;
let url = ''
if (instances != null && instances.length > 0) {
instance = instances[0];
let protocol = instance.securePort["@enabled"] == "true" ? "https" : "http";
url = `${protocol}//${instance.ipAddr}:${instance.port.$}/`
}
我在“microserviceName”变量中尝试过的位置:
- “ms1”
- “MS1”
- "ms1/ms1"
但响应始终是一个空数组,输出为:
Unable to retrieve instances for appId: ms1
所以,问题是什么?我错过了什么吗?我认为流程是正确的:
- 启动尤里卡服务器。
- 将服务注册到服务器。
- 在服务器中查找实例。
提前致谢。
终于解决了我自己的问题。一切正常,ms2
能够使用我发布的代码找到 ms1
,所以问题是:
我的 ms2
文件是这样的:
EurekaService.getClient().start()
EurekaService.getUrl('ms1')
EurekaService.getClient()?.stop()
而且似乎 EurekaService.getClient().start()
直到它结束(或可用或其他)才阻塞,所以客户端没有启动并且无法获取实例 ms1
.
请注意,方法 getUrl()
具有 OP 中提供的代码:
let instances: any = this.getClient().getInstancesByAppId(microserviceName);
let instance = null;
...
所以我把代码改成了这样:
start()
async function start(){
EurekaService.getClient().start()
await new Promise(f => setTimeout(f, 1000));
const url = EurekaService.getUrl('ms1')
console.log("url = ",url)
EurekaService.getClient()?.stop()
}
并且完美运行,输出日志为:
registered with eureka: ms2/ms2
url = http//127.0.0.1:8002/
de-registered with eureka: ms2/ms2
所以,start
方法不是async
,所以我不能使用await
或.then()
,我必须设置超时并等待完成。
我不知道是否有更好的方法来做到这一点,或者架构的性质无法控制何时可用。
顺便说一句,对我来说,1 秒超时就足够了。