威尼斯人网站

读者,意林,半月谈,威尼斯人网站,三联威尼斯人网站周刊,青年文摘,国家人文历史,新财富杂志
当前位置: 主页 > 读者 > 印度福福堂药房:Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站

印度福福堂药房:Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站

威尼斯人网站时间:2019-07-25 01:13:47 作者:李小刚 点击:
"\u003Cdiv\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fdfic-imagehandler\u002Fb30b11b5-4418-4385-a5ba-42fa4bf6844a\" img_width=\"1024\" img_height=\"768\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Ch1\u003E\u003Cstrong\u003E前言\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E随着线上威尼斯人网站逐步采用 SpringBoot 构建,SpringBoot威尼斯人网站实例越来多,当线上某个威尼斯人网站需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止威尼斯人网站的方式会让威尼斯人网站将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 威尼斯人网站呢?那就通过本文一起来探究吧。(本文主要针对基于Spring Boot 内嵌 Tomcat 容器作为 Web 威尼斯人网站的威尼斯人网站)\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E环境支持\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003EJDK 8\u003C\u002Fli\u003E\u003Cli\u003ESpringBoot 2.1.4\u003C\u002Fli\u003E\u003Cli\u003EMaven 3.6.0\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fdfic-imagehandler\u002F02ca5b52-f99b-4e4f-9937-941e06a3eebf\" img_width=\"1200\" img_height=\"801\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Ch1\u003E\u003Cstrong\u003E定制 Tomcat Connector 行为\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E要平滑关闭 Spring Boot 威尼斯人网站的前提就是首先要关闭其内置的 Web 容器,不再处理外部新进入的请求。为了能让威尼斯人网站接受关闭事件通知的时候,保证当前 Tomcat 处理所有已经进入的请求,我们需要实现 TomcatConnectorCustomizer 接口,这个接口的源码十分简单,从注释可以看出这是实现自定义 Tomcat Connector 行为的回调接口:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002F59fafc3ab310494c9a77d4ee464b7192\" img_width=\"1000\" img_height=\"648\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这里如果小伙伴对 Connector 不太熟悉,我就简单描述下:Connector 属于 Tomcat 抽象组件,功能就是用来接受外部请求,以及内部传递,并返回响应内容,是Tomcat 中请求处理和响应的重要组件,具体实现有 HTTP Connector 和 AJP Connector。\u003C\u002Fp\u003E\u003Cp\u003E通过定制 Connector 的行为,我们就可以允许在请求处理完毕后进行 Tomcat 线程池的关闭,具体实现代码如下:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F195dc9ca21a74c9286965f45d9f1d6ad\" img_width=\"1000\" img_height=\"1026\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E上述代码定义的 TIMEOUT 变量为 Tomcat 线程池延时关闭的最大等待时间,一旦超过这个时间就会强制关闭线程池,也就无法处理所有请求了,我们通过控制 Tomcat 线程池的关闭时机,来实现优雅关闭 Web 威尼斯人网站的功能。另外需要注意的是我们的类 CustomShutdown 实现了 ApplicationListener 接口,意味着监听着 Spring 容器关闭的事件,即当前的 ApplicationContext 执行 close 方法。\u003C\u002Fp\u003E\u003Ch1\u003E内嵌 Tomcat 添加 Connector 回调\u003C\u002Fh1\u003E\u003Cp\u003E有了定制的 Connector 回调,我们需要在启动过程中添加到内嵌的 Tomcat 容器中,然后等待执行。那这一步又是如何实现的呢,可以参考下面代码:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F90a7b4f4713b4c69ba1835e68e2140b2\" img_width=\"1000\" img_height=\"345\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这里的 TomcatServletWebServerFactory 是 Spring Boot 实现内嵌 Tomcat 的工厂类,类似的其他 Web 容器,也有对应的工厂类如 JettyServletWebServerFactory,UndertowServletWebServerFactory。他们共同的特点就是继承同个抽象类 AbstractServletWebServerFactory,提供了 Web 容器默认的公共实现,如威尼斯人网站上下文设置,会话管理等。\u003C\u002Fp\u003E\u003Cp\u003E如果我们需要定义Spring Boot 内嵌的 Tomcat 容器时,就可以使用 TomcatServletWebServerFactory 来进行个性化定义,例如下方为官方文档提供自定示例:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F7f959a4eb4704b54bcb7e59365d1f61f\" img_width=\"1000\" img_height=\"300\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E好了说回正题,我们这里使用 addConnectorCustomizers 方法将自定义的 Connector 行为添加到内嵌的Tomcat 之上,为了查看加载效果,我们可以在 Spring Boot 程序启动后从容器中获取下webServerFactory 对象,然后威尼斯人网站,在它的 tomcatConnectorCustomizers 属性中可以看到已经有了 CustomeShutdown 对象。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002F1d6b60439f354c68886736d486947dfd\" img_width=\"1000\" img_height=\"418\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Ch1\u003E\u003Cstrong\u003E开启 Shutdown Endpoint\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E到目前让内嵌 Tomcat 容器平稳关闭的操作已经完成,接下来要做的就是如何关闭主动关闭 Spring 容器了,除了常规Linux 命令 Kill,我们可以利用 Spring Boot Actuator 来实现Spring 容器的远程关闭,怎么实现继续看\u003C\u002Fp\u003E\u003Cp\u003ESpring Boot Actuator 是 Spring Boot 的一大特性,它提供了丰富的功能来帮助我们监控和管理生产环境中运行的 Spring Boot 威尼斯人网站。我们可以通过 HTTP 或者 JMX 方式来对我们威尼斯人网站进行管理,除此之外,它为我们的威尼斯人网站提供了审计,威尼斯人网站状态和度量信息收集的功能,能帮助我们更全面地了解运行中的威尼斯人网站。\u003C\u002Fp\u003E\u003Cp\u003EActuator, ['æktʃʊˌeɪtə] 中文翻译过来就是制动器,这是一个制造业的术语,指的是用于控制某物的机械装置。\u003C\u002Fp\u003E\u003Cp\u003E在 Spring Boot Actuator 中也提供控制威尼斯人网站关闭的功能,所以我们要为威尼斯人网站引入 Spring Boot Actuator,具体方式就是要将对应的 starter 依赖添加到当前项目中,以 Maven 项目为例:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002Fc96227def4f242519e02e1a492493feb\" img_width=\"1000\" img_height=\"250\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003ESpring Boot Actuator 采用向外部暴露 Endpoint (端点)的方式来让我们与威尼斯人网站进行监控和管理,引入 spring-boot-starter-actuator 之后,我们就需要启用我们需要的 Shutdown Endpoint,在配置文件 application.properties 中,设置如下\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F9b1a3a86b98444e78e5db233ac3f688f\" img_width=\"1000\" img_height=\"125\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E第一行表示启用 Shutdown Endpoint ,第二行表示向外部以 HTTP 方式暴露所有 Endpoint,默认情况下除了 Shutdown Endpoint 之外,其他 Endpoint 都是启用的。\u003C\u002Fp\u003E\u003Cp\u003E除了 Shutdown Endpoint,Actuator Endpoint 还有十余种,有的是特定操作,比如 heapdump 转储内存日志;有的是信息展示,比如 health 显示威尼斯人网站威尼斯人网站状态。具体所有 Endpoint 信息可以参见官方文档-53. Endpoints 一节。\u003C\u002Fp\u003E\u003Cp\u003E到这里我们的前期配置工作就算完成了。当启动威尼斯人网站后,就可以通过POST 方式请求对应路径的 http:\u002F\u002Fhost:port\u002Factuator\u002Fshutdown来实现Spring Boot 威尼斯人网站远程关闭,是不是很简单呢。\u003C\u002Fp\u003E\u003Ch1\u003E\u003Cstrong\u003E模拟测试\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E这里为了模拟测试,我们首先模拟实现长达10s 时间处理业务的请求控制器 BusinessController,具体实现如下:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F475536eb2f6b430792d28016b2ce44aa\" img_width=\"1000\" img_height=\"507\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E用 Thread.sleep 来阻塞当前请求线程,模拟业务处理,在此同时用 HTTP 方式访问 Shutdown Endpoint 试图关闭威尼斯人网站,可以通过威尼斯人网站控制台日志看是否威尼斯人网站是否会完成请求的处理后才真正进行关闭。\u003C\u002Fp\u003E\u003Cp\u003E首先用 curl 命令模拟发送业务请求:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fa1d5fb2bab874b2aa0913c97b2d335dd\" img_width=\"1000\" img_height=\"102\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E然后在业务处理中,直接发送请求 actuator\u002Fshutdown,尝试关闭威尼斯人网站,同样采用 curl 方式:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Ffc09c7e1813d4dcdad76793ab53695a5\" img_width=\"1000\" img_height=\"102\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003Eactuator\u002Fshutdown 请求发送后会立即返回响应结果,但威尼斯人网站并不会停止:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fce8d5b609b7e4b5d85998e690f8496a6\" img_width=\"1000\" img_height=\"102\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E最后看下控制台的日志输出顺序:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F8e8058e10ba4466e83d0c2c8c39f613f\" img_width=\"1000\" img_height=\"123\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E可以看出在发送业务请求之后立刻发送关闭威尼斯人网站的请求,并不会立即将威尼斯人网站停止,而是在请求处理完毕之后,就是阻塞的 10s 后威尼斯人网站开始退出,这样可以保证已经接收到的请求能返回正常响应, 而关闭请求之后再进入的请求都不会被处理,到这里我们优雅关闭 Spring Boot 程序的操作就此实现了。\u003C\u002Fp\u003E\u003Ch1\u003E\u003Cstrong\u003E实现自动化\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E由于 Spring Boot 提供内嵌 Web 容器的便利性,我们经常将程序打包成 jar 然后威尼斯人网站。通常威尼斯人网站的启动和关闭操作流程是固定且重复的,本着 Don't Repeat Yourself 原则,我们有必要将这个操作过程自动化,将关闭和启用的 SpringBoot威尼斯人网站的操作写成 shell 脚本,以避免出现人为的差错,并且方便使用,提高操作效率。下面是我针对示例程序所写的程序启动脚本:(具体脚本可在示例项目查看)\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F42c5b0c554cb43fcb07c088ae552097b\" img_width=\"1000\" img_height=\"948\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E有了脚本,我们可以直接通过命令行方式平滑地更新部署 Spring Boot 程序,效果如下:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fc64ceca153ad4bf686b1ac18dbb420b6\" img_width=\"1000\" img_height=\"351\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Ch1\u003E\u003Cstrong\u003E总结\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E本文主要探究了如何对基于Spring Boot 内嵌 Tomcat 的 Web 威尼斯人网站进行平滑关闭的实现,如果采用其他 Web 容器也类似方式,希望这边文章有所帮助,若有错误或者不当之处,还请大家批评指正,一起学习交流。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fdfic-imagehandler\u002F9648c08b-a5a9-47d6-a888-ed9e8ffc2660\" img_width=\"1024\" img_height=\"680\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003EJava架构师丨苏先生:专注于Java开发技术的研究与知识分享!\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E————END————\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E点赞(感谢)\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E...\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E转发(感谢)\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E...\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E关注(感谢)\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E...\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F3e8e096e301d48cf950ca713a6fe14fd\" img_width=\"100\" img_height=\"100\" alt=\"Java微威尼斯人网站——如何优雅关闭 Spring Boot 威尼斯人网站\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E"'.slice(6, -6),
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
Here Is AD 250*250 !