Spring 客户端无法注册 Eureka (MiniShift)

Spring client cannot register with Eureka (MiniShift)

我的 Spring Eureka 服务器 YAML 配置。这是

spring:
  application:
    name: discovery-service

eureka:
  instance:
    hostname: spring-cloud-gateway.discovery.svc    # it should be service url in openshift cluster.
  client:
    eureka-server-connect-timeout-seconds: 5
    enabled: true
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
  port: 8761

我使用显示在 OpenShift 控制台上的服务器 URL。

selectors:
    app=spring-cloud-gateway, deploymentconfig=spring-cloud-gateway 
Type:
    ClusterIP
IP:
    172.30.167.146
Hostname:
    spring-cloud-gateway.discovery.svc 
Session affinity:
    None

显示eureka服务器状态的日志是这样的。

2019-08-21 09:01:00.921  INFO 7 --- [      Thread-11] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2019-08-21 09:01:00.991  INFO 7 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8761 (http) with context path ''
2019-08-21 09:01:00.998  INFO 7 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8761
2019-08-21 09:01:01.007  INFO 7 --- [           main] c.o.g.DiscoveryServiceApplication        : Started DiscoveryServiceApplication in 56.204 seconds (JVM running for 66.164)
2019-08-21 09:02:00.839  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:03:00.839  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:04:00.841  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 1ms
2019-08-21 09:05:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 2ms
2019-08-21 09:06:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:07:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:08:00.851  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 8ms
2019-08-21 09:09:00.856  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:10:00.860  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:10:59.206  WARN 7 --- [eerNodesUpdater] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2019-08-21 09:11:00.865  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:12:00.866  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:13:00.885  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 18ms

REST 端点客户端 YAML 配置。是这个吗

spring:
  application:
    name: second-service
server:
  port: 8087

eureka:
  instance:
    preferIpAddress: false
  client:
    service-url:
      defaultZone: http://spring-cloud-gateway.discovery.svc:8761/eureka/

而且好像没有注册。

        2019-08-21 09:46:12.416 ERROR 7 --- [tbeatExecutor-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error. 

endpoint=DefaultEndpoint{ serviceUrl='http://spring-cloud-gateway.discovery.svc:8761/eureka/ }
    com.sun.jersey.api.client.ClientHandlerException: org.apache.http.conn.ConnectTimeoutException: Connect to spring-cloud-gateway.discovery.svc:8761 timed out
        at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.9.8.jar!/:1.9.8]
        at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.WebResource.access0(WebResource.java:74) ~[jersey-client-1.19.1.jar!/:1.19.1]

我尝试使用公开的 URL (http://spring-cloud-gateway-discovery.192.168.42.79.nip.io/eureka) 检查 eureka 服务器的 Web ui,但我得到了这个页面。

NAME                                            HOST/PORT                                             PATH      SERVICES               PORT       T
ERMINATION   WILDCARD
route.route.openshift.io/spring-cloud-gateway   spring-cloud-gateway-discovery.192.168.42.79.nip.io             spring-cloud-gateway   8080-tcp    
             None
NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/spring-cloud-gateway   ClusterIP   172.30.167.146   <none>        8080/TCP   23h

服务器或客户端有问题吗?

eureka 服务器是project-1 的一部分,rest 服务客户端是project-2 的一部分。这就是我在 Openshift 控制台中设置它的方式。那是问题吗 ?我不这么认为。

更新 : 我将所有内容都移到了同一个项目中,但它仍然显示错误。

2019-08-22 06:45:39.412  WARN 7 --- [tbeatExecutor-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution 
failed with message: org.apache.http.conn.ConnectTimeoutException: Connect to spring-cloud-gateway.discovery.svc:8761 timed
 out
2019-08-22 06:45:39.413 ERROR 7 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SE
COND-SERVICE/spring-cloud-gateway-5-bh8rj:second-service:8087 - was unable to send heartbeat!
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

您的错误日志显示 'timed out' 和 'unable to send heartbeat',这可能是客户端注册表的问题,由 运行ning docker 容器使用端口启动您的服务引起在您的 yml/properties 文件中指定。

我在将微服务部署到 Cloud Foundry 时遇到了同样的问题,尽管我可以在本地成功 运行 它们。我想根本原因是一样的。

解决方法: 使用 secure/nonSecure 端口而不是 'server.port'.

这是示例(使用非安全端口),祝你好运。

如果您的 eureka 服务器和客户端之间仍然存在连接问题,您可以尝试在 http://spring-cloud-gateway.discovery.svc/eureka/apps 中查找详细信息。

尤里卡服务器:

spring:
  application:
    name: discovery-service

eureka:
  instance:
    hostname: spring-cloud-gateway.discovery.svc
    nonSecurePortEnabled: true
    nonSecurePort: 80
    homePageUrl: http://${eureka.instance.hostname}/
    statusPageUrl: http://${eureka.instance.hostname}/actuator/info/
    healthCheckUrl: http://${eureka.instance.hostname}/actuator/health/
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}/eureka/

尤里卡客户端:

spring:
  application:
    name: second-service

eureka:
  instance:
    nonSecurePortEnabled: true
    nonSecurePort: 80
    hostname: <your_client_host> # or you can use preferIpAddress: true
    homePageUrl: http://${eureka.instance.hostname}/
  client:
    service-url:
      defaultZone: http://spring-cloud-gateway.discovery.svc/eureka/