Brak rejestracji serwisów w Netflix Eureka przy próbie uruchomienia w Dockerze

0

Cześć,
Mam trzy niezależne aplikacje, które chcę odpalić jako trzy niezależne kontenery w Dockerze. Jedna z nich to serwer Eureka a dwie pozostałe to są jakieś proste Hello-Worldy do testowania tego wszystkiego. Gdy cały tercet odpalam bezpośrednio przez SpringBoot to wszystko działa OK -> w pliku regustration-server.yaml jako adres Eureka mam podany po prostu localhost. Schody zaczynają się dopiero gdy próbuję do odpalić w Dockerze. Używam do tego celu docker-composer i mój plik yaml wygląda tak:

 version: '2'

services: 
 demo: 
  image: springio/demo
  ports:
   - "1111:1111"
  networks:
   test:
    ipv4_address: 172.18.17.10  

 demo-client:
  image: springio/demo-client
  ports:
   - "2222:2222"
  networks:
   - test
  depends_on:
   - demo

# demo-client-consumer:
#  image: springio/demo-client-consumer
#  ports:
#   - "3333:3333"
#  networks:
#   - test
#  depends_on:
#   - demo
#   - demo-client


networks: 
 test: 
  ipam:
   config: 
   - subnet: 172.18.17.0/24 
     gateway: 172.18.17.1 

Kontener z Eureką odpala się normalnie i jest pozornie dostępny na porcie 1111 pod statycznym IP kontenera, jak i z IP hosta. Problem polega na tym jak zewnętrzny serwis próbuje się tam rejestrować. Gdy rejestruje się coś odpalanego "standalone" ze SpringBoot, czy też z innego kontenera to dostaje 403 i w logu mam coś takiego

 2017-03-01 14:40:23.557  INFO 4897 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_TEST-SERVICE/192.168.188.151:test-service:2222: registering service...
2017-03-01 14:40:23.586  WARN 4897 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failure with status code 403; retrying on another server if available
2017-03-01 14:40:23.587  WARN 4897 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_TEST-SERVICE/192.168.188.151:test-service:2222 - registration failed Cannot execute request on any known server

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
	at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:111) ~[eureka-client-1.4.10.jar:1.4.10]
	(...)

SecurityConfig ze Spring Security mam zrobione w taki sposób, czyli niby powinno puszczać wszystko:

 @Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {

	  http.authorizeRequests().anyRequest().permitAll();

	}
}

I teraz pytanie, bo już nie wiem gdzie szukać przyczyny. To 403 bierze się ze Springa (spring secutiy) czy z Eureki?

0

jak wejdziesz przegladarka to też masz 403?

0

A w sumie po co Ci Eureka jak mozesz miec service discovery na poziomie kontenerów?
Docker Swarm chyba współdziała z docker compose. (to jedna z wielu opcji)

Ogólnie to takie service discovery jak Eureka powinno byc HA, a tutaj robisz to trochę na tym samym poziomie co reszta aplikacji. No ale rozumiem, że to hello world ;)

A jak docker-compose to kontenery powinny komunikować się po nazwach kontenerów... po IP można.. .ale będzie bolało ;)

To trochę za grube, ale warto przeczytać:
https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes/

0

Generalnie na Status moje wejść bez problemu i nie dostaje tego 403, choć jest tam trochę inny błąd.
title
Jak wchodze na http://172.18.17.10:1111/eureka to dostaje pustą stronę bez żadnych błędów. Z Eureki musze korzystać. Ostatnio w firmie nastapiła mała reorganizacja, zostałem przeniesiony do innego kierownika na inny projekt i po prostu musze się zaznajomić na szybkości z narzędziami, które tam używają.

Za to serwisy wywołuje z Eureka po ich nazwach a nie po adresach IP także pod tym względem jest OK ;) Zresztą klasa jednego z tych, który gada z drugim wygląda tak:


     @Autowired
    private LoadBalancerClient loadBalancer;
    
    private RestTemplate restTemplate = new RestTemplate();
	
	@RequestMapping(value = "/", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public Answer home() {
		
		MessageRx msgRx = new MessageRx();
		
		msgRx.setRx(new Rx());
		msgRx.getRx().setMoteeui("123456");
		msgRx.getRx().setUserdata(new UserData());
		msgRx.getRx().getUserdata().setPort(1);
		msgRx.getRx().getUserdata().setSeqno(4);
		
        ServiceInstance instance = loadBalancer.choose("test-service");
        URI uri = instance.getUri();
        
        ResponseEntity<Answer> answer = restTemplate.getForEntity(uri, Answer.class);
        
        List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
        list.add(new MappingJackson2HttpMessageConverter());
        restTemplate.setMessageConverters(list); 
        
		restTemplate.postForEntity(uri, msgRx, MessageRx.class);
        
        return answer.getBody();
    }
0

OK okazało się, że za problem odpowiada Spring Security. Dalsze pytania przeniosłem do innego tematu, bo tutaj byłby trochę OT

0

To, ze wszedles na Eureke to spoko ale widac tam, ze zadne applikacje sie w niej nie zarejestrowaly. Ta eureka to tez appka na springu przeciez.

Serwisy dostaja namiary na inne serwisy z eureki. A nie, ze wchodzisz na nie przez eureke. Do sensownej pracy z tym potrzebujesz api gateway.

Jesli musisz korzystac z eureki to do czego docker?
Jak chcesz to polaczyc z sensem?

Sprawdz najpierw czy poprawnie rozwiazuje hosty. Pozniej obarczaj wina spring security. Np. Wejdz na ktoregos dockera i curlem wywolaj eureke.

Przeciez napisales, ze bez dockera dziala.

Ogolnie to srednio Cie rozumiem i mam wrazenie, ze probujesz to za bardzo na hurra i 'na pale' zrobic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1