Я пытался настроить проект 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-сервис