无法通过 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是这样显示的:
您可以看到 gateway
、ms1
和 ms2
。但是,为什么 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/'
},
})
所以,我的想法是:
- 当我点击
<gateway_url>:<gateway_port>/ms1/hello-world
时,会出现来自 TypeScript 微服务的数据。
- 当我点击
<gateway_url>:<gateway_port>/ms2/hello-world
时,会出现来自 Java 微服务的数据。
第二个工作正常,但是路由 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 的方式、使用的名称或类似名称?但是在仪表板中它显示为 MS1
和 MS2
所以我很困惑...
提前致谢
解决了我的问题,这是一件很奇怪的事情。
我的vipAddress
不正确。似乎 Spring Cloud Gateway 检查 instance.vipAddress
而不是 instance.app
。
所以用 ms1
替换 myvip
效果很好。
我在后端使用微服务架构,其中我使用 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是这样显示的:
您可以看到 gateway
、ms1
和 ms2
。但是,为什么 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/'
},
})
所以,我的想法是:
- 当我点击
<gateway_url>:<gateway_port>/ms1/hello-world
时,会出现来自 TypeScript 微服务的数据。 - 当我点击
<gateway_url>:<gateway_port>/ms2/hello-world
时,会出现来自 Java 微服务的数据。
第二个工作正常,但是路由 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 的方式、使用的名称或类似名称?但是在仪表板中它显示为 MS1
和 MS2
所以我很困惑...
提前致谢
解决了我的问题,这是一件很奇怪的事情。
我的vipAddress
不正确。似乎 Spring Cloud Gateway 检查 instance.vipAddress
而不是 instance.app
。
所以用 ms1
替换 myvip
效果很好。