如何告知Eureka客户端要注册哪个端口(Spring Cloud)
我有一个使用Spring Boot实现的Eureka客户端,它有两个活动端口: 9005用于https,9010用于http Https是通过Spring Boot本机实现的。Http只是代码中添加的另一个简单的如何告知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:
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 CloudHoxton.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