当我们在服务器部署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. Linux--shel的if判断语句--05

    if条件语句的使用格式: 1.单分支语句 if [ 条件 ];then 执行语句 fi 注意:[ 条件 ] :条件与中括号要用空格分割:下面的语句同理. 2.双分支语句 if [ 条件 ];then ...

  2. 通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)

    1. 什么是RNN 循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环 ...

  3. PKI机制总结

    PKI,全称是Public Key Infrastructure,可译为公钥基础设施.它是因特网中节点通信的安全保障机制,HTTPS中的‘S’就来源于PKI. 要去学习一个技术,首先要从它的源头考虑— ...

  4. vue生成element左侧菜单

    首先来总结element ui 官方文档的左侧菜单结构,带有el-submenu为子级节点,el-menu-item表示没有下级.当然,菜单不能写死,因为菜单也许不止两级,所以我们需要递归来实现.根据 ...

  5. spring-boot-plus V1.2.1 发布 文件上传下载和静态资源访问

    [V1.2.1-RELEASE] 2019.08.21 ⭐️ New Features 文件上传保存到服务器指定目录 文件下载 访问上传的图片等资源 启用项目静态资源访问,可访问static/temp ...

  6. nodeCZBK-笔记2

    目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...

  7. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  8. Codeforces 246C

    题意略. 思路: 我们将数组中的数字从大到小排列,分别考虑取前0 + 1,1 + 1,2 + 1.....个的情况. 所谓i + 1的意思是,取前i个的时候,同时取第[i + 1],[i + 2],. ...

  9. awrcrt更新到2.17 ,添加了top SQL list

    应广大Oracle专家,教授的要求(被问了很多次,什么时候添加top sql 啊~~,最近一年由于很少交付巡检类的服务,所以没有机会更新)>终于为awrcrt更新了Top SQL list,版本 ...

  10. Joda学习笔记

       Joda Time简介 日常业务开发中,经常需要处理日期.比如:获取当前一个月之内的开播记录,获取十分钟之内的红包记录等等.我们之前是用java.util.Calendar实现的,直到我看到占小 ...