在很多时候 kill -9 pid
并不是很友好的方法,那样会将我们正在执行请求给断掉,同时eureka
中服务依旧是处于在线状态,这个时候我们可以使用官方提供的actuator
来做优雅的关闭处理
- Actuator
spring-boot-actuator
模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。审计(Auditing)、健康(health)、数据采集(metrics gathering)会自动加入到应用里面。
- 开始
如果对Eureka
不熟悉的可以参考:一起来学SpringCloud之-注册中心(Eureka/Consul)
- battcn-cloud-discovery
pom.xml导入eureka-server
包
1 2 3 4 5 6
|
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
|
application.yml 配置内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
server: port: 7001 spring: application: name: battcn-cloud-discovery eureka: instance: hostname: localhost prefer-ip-address: true client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
|
DiscoveryApplication 主函数启动类
1 2 3 4 5 6 7
|
@SpringBootApplication @EnableEurekaServer public class DiscoveryApplication { public static void main(String[] args) { SpringApplication.run(DiscoveryApplication.class, args); } }
|
- battcn-cloud-hello
pom.xml导入eureka
和actuator
,注意该处不能用tomcat
(原因还没找到,用tomcat报错,有兴趣的可以自己也试试)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
|
application.yml 配置内容
1 2 3 4 5 6 7 8 9 10 11
|
server.port: 7002 spring.application.name: battcn-cloud-hello endpoints.shutdown.enabled: true #开启优雅关闭方式 management.security.enabled: false #关闭安全认证 eureka: instance: hostname: localhost prefer-ip-address: true client: service-url: defaultZone: http://${eureka.instance.hostname}:7001/eureka/
|
HelloApplication 主函数与测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication @EnableDiscoveryClient @RestController public class HelloApplication { static Logger LOGGER = LoggerFactory.getLogger(HelloApplication.class); @GetMapping("/h1") public void home() { for (int i = 1;i < 6;i++) { try { Thread.sleep(i * 500); } catch (InterruptedException e) { e.printStackTrace(); } LOGGER.info("[当前进度] - [{}]",i); } }
public static void main(String[] args) { SpringApplication.run(HelloApplication.class, args); } }
|
- 测试
1.分别启动battcn-cloud-discovery
和 battcn-cloud-hello
两个服务
2.GET请求访问 http://192.168.206.1:7002/h1
3.POST请求访问:http://192.168.206.1:7002/shutdown
PostMan
- 日志分析
1 2 3 4
|
2017-08-20 11:50:38.257 INFO 6776 --- [nio-7001-exec-3] c.n.e.registry.AbstractInstanceRegistry : Registered instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 with status DOWN (replication=false) 2017-08-20 11:50:38.259 INFO 6776 --- [nio-7001-exec-8] c.n.e.registry.AbstractInstanceRegistry : Cancelled instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 (replication=false) 2017-08-20 11:50:38.765 INFO 6776 --- [nio-7001-exec-5] c.n.e.registry.AbstractInstanceRegistry : Registered instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 with status DOWN (replication=true) 2017-08-20 11:50:38.766 INFO 6776 --- [nio-7001-exec-5] c.n.e.registry.AbstractInstanceRegistry : Cancelled instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 (replication=true)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
2017-08-20 11:50:34.911 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [1] 2017-08-20 11:50:35.912 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [2] 2017-08-20 11:50:37.413 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [3] 2017-08-20 11:50:38.251 INFO 1304 --- [ Thread-28] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1c481ff2: startup date [Sun Aug 20 11:50:24 CST 2017]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@60dcc9fe 2017-08-20 11:50:38.252 INFO 1304 --- [ Thread-28] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application battcn-cloud-hello with eureka with status DOWN 2017-08-20 11:50:38.252 WARN 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1503201038252, current=DOWN, previous=UP] 2017-08-20 11:50:38.252 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ... 2017-08-20 11:50:38.252 INFO 1304 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002: registering service... 2017-08-20 11:50:38.253 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Unregistering ... 2017-08-20 11:50:38.258 INFO 1304 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 - registration status: 204 2017-08-20 11:50:38.260 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 - deregister status: 200 2017-08-20 11:50:38.264 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient 2017-08-20 11:50:38.265 INFO 1304 --- [ Thread-28] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0 2017-08-20 11:50:38.269 INFO 1304 --- [ Thread-28] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown 2017-08-20 11:50:38.270 INFO 1304 --- [ Thread-28] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans 2017-08-20 11:50:38.283 INFO 1304 --- [ Thread-28] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@622fdb81{HTTP/1.1,[http/1.1]}{0.0.0.0:7002} 2017-08-20 11:50:38.283 INFO 1304 --- [ Thread-28] org.eclipse.jetty.server.session : Stopped scavenging 2017-08-20 11:50:38.290 INFO 1304 --- [ Thread-28] o.e.j.s.h.ContextHandler.application : Destroying Spring FrameworkServlet 'dispatcherServlet' 2017-08-20 11:50:38.291 INFO 1304 --- [ Thread-28] o.e.jetty.server.handler.ContextHandler : Stopped o.s.b.c.e.j.JettyEmbeddedWebAppContext@987455b{/,[file:///C:/Users/Levin/AppData/Local/Temp/jetty-docbase.3368921683179226836.7002/],UNAVAILABLE} 2017-08-20 11:50:39.414 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [4] 2017-08-20 11:50:41.915 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [5]
|
从上述两端日志中可以看出,当我们发送shutdown
命令的时候,会先通知eureka
做服务下线处理,防止后续请求继续获取服务列表,然后当前服务的请求会继续执行,直到处理完毕后关闭进程,有兴趣的可以自己看看org.springframework.boot.actuate.endpoint.ShutdownEndpoint
- 7.Go退出向Consuk反注册服务,优雅关闭服务
注册和反注册代码 package utils import ( consulapi "github.com/hashicorp/consul/api" "log" ...
- 优雅关闭web服务的方式
优雅关闭web服务 DBHelper, err = gorm.Open("mysql", "root:root@(115.159.59.129:3306)/test?ch ...
- springcloud优雅停止上下线与熔断
SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ...
- SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2)
SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2) 优雅停止&暴力停止 暴力停止:像日常开发过程中,测试区或者本地开发时,我们并不会考虑项目关 ...
- Eureka服务下线后快速感知配置
现在由于eureka服务越来越多,发现服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化,依旧还在持续调用下线的服务,导致长时间后才能返回错误,因此需要调整eureka服务和客户端的配置,以 ...
- SpringBoot系列: 如何优雅停止服务
============================背景============================在系统生命周期中, 免不了要做升级部署, 对于关键服务, 我们应该能做到不停服务完成 ...
- 如何优雅关闭 Spring Boot 应用
## 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理 ...
- Springboot 优雅停止服务的几种方法
在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接退出 ...
- Netty源码剖析-关闭服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 先在服务端加个断点和修改下代码:如 ...
随机推荐
- java中Timer类的详细介绍(详解)
一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...
- java实现第四届蓝桥杯世纪末星期
世纪末星期 题目描述 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会- 有趣的是,任何一个世纪末的年份的12月31日都不 ...
- java实现第六届蓝桥杯打印菱形
打印菱形 给出菱形的边长,在控制台上打印出一个菱形来. 为了便于比对空格,我们把空格用句点代替. 当边长为8时,菱形为: .......* ......*.* .....*...* ....*.... ...
- 运行ABP(asp.net core 3.X+Vue)提示'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。
创建ASP.NET Boilerplate,还原数据库和启动客户端 这里就略过,具体参考 ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) ASP.NET Boilerpl ...
- AddDbContext was called with configuration, but the context type 'MyDBContext' only declares a parameterless constructor
System.ArgumentException HResult=0x80070057 Message=AddDbContext was called with configuration, but ...
- PL/SQL编程急速上手
结构化查询语言(SQL)是第四代编程语言的典型,这种命令式的语言更像一种指令,使用它,你只需要告诉计算机“做什么”,而不用告诉计算机“怎么做”.第四代编程语言普遍具有简单.易学.能更快的投入生产等优点 ...
- Redis学习笔记(十七) 集群(上)
Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作. 一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含 ...
- Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!
一.安装 Autoware & ZED 内参标定 & 外参标定准备 之前的这篇文章:Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定! 记录了我用 ...
- 线性代数的28法则:作为程序员掌握这些API就够用了……
目录 1. 向量 & 矩阵 1.1. 问: np.ndarray 与 np.matrix 的区别 1.2. 向量空间 2. 算术运算 2.1. 为什么线性代数定义的乘积运算不按照加法的规则(按 ...
- @bzoj - 2595@ 游览计划
目录 @description@ @solution@ @accepted code@ @details@ @description@ 从未来过绍兴的小D有幸参加了Winter Camp 2008,他 ...