无法通过 Spring Cloud Gateway + Eureka 访问 NodeJS 微服务

Can't reach NodeJS microservice through Spring Cloud Gateway + Eureka

我在后端使用微服务架构,其中我使用 TypeScript 创建服务,其他服务使用 Java。我还有一个 Spring 网关和一个 Eureka 服务器(都使用 Spring)。

然后,Gateway 工作正常,Eureka 工作正常,其他用 Java 编写的微服务也工作正常。问题是当我尝试通过网关访问 TypeScript 微服务时。

我有一个简单的 Eureka 服务器,使用 Spring 中的注释 @EnableEurekaServer

还有一个作为客户端连接到 Eureka 的网关,其中 yaml 包含以下部分:

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
        - id: ms1
          uri: lb://ms1
          predicates:
            - Path=/ms1/**
        - id: ms2
          uri: lb://ms2
          predicates:
            - Path=/ms2/**

有了这个网关,我想有两条路由/ms1/ms2来访问微服务1(用TS编写)或微服务2(用Java编写)。

当我运行所有服务时,Eureka是这样显示的:

您可以看到 gatewayms1ms2。但是,为什么 Java 服务有 192.168.8.121 而 TS 服务没有?

顺便说一句,链接工作正常,每个服务都路由到存在的端口,网关和 Java 微服务路由到 <gateway_url>:<service_port>/actuator/info,TypeScript 微服务路由到 localhost:<service_port>.

微服务2就是这么简单:

@RestController
public class Controller {
    @GetMapping("/hello-world")
    public ResponseEntity<String> getHi() {
        return ResponseEntity.ok("hi");
    }
}

也变成application.yml:

spring:
  application:
    name: ms2

但是 TS 微服务使用 eureka-js-client 这个配置:

this._client = new Eureka({
                instance: {
                    app: 'ms1',
                    instanceId: 'ms1',
                    hostName: 'localhost',
                    ipAddr: '127.0.0.1',
                    statusPageUrl: `http://localhost:8081`,
                    healthCheckUrl: `http://localhost:8081/health`,
                    port: {
                        '$': 8081,
                        '@enabled': true,
                    },
                    vipAddress: 'myvip',
                    dataCenterInfo: {
                        '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
                        name: 'MyOwn',
                    },
                },
                eureka: {
                    host: 'localhost',
                    port: 8761,
                    servicePath: '/eureka/apps/'
                },
            })

所以,我的想法是:

第二个工作正常,但是路由 http://192.168.8.121:8762/ms1/hello-world returns 503 错误:

Whitelabel Error Page

This application has no configured error view, so you are seeing this as a fallback.
Mon May 16 19:02:56 CEST 2022
[fa1d8857-5] There was an unexpected error (type=Service Unavailable, status=503).

控制台显示 No servers available for service: ms1

所以我不知道我是否误解了什么,eureka-js-client 的名字是 ms1。 LB 用于该服务...但它不起作用。

正如我所说,使用 Java 服务工作正常,所以问题可能出在服务连接到 Eureka 的方式、使用的名称或类似名称?但是在仪表板中它显示为 MS1MS2 所以我很困惑...

提前致谢

解决了我的问题,这是一件很奇怪的事情。

我的vipAddress不正确。似乎 Spring Cloud Gateway 检查 instance.vipAddress 而不是 instance.app

所以用 ms1 替换 myvip 效果很好。