如何告诉Eureka Client要注册哪个端口(Spring Cloud)

时间:2019-01-18 16:40:39

标签: spring spring-boot tomcat spring-cloud netflix-eureka

我有一个带有两个活动端口的Spring Boot实现的Eureka客户端: https为9005,http为9010。

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上运行,所有其他注册的服务也都在本地主机上,仅使用http。

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

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

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

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

3 个答案:

答案 0 :(得分:1)

我从上面的评论中删除了答案,以使其更明显。

我没有找到直接解决问题的方法,因此我实现了自己的https ServletContainer而不是http。 意思是http变成了本机,而https是在TomcatServletWebServerFactoryorg.springframework.boot.web.server.Ssl的帮助下实现的。

有关初始化TomcatServletWebServerFactory的信息,请参见此处: https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot

@Component
public class CustomContainer implements
     WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

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

要启用SSL:

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

我希望这会有所帮助。我没有在此处发布确切的代码段,因为不幸的是,在一些大公司(他们对自己的IP权利感到疯狂,并且可能与OSS许可发生冲突),它带来的麻烦多于帮助。请通过google获取https和TomcatServletWebServerFactory示例。

答案 1 :(得分:1)

解决此问题的一种方法是将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  

如果不确定如何生成密钥对,可以使用以下命令作为起点:

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

答案 2 :(得分:0)

启用Spring Security后,在Cloud Foundry上部署Spring Boot应用程序时遇到相同的问题。有趣的是,我尚未在应用程序上启用HTTPS(仅8080端口),但是在Eureka Server中注册的URL指向端口443。

我已经设法解决了在应用程序的eureka.instance.preferIpAddress=true eureka.instance.securePortEnabled=false eureka.instance.nonSecurePort=8080 上添加以下几行的问题(第一行用于使用容器到容器网络,后两行完成了此问题的技巧)

2.2.8.RELEASE

我正在使用Spring Boot Hoxton.SR6和Spring Cloud <select (change)="showEntity($event.target.value)"> <option value="2">2</option> <option value="4">4</option> <option value="5">5</option> </select>