各位老哥们,我使用springcloud+nacos遇到了一点问题
我在测试的时候发现,使用服务名称替换ip调用成功之后,再把nacos服务关闭,关闭之后依然能够通过服务名称替换ip的形式成功调用服务,请问这是什么情况,是springcloud已经将服务名称对应的ip 缓存起来了吗,或则说是某个类存放了这些数据?
引用 皆我百晓生 小程序回复内容作答:
在Spring Cloud中,服务发现和负载均衡默认使用的是Netflix Ribbon。Ribbon在启动时会从注册中心(如Nacos)获取服务实例列表,并缓存在本地。默认情况下,Ribbon缓存这些服务实例30秒钟,过期后会重新从注册中心获取最新的服务实例列表。因此,在服务关闭后,通过服务名称调用服务仍然能够成功,是因为Ribbon还在缓存中拥有服务实例的相关信息。
如果你想修改Ribbon的缓存时间,可以在配置文件中添加以下内容:
ribbon:
eureka:
enabled: false
nacos:
discovery:
enabled: true
ServerListRefreshInterval: 5000
这里的ServerListRefreshInterval
表示Ribbon刷新服务实例列表的时间间隔,单位为毫秒。设置为0表示每次都从注册中心获取最新的服务实例列表。
同时,你也可以使用@RefreshScope
注解来实现动态刷新Ribbon的配置,确保每次调用服务时都能获取到最新的服务实例列表。
除了Ribbon以外,还可以使用Spring Cloud的其他负载均衡组件,如Spring Cloud LoadBalancer(2.2.x版本后推荐使用),它的负载均衡策略是基于服务实例元数据的动态选择,不需要缓存服务实例列表。你可以在项目中添加以下依赖来使用Spring Cloud LoadBalancer:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
同时,在配置文件中将Ribbon禁用,启用Spring Cloud LoadBalancer:
ribbon:
enabled: false
spring:
cloud:
loadbalancer:
ribbon:
enabled: true
希望可以帮助到你!