如何告诉Eureka Client注册哪个端口(Spring云)
How tell Eureka Client which port to register (Spring Cloud)
我有一个使用 Spring 启动的 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
上,所有其他注册服务也在本地主机上,仅使用 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;
}
我从上面的评论中提取答案,以使其更明显。
我找不到问题的直接解决方案,所以我实现了自己的 https ServletContainer
而不是 http。
意味着 http 变成了原生的,而 https 是在 TomcatServletWebServerFactory
和 org.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);
希望对您有所帮助。我在这里没有 post 确切的代码片段,因为不幸的是,在一些大公司(他们对自己的知识产权和可能与 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
如果您不确定如何生成密钥对,可以使用以下命令作为起点:
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 Server 上注册的 URL 指向端口 443.
我通过在应用程序 application.properties
中添加以下几行来解决问题(第一行用于使用容器到容器网络,最后两行解决了这个问题关于)。
eureka.instance.preferIpAddress=true
eureka.instance.securePortEnabled=false
eureka.instance.nonSecurePort=8080
我正在使用 Spring 引导 2.2.8.RELEASE
和 Spring 云 Hoxton.SR6
我有一个使用 Spring 启动的 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
上,所有其他注册服务也在本地主机上,仅使用 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;
}
我从上面的评论中提取答案,以使其更明显。
我找不到问题的直接解决方案,所以我实现了自己的 https ServletContainer
而不是 http。
意味着 http 变成了原生的,而 https 是在 TomcatServletWebServerFactory
和 org.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);
希望对您有所帮助。我在这里没有 post 确切的代码片段,因为不幸的是,在一些大公司(他们对自己的知识产权和可能与 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
如果您不确定如何生成密钥对,可以使用以下命令作为起点:
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 Server 上注册的 URL 指向端口 443.
我通过在应用程序 application.properties
中添加以下几行来解决问题(第一行用于使用容器到容器网络,最后两行解决了这个问题关于)。
eureka.instance.preferIpAddress=true
eureka.instance.securePortEnabled=false
eureka.instance.nonSecurePort=8080
我正在使用 Spring 引导 2.2.8.RELEASE
和 Spring 云 Hoxton.SR6