SpringBoot实战之优雅终止服务的方法

  

由于SpringBoot是一个微服务框架,其生产部署的方式也需要尽可能的简单,与常规的网络应用有着一个巨大的不同之处,它可以内嵌一个Web容器,如:Tomcat、Jetty等,不再需要将应用打包成容器规定的特定形式。

  

对于SpringBoot来说,打包成一个简单的Jar包直接使用java Jar即可启动,这是一种非常优雅的方式,但同时也带来了一定的问题,如:应用如何停止?在过去,应用程序是部署在特定的容器中的,使用容器提供的脚本可以优雅停服,但现在容器被内嵌了,脚本没有了,怎么办?直接杀是一种方式,但未免显得太过粗鲁,而且可能带来许多意想不到的问题。

  

既然我们能想到问题,框架的制定者也会想的到,那么他们有没有为我们准备好解决方案呢?答案是有的,下面我介绍下我了解到的几种方案。

  

<强> 1。使用端点

  

在SpringBoot官方文档的第4部分中介绍了为应用发布生产准备的各种特性,其中,通过致动器的HTTP端点,开发人员可以方便地对应用的监控与管理。

  

引入指定的起动器包:

        “org.springframework.boot: spring-boot-starter-actuator: $ {springbootVersion}”      

在应用程序。yml中打开如下两个配置,即可实现通过Http请求停止应用

        管理:   安全:   启用:假   端点:   关闭:   启用:真   之前      

操作命令如下:

        curl - x发布http://host 之前关闭      

但这种方式有一个非常严重的问题,那就是任意人都可以控制应用的停止,这对于一个生产应用无疑是不可接受的。有些人可能会想,现在的链接地址太简单了,非维护人员也可以轻易地猜出来,如果使用一个非常复杂的地址是否可以避免这个问题。很好,这个提议不错,那我们再看看SpringBoot为我们提供的相关配置。

        端点:   关闭:   启用:真   路径:/xxx      

配置完成后,上面的命令就不可用了,需更新命令为:

        curl - x发布http://host xxx      

其中的/xxx当然只是我随手设置的一个,你可以设置任意的地址。虽然安全性高了那么一点,但这样的安全级别仍然是无法应用到生产环境的。那是否还有其它的防护手段呢?有,除了修改关闭的路径外,我们还可以给所有的管理操作加上一个统一的上下文,配置独立的端口,并限制指定IP访问(一般限定为本机),配置如下:

        管理:   安全:   启用:假   端口:9001   地址:127.0.0.1   上下文路径:/admin      

变更后的停服命令为:

        curl - x发布http://127.0.0.1:9001/admin/xxx      

这样其实已经足够安全了,为了进一步的保证系统的安全,再给其加上一层HTTP基本认证。

  

增加安全依赖:

        “org.springframework.boot: spring-boot-starter-security: $ {springbootVersion}”      

修改配置文件如下:

        端点:   关闭:   启用:真   路径:/xxx   管理:   安全:   启用:真   端口:9001   地址:127.0.0.1   上下文路径:/管理   安全:   基本:   启用:真   路径:/管理   用户:   名称:根   密码:123456      

配置完成后,最终的停服命令为:

        根:curl - x POST - u 123456 http://127.0.0.1:9001/admin/xxx      

<强> 2。注册为系统服务

  

除了使用java jar运行SpringBoot应用程序外,还可以轻松地用init。d或systemd注册成Linux/Unix系统服务,这使得在生产环境中,安装和管理SpringBoot应用程序变得非常简单。

  

在Maven工程里面,为了创建一个“完全可执行”的jar,需要引入如下插件:

        & lt; plugin>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-maven-plugin   & lt; version> 1.5.2.RELEASE   & lt; configuration>   & lt; executable> true   & lt;/configuration>   & lt;/plugin>   之前      

在Gradle工程里面,等效配置如下:

        插件{   “org.springframework id。启动“版本”1.5.2.RELEASE”   }      springBoot {   可执行=true   }      

SpringBoot实战之优雅终止服务的方法