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

标签 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 Server 本身在 localhost 上运行,所有其他注册服务也在 localhost 上,仅使用 http。

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

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

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

最佳答案

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

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

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

关于spring - 如何告诉Eureka Client注册哪个端口(Spring Cloud),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54258127/

相关文章:

java - Spring Batch 适合我的服务代码吗?

java - 无法在 MessageListener 类 AMQP 中 Autowiring bean

tomcat - Spring Boot(使用tomcat)url重定向没有模板引擎

java - Tomcat 何时/如何选择 ServletContext 接口(interface)的具体类?

java - 从 1.0.5 更新到 1.1.0 后,OCPsoft 重写规则不再起作用

java - Spring Web MVC Hibernate 集成错误

Spring @Procedure 和 List 作为返回

java - Spring Boot不使用consul属性

gradle - 在flyway中使用共享数据库脚本

java - 非法访问 : this web application instance has been stopped already. Tomcat 停止运行