问题描述
SpringCloud服务提供者,设定了随机端口配置后,在EurekaServer中的注册端口、Tomcat的web端口、运行中获取到的server.port配置端口,共出现了4个不同的端口,并且服务消费者使用ribbon时不能通过服务提供者的服务名称进行调用服务
配置信息
spring:
application:
name: client-server
eureka:
client:
service-url:
defaultZone: http://peer1:8761/eureka/
server:
port: ${random.int(8801,8810)}
@RestController
@RequestMapping("/")
public class IndexController {
@Value("${server.port}")
private String port;
@RequestMapping("hello")
public JSONObject hello() {
JSONObject result = new JSONObject();
result.put("producer", port + " 正在处理");
return result;
}
}
启动EurekaServer和本服务,本服务日志显示如下
com.netflix.discovery.DiscoveryClient : DiscoveryClient_CLIENT-SERVER/DESKTOP-IND7D5U:client-server:8808: registering service...
com.netflix.discovery.DiscoveryClient : DiscoveryClient_CLIENT-SERVER/DESKTOP-IND7D5U:client-server:8808 - registration status: 204
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8801 (http) with context path ''
.s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8801
然后问题来了,打开EurekaServer页,可以看到client-server的注册,client-server出现了8806和8808端口,访问http://localhost:8801/hello,返回的server.port是8805
而且服务消费者用了ribbon,也不能通过"http://CLIENT-SERVER/hello"的方式进行调用,会提示异常信息 I/O error on GET request for "http://CLIENT-SERVER/hello"
结论
猜想可能是random.int的问题,网上搜了下这个问题,找到个类似的文章 springboot使用随机端口暴露的问题解决方法,里面提到并给出了自己实现random.int的方法,让随机端口只生成一次,应该可以解决问题