当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性。但同时对我们修改程序中的任何一处都带来重启服务的麻烦。如何解决这个问题呢?

测试用代码 github 下载

1 问题分析

为了能够解决这个问题,我们来分析下,为什么要重启服务,因为 Jar 中的内容发生了改变,大部分应用程式都加载了内存中,需要重新启动服务才能使用新的内容生效。实际上就是修改前访问的老版本的,修改后访问了新版本。我们使用 nginx 能够很好的解决这个问题。

2 nginx 解决方案

nginx 中使用 upstream 负载均衡机制实现热部署,也叫灰度发布,即在不停止用户访问的前提下进行系统更新。

2.1 nginx upstream 分发策略

upstream 机制使得 nginx 以反向代理的方式运行,因此Nginx接受客户端的请求,并根据客户端的请求,Nginx选择合适的后端服务器来处理改请求。

  1. 轮询

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,会自动剔除;

    upstream hotstart{
    server 127.0.0.1:8085;
    server 127.0.0.1:8086;
    }
  2. 权重

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况;

    upstream hotstart{
    server 127.0.0.1:8085 weight=2;
    server 127.0.0.1:8086 weight=1;
    }
  3. ip哈希算法

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端的服务器,可以解决session问题;

     upstream hotstart{
    ip_hash;
    server 127.0.0.1:8085;
    server 127.0.0.1:8086;
    }

2.2 nginx 配置负载均衡和分发

在服务器建立两个一模一样的站点分为为

  • 127.0.0.1:8085
  • 127.0.0.1:8086

配置 nginx.conf 文件

注意 hotstart.fishpro.com.cn 是我配置的,你可以配置为你自己的域名

upstream hotstart{
server 127.0.0.1:8085;
server 127.0.0.1:8086;
}
server{
listen 80;
server_name hotstart.fishpro.com.cn;
location / {
proxy_pass http://hotstart;
index index.html index.htm;
}
}

执行 nignx 更新命令

>ningx -s reload

nginx 详细配置

  • weight 访问权重
  • max_fails 最大失败次数
  • fail_timeout 最大失败等待时间
upstream hotstart{
server 127.0.0.1:8085 weight=1 max_fails=3 fail_timeout=20s;
server 127.0.0.1:8086 weight=1 max_fails=3 fail_timeout=20s;
}
server{
listen 80;
server_name hotstart.fishpro.com.cn;
location / {
proxy_pass http://hotstart;
index index.html index.htm;
}
}

编写测试用代码

测试用代码 github 下载

执行

java -Xms256m -Xmx512m  -jar hotstart-0.0.1-SNAPSHOT.jar  --server.port=8085
java -Xms256m -Xmx512m  -jar hotstart-0.0.1-SNAPSHOT.jar  --server.port=8086

访问站点 hotstart.fishpro.com.cn

查看结果后,我们关闭当前查看结果的站点 再次刷新,我们可以看出当一个站点停止服务,nginx 则访问另一个站点,这样我们就可以逐个站点来实现不需要中断用户访问来更新服务。

问题

多个站点如何共享会话 session

  • 通过 redis 等 nosql 中间件实现 session 共享
  • 通过配置 tomcat 服务实现
  • 其他解决方案

3 其他优化点

3.1 利用 nginx 把静态文件独立 jar 文件之外

我们知道静态文件使用 nginx 直接提供服务则更快更稳定,所以我们构件站点的时候直接把静态文件包括 css、js、image 等放在 jar 文件夹之外使用域名独立访问。也可以理解为 动静分离

关联阅读

Spring Boot 利用 nginx 实现生产环境的伪热更新的更多相关文章

  1. (33)Spring Boot 监控和管理生产环境【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http.jmx.ssh.telnet等拉管理和监控应用.审计 ...

  2. Spring Boot 集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  3. spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)

    一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...

  4. 51. spring boot属性文件之多环境配置【从零开始学Spring Boot】

    原本这个章节是要介绍<log4j多环境不同日志级别的控制的>但是没有这篇文章做基础的话,学习起来还是有点难度的,所以我们先一起了解下spring boot属性文件之多环境配置,当然文章中也 ...

  5. spring boot利用swagger和spring doc生成在线和离线文档

    参考博客地址: 在线文档:http://blog.didispace.com/springbootswagger2/ 离线文档:http://www.jianshu.com/p/af7a6f29bf4 ...

  6. VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址

    转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...

  7. 10: Django + Uwsgi + Nginx 的生产环境部署

    1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI:  最早的协议 2. FCGI:  比CGI快 ...

  8. Django + Uwsgi + Nginx 的生产环境部署实战

    目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...

  9. 11: Django + gunicorn + Nginx 的生产环境部署

    1.1 gunicorn介绍   1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...

随机推荐

  1. 守望先锋app(2)

    上次的功能完成了英雄名字.id.头像的下载并使用RecyclerView展示, 所以接下来就是点击每个英雄的caraview就能打开下一个活动进行英雄的介绍.先打开暴雪的官网查看有那些技能.故事.图片 ...

  2. django实现自定义manage命令的扩展

    在Django开发过程中我们都用过django-admin.py和manage.py命令. django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目.而manag ...

  3. 关于JSP页面的静态包含和动态包含

    JSP中有两种包含:静态包含:<%@include file="被包含页面"%> 和 动态包含:<jsp:include page="被包含页面&quo ...

  4. ubuntu 输出 log 基础

    自定义日志文件 nohup your_command > my_nohup.log 2>&1 & #(将日志输出在my_nohup.log文件中,并将stderr重定向至s ...

  5. Spring boot中的 JsonConverter

    上图是spring-web包的部分目录 为了找出调用了哪种类型的Convert 我找到父类 HttpMessageConverter 查看了它的引用 在spring-boot-autoconfigur ...

  6. Git 实用技巧:git stash

    我们经常会遇到这样的情况: 正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用git stash命令先把当前进度保存起来.然后切换 ...

  7. 既然synchronized是"万能"的,为什么还需要volatile呢?

    在我的博客和公众号中,发表过很多篇关于并发编程的文章,之前的文章中我们介绍过了两个在Java并发编程中比较重要的两个关键字:synchronized和volatile 我们简单回顾一下相关内容: 1. ...

  8. 建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

    我们的思路是每天下班后团队各成员在指定的时间(例如下午18:30)之前把各自的代码上传到SVN,然后服务器在指定的时间(例如下午18:30)更新代码.执行ant 打包命令.最后将apk包存放在指定目录 ...

  9. .netcore consul实现服务注册与发现-集群部署

    一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关 ...

  10. java 正则 替换中文为空

    //中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...