无法使用 JS 客户端从 Eureka 服务器检索实例

Unable to retrieve instance from Eureka server using JS client

我在尝试获取由 eureka 发现的服务 URL 时遇到问题。

我正在使用 eureka-js-client 连接到 Eureka,出于测试目的,我创建了两个微服务,我将其命名为:ms1ms2.

我试过的是:

为了实现这一点,我使用 @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”变量中尝试过的位置:

但响应始终是一个空数组,输出为:

Unable to retrieve instances for appId: ms1

所以,问题是什么?我错过了什么吗?我认为流程是正确的:

  1. 启动尤里卡服务器。
  2. 将服务注册到服务器。
  3. 在服务器中查找实例。

提前致谢。

终于解决了我自己的问题。一切正常,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 秒超时就足够了。