如何通过zuul处理docker部署的spring cloud应用程序相互访问?

时间:2019-03-29 06:21:47

标签: spring-boot docker spring-cloud netflix-eureka netflix-zuul

我在docker中部署了我的spring cloud应用程序,包括eureka服务器,zuul,eureka客户端。我想通过zuul访问eureka客户端。

Zuul和eureka客户端在eureka服务器上注册。我访问每个应用程序,这是可行的。当我通过zuul访问eureka客户端时,zuul控制台信息显示java.net.NoRouteToHostException。我不知道为什么以及如何处理这个问题。

Eureka服务器配置就是这样。

server:
  port: 1020
spring:
  application:
    name: eureka-server
  security:
    basic:
      enabled: true
    user:
      name: admin
      password: admin

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  instance:
    hostname: 192.168.90.183
    prefer-ip-address: true
    ip-address: 192.168.90.183
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 5000
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true

Zuul的配置就是这样。

server:
  port: 8088
spring:
  application:
    name: gateway
  security:
    oauth2:
management:
  security:
    enabled: false 
  endpoints:
    web:
      exposure:
        exclude: refresh,health,info 
ribbon:
  ReadTimeout: 20000 
  SocketTimeout: 20000
zuul:
  # sensitiveHeaders: "*"
  routes:
    tdcm-linyi:
      path: /371300/**
      serviceId: tdcm

  ratelimit:
    key-prefix: your-prefix  
    enabled: true
    behind-proxy: true  
    default-policy: 
      limit: 100 
      quota: 1000 
      refresh-interval: 60
      type: 
      - user
      - origin
      - url
  host:
    connect-timeout-millis: 20000
    socket-timeout-millis: 20000

#================================eureka setting==============================
eureka:
  instance:
    instance-id: ${eureka.instance.hostname}:${server.port}
    hostname: 192.168.90.183
    prefer-ip-address: true
    ip-address: 192.168.90.183    
    lease-expiration-duration-in-seconds: 10 
    lease-renewal-interval-in-seconds: 5 
  client:
    serviceUrl:
      defaultZone:  http://admin:admin@${EUREKA_HOST:192.168.90.183}:${EUREKA_PORT:1020}/eureka 
    fetch-registry: true
    register-with-eureka: true

Eureka客户端配置就是这样。

spring:
  application:
    name: tdcm
  banner:
    charset: UTF-8
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  messages:
    encoding: UTF-8
  mvc:
    throw-exception-if-no-handler-found: true
# Server
server:
  port: 8926
  tomcat:
    uri-encoding: UTF-8
#================================eureka settinig==============================
eureka:
  instance:
    instance-id: ${eureka.instance.hostname}:${server.port}
    hostname: 192.168.90.183
    prefer-ip-address: true
    ip-address: 192.168.90.183
    lease-expiration-duration-in-seconds: 10  
    lease-renewal-interval-in-seconds: 5 
  client:
    serviceUrl:
      defaultZone:  http://admin:admin@${EUREKA_HOST:192.168.90.183}:${EUREKA_PORT:1020}/eureka 
    fetch-registry: true
    register-with-eureka: true

我的测试操作是这样的。

我通过http://192.168.90.183:8088访问zuul,效果很好。

我通过http://192.168.90.183:8926/getCityCenter访问eureka客户端,效果很好。

当我通过zuul访问eureka客户端时, http://192.168.90.183:8088/371300/getCityCenter,它不起作用。

控制台显示类似这样的信息。

03-29 01:55:27.229 INFO  [c.n.loadbalancer.DynamicServerListLoadBalancer] - DynamicServerListLoadBalancer for client tdcm initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=tdcm,current list of Servers=[192.168.90.183:8926],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;    Instance count:1;   Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]
},Server stats: [[Server:192.168.90.183:8926;   Zone:defaultZone;   Total Requests:0;   Successive connection failure:0;    Total blackout seconds:0;   Last connection made:Thu Jan 01 00:00:00 UTC 1970;  First connection made: Thu Jan 01 00:00:00 UTC 1970;    Active Connections:0;   total failure count in last (1000) msecs:0; average resp time:0.0;  90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@3275110f
03-29 01:55:28.201 INFO  [com.netflix.config.ChainedDynamicProperty] - Flipping property: tdcm.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
03-29 01:55:28.545 INFO  [org.apache.http.impl.execchain.RetryExec] - I/O exception (java.net.NoRouteToHostException) caught when processing request to {}->http://192.168.90.183:8926: No route to host (Host unreachable)
03-29 01:55:28.546 INFO  [org.apache.http.impl.execchain.RetryExec] - I/O exception (java.net.NoRouteToHostException) caught when processing request to {}->http://192.168.90.183:8926: No route to host (Host unreachable)
03-29 01:55:28.546 INFO  [org.apache.http.impl.execchain.RetryExec] - Retrying request to {}->http://192.168.90.183:8926
03-29 01:55:28.546 INFO  [org.apache.http.impl.execchain.RetryExec] - Retrying request to {}->http://192.168.90.183:8926
03-29 01:55:28.547 INFO  [org.apache.http.impl.execchain.RetryExec] - I/O exception (java.net.NoRouteToHostException) caught when processing request to {}->http://192.168.90.183:8926: No route to host (Host unreachable)
03-29 01:55:28.548 INFO  [org.apache.http.impl.execchain.RetryExec] - Retrying request to {}->http://192.168.90.183:8926
03-29 01:55:28.555 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:28.556 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null
03-29 01:55:29.549 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:29.550 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null
03-29 01:55:29.550 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:29.551 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null
03-29 01:55:29.549 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:29.552 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null
03-29 01:55:37.508 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:37.510 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null
03-29 01:55:39.031 ERROR [c.t.gateway.component.exception.ProducerFallback] - s:tdcm
03-29 01:55:39.033 ERROR [c.t.gateway.component.exception.ProducerFallback] - exception: null

看来zuul找不到到tdcm的eureka客户端的路由器。

我试图将所有应用程序部署在计算机上,包括eureka服务器,zuul,eureka客户端,而不是在docker中。与本文描述相同的配置,效果很好。我不知道为什么在通过docker部署的zuul访问eureka客户端时为何不起作用。

我使用主机IP地址进行Spring Cloud应用。

我的docker版本是17.12.1-ce。

我的春季云版本是Finchley.SR1。

我的Spring引导版本是2.0.3.RELEASE。

我的主机是cent-os 7。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我知道问题的处理方法。Eureka客户端配置删除ip-address的yml值。

eureka:
  instance:
    ip-address: 192.168.90.183   

原因是Docker的内部网络中的eureka客户端配置。它可以通过docker的内部网络从zuul访问。