Spring Gateway не может маршрутизировать на микросервис с помощью Eureka внутри виртуальной машины - PullRequest
0 голосов
/ 27 января 2020

Я пытался настроить проект Spring Cloud на компьютере VirtualBox, где каждая служба развернута в контейнере Docker. Это включает следующее:

  • Spring Cloud Gateway (порт 8088)
  • Spring Eureka (порт 8761)
  • Микросервис Spring Boot (порт 8080)
  • Spring Cloud Config (порт 8888)

Затем я раскручиваю это через файл docker -compose.yml, который устанавливает сеть. Каждый сервис может подключаться к реестру сервисов Eureka очень хорошо и с включенной переадресацией портов - как в файле VagrantFile, так и в файле Docker -Compose. Когда я проверяю службу реестра Eureka в http://localhost: 8761 , под разделом status , я вижу « Экземпляры, зарегистрированные в настоящее время в Eureka »

  • 0480477c2d26: форекс-сервис: 8080
  • 0d42748adb3e: шлюз: 8088

Однако, когда я пытаюсь связаться с микросервисом через шлюз API в http://localhost: 8088 / обмен валюты / от / евро / до / INR , Hystrix Fallback вызывается, и если бы я его удалил, он все равно был бы недоступен. Все отлично работает, когда я развертываю стек на моей Windows машине , поэтому я знаю, что код хорош. Это когда я беру эту настройку внутри контейнеров VirtualBox и Docker, все не работает.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|

  config.vm.box = "fully-loaded-centos7"

  config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 8081, host: 8081, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 8761, host: 8761, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 8888, host: 8888, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 8088, host: 8088, host_ip: "127.0.0.1"

  config.vm.provider "virtualbox" do |vb|

    vb.memory = "1024"

    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
  end
end

docker - составить .yml

version: "3.7"
services:
  gateway:
    image: sync/gateway:1.0
    volumes:
      - ./gateway/config:/config    
    ports:
      - "8088:8088"
    depends_on:
      - discovery
  config:
    build: configserver/spring.cloud.config/
    volumes:
      - ./configserver/config:/config
    ports:
      - "8888:8888"
    depends_on:
      - discovery
  discovery:
    build: eureka/demo/
    volumes:
      - ./eureka/config:/config
    ports:
      - "8761:8761"
  forex:
    image: sync/forex:1.0
    volumes:
      - ./forex/config:/config
    depends_on:
      - discovery
      - config
    ports:
      - "8080:8080"

Этот Dockerfile используется для создания всех образов этих служб, поэтому здесь все одинаково:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Spring Cloud Gateway

application.yml

hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 20000000

spring:
  application:
    name: gateway

  logging:
    level:
      root: INFO
      org.springframework.web: INFO
      org.springframework.web.HttpLogging: DEBUG
      org.springframework.cloud.gateway: DEBUG

  info:
    app:
      name: ${spring.application.name}

  cloud:
      gateway:
        routes:    
        - id: forexRoute
          uri: lb://forex-service
          predicates:
          - Path=/currency-exchange/**
          filters:
          - name: Hystrix
            args:
              name: hystrix
              fallbackUri: forward:/fallback/forex-service

        - id: currencyConversionRoute
          uri: lb://currency-conversion-service
          predicates:
          - Path=/currency-converter-feign/**
          filters:
          - name: Hystrix
            args:
              name: hystrix
              fallbackUri: forward:/fallback/currency-conversion-service

        httpclient:
          connect-timeout: 450000000
          response-timeout: 450000000

server:
  port: 8088
  connection-timeout: 500000000

eureka:
  client:
    register-with-eureka: true
    serviceUrl:
      defaultZone: http://discovery:8761/eureka
    healthcheck:
      enabled: true

management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream

Сервисный реестр Spring Eureka

application.properties

spring.application.name=discovery
server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

Spring Boot Forex Microservice

bootstrap .yml

spring:
  application:
    name: forex-service
  cloud:
    config:
      uri: http://config:8888
      username: user
      password: password
      discovery:
       enabled: true
       service-id: config
      fail-fast: true
      retry:
       initial-interval: 1500
       multiplier: 1.5
       max-attempts: 10000
       max-interval: 1000
eureka:
  instance:
    hostname: forex-service
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: ${EUREKA_SERVER:http://discovery:8761/eureka}

Ведение журнала Spring Cloud Gateway не было наглядным, но мне удалось отловить эти два бита.

Вот когда я запускаю на Windows Настольную машину без какой-либо виртуализации , et c.

DynamicServerListLoadBalancer for client forex-service initialized: 
DynamicServerListLoadBalancer:{NFLoadBalancer:name=forex-service,current list of Servers=[xxxxxxxxxxxx.xxxxxxxxxxx.com:8080],
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:xxxxxxxxxxxx.xxxxxxxxxxxxxxxx.com:8080;    Zone:defaultZone;   Total Requests:0;   
Successive connection failure:0;    Total blackout seconds:0;   
Last connection made:Wed Dec 31 19:00:00 EST 1969;  First connection made: Wed Dec 31 19:00:00 EST 1969;    
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]

Вот что я вижу внутри машины VirtualBox, и после того, как я использую команду docker logs sync_gateway_1 . Как вы можете видеть, кажется, что он направляет его на форекс-сервис: 8080, но это не дает никаких результатов:

DynamicServerListLoadBalancer for client forex-service initialized: 
DynamicServerListLoadBalancer:{NFLoadBalancer:name=forex-service,current list of Servers=[forex-service:8080],
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:forex-service:8080;    Zone:defaultZone;       Total Requests:0;       
Successive connection failure:0;        Total blackout seconds:0;       
Last connection made:Thu Jan 01 00:00:00 GMT 1970;      First connection made: Thu Jan 01 00:00:00 GMT 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]

Я смог go внутри контейнера для шлюза API и попытался свернуть обнаружение: 8761 и конфиг: 8888, оба работают. Когда я скручиваю Forex-сервис: 8080, я получаю эту ошибку: curl: (6) Не удалось разрешить хост: Forex-сервис

...