如何告知Eureka客户端要注册哪个端口(Spring Cloud)

如何告知Eureka客户端要注册哪个端口(Spring Cloud),spring,spring-boot,tomcat,spring-cloud,netflix-eureka,Spring,Spring Boot,Tomcat,Spring Cloud,Netflix Eureka,我有一个使用Spring Boot实现的Eureka客户端,它有两个活动端口: 9005用于https,9010用于http Https是通过Spring Boot本机实现的。Http只是代码中添加的另一个简单的TomcatServletWebServerFactory 现在的问题是,此Eureka客户端使用应用程序属性中指定的https端口(9005: server: port: 9005 ssl: enabled: true ... http:

我有一个使用Spring Boot实现的Eureka客户端,它有两个活动端口: 9005用于https,9010用于http

Https是通过Spring Boot本机实现的。Http只是代码中添加的另一个简单的
TomcatServletWebServerFactory

现在的问题是,此Eureka客户端使用应用程序属性中指定的https端口(9005:

server:
   port: 9005
   ssl:
      enabled: true
      ...
   http:
      port: 9010
      address: 127.0.0.1
但是我希望这个客户机用http端口9010注册自己

当然,Eureka服务器本身在
localhost
上运行,所有其他注册的服务也在localhost上运行,只使用http

Https适用于非WEB浏览器的外部客户端,并且在那里使用自定义证书

我在客户端尝试了
nonsecurereport
,但这似乎只是一个服务器端配置参数。我的Eureka客户端配置(除了上面定义的端口配置外):

其他HttpServer实现:

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;
}

我从上面的一条评论中得出答案,让它更明显

我找不到直接解决问题的方法,所以我实现了自己的https
ServletContainer
,而不是http。 这意味着http成为本机,而https是在
TomcatServletWebServerFactory
org.springframework.boot.web.server.Ssl
的帮助下实现的

有关初始化TomcatServletWebServerFactory的信息,请参见此处:


我希望这有帮助。我没有在这里发布确切的代码片段,因为不幸的是,在一些大公司(他们热衷于他们的IP权利,并且可能与OSS许可证发生冲突)中,它带来的麻烦多于帮助。请在google上搜索https和TomcatServletWebServerFactory示例。

解决此问题的一种方法是将SSL连接器添加为附加连接器,并将非安全连接器保留为默认连接器

将SSL连接器添加为附加连接器:

@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;
    }
}
sslConfig:
    key-alias: ode-https
    key-store-type: JKS
    key-password: password
    key-store: ode-https.jks
    port: 443  
连接器的相应配置:

@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;
    }
}
sslConfig:
    key-alias: ode-https
    key-store-type: JKS
    key-password: password
    key-store: ode-https.jks
    port: 443  
如果您不确定如何生成密钥对,可以使用以下命令作为起点:

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

启用Spring安全性后,在Cloud Foundry上部署Spring启动应用程序时,我也遇到了同样的问题。有趣的是,我没有在应用程序上启用HTTPS(只有8080端口),但在Eureka服务器上注册的URL指向端口443

我已经设法解决了在应用程序的
应用程序.properties
上添加以下行的问题(第一行用于使用容器到容器网络,最后两行完成了这个问题所涉及的技巧)


我使用的是Spring Boot
2.2.8.RELEASE
和Spring Cloud
Hoxton.SR6

eureka.instance。非安全端口是一个不错的选择。它不是仅服务器端配置。问题是,在您的配置中,安全端口也处于活动状态,如果处于活动状态,eureka将默认为该状态。如果您不想在
eureka.instance.secure port enabled=false中禁用安全端口,则@spencergib没有帮助:(我甚至尝试过显式设置健康检查url等。设置似乎被忽略。一些配置问题?
hostname:localhost非安全端口启用:true非安全端口:9010安全端口启用:false健康检查url:http://${eureka.instance.hostname}:${eureka.instance.non-secure port}/ctx/健康状态页面url:http://${eureka.instance.hostname}:${eureka.instance.non-secure port}/ctx/info主页url:http://${eureka.instance.hostname}:${eureka.instance.non-secure port}/ctx
对不起,我之前评论中的ctx前缀是错误的。url没有被完全忽略。如果我按下链接,它会打开状态页面url中指定的页面。但是Eureka服务器上的web GUI仍然显示https端口,日志指示端口9005(https)。在日志中,我首先得到“注册服务…”来自com.netflix.discovery.DiscoveryClient且仅在“Tomcat在端口上启动:9005(https)9010(http)且上下文路径为”之后发送的消息…您是否得到过此问题的答案,我无法设置服务向Eureka注册的端口either@waqask87,不,我放弃了。我已经实现了自己的https ServletContainer,而不是http。因此http成为本机,而https是在TomcatServletWebServerFactory和org.springframework.boot.web.server.Ssl.H的帮助下实现的ope这有帮助。这与注释相同,添加代码和配置可以帮助其他面临相同问题的人。
keytool -genkey -alias ode-https -storetype JKS -keyalg RSA -keys ize 2048 -validity 365 -keystore ode-https.jks
eureka.instance.preferIpAddress=true
eureka.instance.securePortEnabled=false
eureka.instance.nonSecurePort=8080