建立了下面三个项目 用来测试 Feign Client首次访问失败的问题:
EurekaServer
生产者:EurekaClient1
消费者:EurekaClient2
先启动EurekaServer,再启动EurekaClient2,再启动 EurekaClient1(间隔时间很短)。
服务启动后,通过 消费者EurekaClient2 访问——会通过Feign Client访问EurekaClient1的接口。
可是,一直失败!
生产者启动后注册的日志:
DiscoveryClient_CLIENT1/ben:client1:8080 - registration status: 204
也可以通过EurekaServer的网页查看到:
http://127.0.0.1:8761/
日志显示,在 生产者EurekaClient1 启动后的50秒左右没有收到来自 EurekaClient2的请求。
检查 消费者EurekaClient2 的日志发现,其在执行请求时没有得到EurekaClient1服务的信息——为空。
2019-07-11 14:05:39.062 INFO 9720 --- [strix-client1-1] c.netflix.loadbalancer.BaseLoadBalancer : Client: client1 instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=client1,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
但是,在 访问 消费者EurekaClient1 的服务时,EurekaClient1已经启动并在EurekaServer注册了。
很奇怪。
在EurekaClient1启动50秒后,EurekaClient2才通过Feign Client访问EurekaClient1的服务。
不过,EurekaClient1启动后,可以直接通过浏览器访问它的服务。
目前判断,问题出在 消费者EurekaClient2 和 EurekaServer 之间的“沟通”时——EurekaServer 没有及时提供信息给EurekaClient2。
三个项目的application.yml配置如下:
看来和Ribbon的加载模式有关系
但是,配置了Ribbon的饥饿加载模式也不可用
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=client1
配置后,获取服务器为空的日志是在项目启动前打印出来了。
解决了吗?
没有,也不重要了