2
votes

Comment dire à Eureka Client quel port enregistrer (Spring Cloud)

J'ai un client Eureka implémenté avec Spring Boot avec deux ports actifs: 9005 pour https et 9010 pour http.

Https est implémenté nativement par Spring Boot. Http est juste un simple TomcatServletWebServerFactory supplémentaire ajouté dans le code.

Maintenant, le problème est que ce client Eureka s'enregistre avec le port https spécifié dans les propriétés de l'application comme 9005: p>

public ServletWebServerFactory servletContainer(@Value("${server.http.port}") int httpPort, @Value("${server.http.address}") String httpHost) throws UnknownHostException {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setPort(httpPort);
    connector.setAttribute("address", InetAddress.getByName(httpHost).getHostAddress());
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(connector);
    return tomcat;
}

mais j'aimerais que ce client s'enregistre avec le port http 9010.

Bien sûr, le serveur Eureka lui-même fonctionne sur le localhost et tous les autres services enregistrés sont également sur l'hôte local, parlant uniquement http.

Https est destiné aux clients externes qui ne sont pas des navigateurs WEB et des certificats personnalisés y sont utilisés.

J'ai essayé nonSecurePort côté client, mais cela semble être un paramètre de configuration uniquement côté serveur. Configuration de mon client Eureka (en plus de la configuration du port définie ci-dessus):

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true
  instance:
    preferIpAddress: true
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
    nonSecurePortEnabled: true
    nonSecurePort: 9010

Implémentation supplémentaire de HttpServer:

server:
   port: 9005
   ssl:
      enabled: true
      ...
   http:
      port: 9010
      address: 127.0.0.1


6 commentaires

eureka.instance.non-secure-port est la voie à suivre. Ce n'est pas une configuration uniquement côté serveur. Le problème est que, avec votre configuration, le port sécurisé est également actif et eureka utilise par défaut cette option si c'est le cas. Si vous ne voulez pas de port sécurisé, désactivez-le dans eureka.instance.secure-port-enabled = false .


@spencergibb, n'a pas aidé: (J'ai même essayé de définir explicitement health-check-url, etc. Les paramètres semblent simplement ignorés. Un problème de configuration? hostname: localhost non-secure-port-enabled: true non-secure-port: 9010 secure-port-enabled: false health-check-url: http: // $ {eureka.instance.hostname}: $ {eureka.instance.non-sec‌ ure-port} / ctx / url de la page d'état de santé: http: // $ {eureka.instance.hostname}: $ {eureka.instance.non-sec‌ ure-port} / ctx / info home-page-url: http: // $ { eureka.instance.hostname}: $ {eureka.instance.non-sec‌ ure-port} / ctx


Désolé, le préfixe ctx dans mon commentaire précédent était incorrect. Et les URL ne sont pas totalement ignorées. Si j'appuie sur le lien, cela ouvre la page spécifiée dans l'url de la page d'état. Cependant, l'interface graphique Web sur le serveur Eureka affiche toujours le port https, ainsi que le journal indique le port 9005 (https). Toujours dans les journaux, je reçois d'abord le message "service d'enregistrement ..." de com.netflix.discovery.DiscoveryClient et seulement après "Tomcat a démarré sur le (s) port (s): 9005 (https) 9010 (http) avec le chemin de contexte" ...


avez-vous déjà obtenu une réponse à cela, je ne suis pas en mesure de définir le port que le service s'enregistre auprès d'Eureka non plus


@ waqask87, non j'ai abandonné. J'ai implémenté mon propre serveur https ServletContainer au lieu de http. Ainsi, http est devenu natif, tandis que https a été implémenté avec l'aide de TomcatServletWebServerFactory et org.springframework.boot.web.server.Ssl. J'espère que cela t'aides.


@Dime pouvez-vous s'il vous plaît poster votre solution comme réponse ici?


3 Réponses :


1
votes

Je tire la réponse d'un commentaire ci-dessus, pour la rendre plus visible.

Je ne trouve pas de solution directe au problème, j'ai donc implémenté mon propre https ServletContainer au lieu de http . Ce qui signifie que http est devenu natif, tandis que https a été implémenté avec l'aide de TomcatServletWebServerFactory et org.springframework.boot.web.server.Ssl .

Pour initialiser TomcatServletWebServerFactory, voir ici: https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainercustomizer-configurableembeddservlet

Ssl ssl = new Ssl();
ssl.setEnabled(true);
// set your keystore here if required
...
// assign ssl to the new Tomcat instance
factory.setSsl(ssl);

Pour activer SSL:

@Component
public class CustomContainer implements
     WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

  @Override
  public void customize(TomcatServletWebServerFactory factory) {
     factory.setContextPath("");
     factory.setPort(443);
  }
}

J'espère que cela vous aidera. Je ne poste pas d'extrait de code exact ici, car malheureusement dans certaines grandes entreprises (qui sont folles de leurs droits de propriété intellectuelle et de possibles conflits avec les licences OSS), cela crée plus de problèmes que d'aide. Veuillez rechercher des exemples sur https et TomcatServletWebServerFactory sur Google.


1 commentaires

C'est la même chose que le commentaire, l'ajout du code et de la configuration que vous avez faits pour y parvenir aidera les autres confrontés au même problème.



1
votes

Une façon de contourner ce problème consiste à ajouter le connecteur SSL en tant que connecteur supplémentaire et à conserver le connecteur non sécurisé comme connecteur par défaut.

Ajout du connecteur SSL en tant que connecteur supplémentaire:

keytool -genkey -alias ode-https -storetype JKS -keyalg RSA -keys ize 2048 -validity 365 -keystore ode-https.jks

Configuration correspondante pour le connecteur:

sslConfig:
    key-alias: ode-https
    key-store-type: JKS
    key-password: password
    key-store: ode-https.jks
    port: 443  

Si vous ne savez pas comment générer une paire de clés, vous pouvez utiliser la commande ci-dessous comme point de départ:

@Configuration
public class HttpsConfiguration {

    @Value("${sslConfig.key-alias}")
    private String keyAlias;

    @Value("${sslConfig.key-store}")
    private String keyStoreFile;

    @Value("${sslConfig.key-password}")
    private String keyPassword;

    @Value("${sslConfig.key-store-type}")
    private String keyStoreType;

    @Value("${sslConfig.port}")
    private int sslPort;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createSslConnector());
        return tomcat;
    }

    private Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        connector.setScheme("https");
        connector.setSecure(true);
        protocol.setSSLEnabled(true);

        connector.setPort(sslPort);
        protocol.setKeystoreFile(keyStoreFile);
        protocol.setKeystorePass(keyPassword);
        protocol.setKeyAlias(keyAlias);
        protocol.setKeystoreType(keyStoreType);
        return connector;
    }
}


0 commentaires

0
votes

J'ai le même problème lors du déploiement d'une application Spring Boot sur Cloud Foundry après l'activation de Spring Security. Le plus drôle étant que je n'ai pas activé HTTPS sur l'application (uniquement le port 8080) mais que l'URL enregistrée avec le serveur Eureka pointe vers le port 443.

J'ai réussi à résoudre le problème en ajoutant les lignes suivantes sur l'application application.properties (la 1ère ligne est pour utiliser le réseau conteneur-à-conteneur et les deux derniers ont fait le truc dont traite cette question).

eureka.instance.preferIpAddress=true
eureka.instance.securePortEnabled=false
eureka.instance.nonSecurePort=8080

J'utilise Spring Boot 2.2.8.RELEASE et Spring Cloud Hoxton.SR6


0 commentaires