Spring Boot 利用 nginx 实现生产环境的伪热更新
当我们在服务器部署Java程序,特别是使用了 Spring Boot
生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性。但同时对我们修改程序中的任何一处都带来重启服务的麻烦。如何解决这个问题呢?
1 问题分析
为了能够解决这个问题,我们来分析下,为什么要重启服务,因为 Jar
中的内容发生了改变,大部分应用程式都加载了内存中,需要重新启动服务才能使用新的内容生效。实际上就是修改前访问的老版本的,修改后访问了新版本。我们使用 nginx
能够很好的解决这个问题。
2 nginx 解决方案
在 nginx
中使用 upstream
负载均衡机制实现热部署,也叫灰度发布,即在不停止用户访问的前提下进行系统更新。
2.1 nginx upstream 分发策略
upstream
机制使得 nginx
以反向代理的方式运行,因此Nginx接受客户端的请求,并根据客户端的请求,Nginx选择合适的后端服务器来处理改请求。
轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,会自动剔除;upstream hotstart{
server 127.0.0.1:8085;
server 127.0.0.1:8086;
}
权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况;upstream hotstart{
server 127.0.0.1:8085 weight=2;
server 127.0.0.1:8086 weight=1;
}
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;
}
}
编写测试用代码
执行
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 实现生产环境的伪热更新的更多相关文章
- (33)Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http.jmx.ssh.telnet等拉管理和监控应用.审计 ...
- Spring Boot 集成Jsp与生产环境部署
一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...
- spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)
一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...
- 51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
原本这个章节是要介绍<log4j多环境不同日志级别的控制的>但是没有这篇文章做基础的话,学习起来还是有点难度的,所以我们先一起了解下spring boot属性文件之多环境配置,当然文章中也 ...
- spring boot利用swagger和spring doc生成在线和离线文档
参考博客地址: 在线文档:http://blog.didispace.com/springbootswagger2/ 离线文档:http://www.jianshu.com/p/af7a6f29bf4 ...
- VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址
转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...
- 10: Django + Uwsgi + Nginx 的生产环境部署
1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI: 最早的协议 2. FCGI: 比CGI快 ...
- Django + Uwsgi + Nginx 的生产环境部署实战
目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...
- 11: Django + gunicorn + Nginx 的生产环境部署
1.1 gunicorn介绍 1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...
随机推荐
- js拖拽上传图片
有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传. 1.后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候 ...
- intellIJ IDEA学习笔记3
intellij idea 的快捷鍵 https://blog.csdn.net/wei83523408/article/details/60472168 https://www.cnblogs.co ...
- linux应用问题分析命令
1. 描述 应用问题分析方式及命令有很多,一般都结合着使用,今天主要介绍下: (1)top命令,实时查看服务器资源使用情况,类似windows下的资源管理器: (2)tail命令,实时刷新查看日志命令 ...
- temperatureConversion1
(原题:https://www.python123.io/student/courses/934/groups/8102/problems/programmings/6078) Solution: # ...
- 苹果电脑基本设置+Linux 命令+Android 实战集锦
本文微信公众号「AndroidTraveler」首发. 背景 大多数应届毕业生在大学期间使用的比较多的是 windows 电脑,因此初入职场如果拿到一台苹果电脑,可能一时间不能够很快的上手.基于此,这 ...
- python+爬虫+微信机器人 打造属于你的网购价格监督利器
写在最前 程序是为人类服务的,最近正好身边小伙伴们在做球衣生意,当然是去nikenba专区购买了,可是有些热门球衣发布几分钟就被抢完,有些折扣球衣也是很快就被抢售一空,那么我们只能靠自己的眼睛一直盯着 ...
- Mysql高可用(HA)
MySQL特点: 1) 开放的源代码的关系型数据库 2) 适应于所有平台 3) 支持多线程,充分利用CPU资源,性能很出色 4) 价格便宜 5) 大数据库能处理5000万条记录. ACID 事务 一组 ...
- Mybatis mapper动态代理的原理详解
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出my ...
- 项目启动会(project initiating meeting)与项目开工会(kick-off meeting)区别
一.项目启动会initiating meeting 召开时间:是启动阶段结束时召开的会议:主要任务:发布项目章程,并任命项目经理,赋予项目经理动用组织资源的权力:注意事项:(1)会议召开前已经对干系人 ...
- java表达式
JAVA表达式优先级: (如果表达式复杂可直接括号处理) 资源来自尚学堂java视频