赞
踩
目录
在服务器上查到应用服务的进程号,然后执行命令
kill -9 进程号
不过这种方法是很粗暴的。这是因为 eureka client 端和 server 端是通过心跳进行续约的,
默认情况下,如果 eureka server 在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。
我用秒表测试了一下,发现整个过程需要将近3分钟的时间,eureka server 才会将实例从其注册表中删除。
这个时间可能包括了 eureka client 的心跳检测、服务列表删除以及信息同步等
这几个时间分别由服务端的参数和客户端共同控制
eureka server 端的参数
- #enable-self-preservation 设为false,关闭自我保护机制
- eureka.server.enable-self-preservation=false
-
- #eviction-interval-timer-in-ms 清理间隔(单位毫秒,默认是60*1000),可快速移除不可用的服务
- eureka.server.eviction-interval-timer-in-ms=5000
eureka client 端的参数
- #该配置指示eureka客户端需要向eureka服务器发送心跳的频率,默认值是 30s
- eureka.instance.lease-renewal-interval-in-seconds: 10
-
- #该配置指示eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例,默认值是 90s
- eureka.instance.lease-expiration-duration-in-seconds: 30
修改完成后测试结果在1分钟左右。
即使缩短为1分钟,还是会影响服务的调用
在服务中开放一个接口,专门用来下线服务。
-
-
- import com.netflix.discovery.DiscoveryManager;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RestController;
-
- /**
- * @author cm
- * @description: 测试服务下线
- * @date 2022/2/21 9:45
- */
- @RestController
- public class TestEureka {
-
- @RequestMapping(value = "/offLine", method = RequestMethod.GET)
- public void offLine() {
- // 虽然提示DiscoveryManager已经过时,不过不影响使用
- DiscoveryManager.getInstance().shutdownComponent();
- }
- }
需要服务下线时,直接调用该请求即可
请求为
http://eureka server的IP:端口/eureka/apps/实例名称/实例地址加端口
上面的请求只是暂时的下线了应用服务,服务本身没有下线,还会重新续约,所以在发送请求之前需要先把服务停掉。
可在服务器上执行更改应用服务状态
请求为
curl -X PUT "http://eureka server的IP:端口/eureka/apps/实例名称/实例地址加端口/status?value=OUT_OF_SERVICE"
此时服务变为不可用的状态,不会再接收请求
但是有个地方需要注意,即使应用服务重启并重新注册到eureka ,此时的状态还是OUT_OF_SERVICE
需要执行恢复命令
curl -X PUT "http://eureka server的IP:端口/eureka/apps/实例名称/实例地址加端口/status?value=UP"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。