👨‍💼
Hamm Blog
个人主页GithubGitee
  • 🇨🇳Hi Welcome!
  • 📚分享文章
    • CentOS7
      • CentOS7安装Python3的方法
      • CentOS7搭建L2TP服务端一键脚本
      • CentOS7使用CertBot工具获取LetSencrypt泛域名HTTPS证书
    • Wechat
      • 微信公众号网页跳转避免出现导航栏的小技巧
      • 微信公众号php环境无法获取POST值
    • Git
      • GIT进行代码量统计和贡献统计
      • GIT删除仓库的历史提交记录脚本示例
    • HTTP
      • HTTP关于HEADER的详细解释
      • HTTP关于Code状态码的详细解释
      • HTTP协议对URI长度POST数据长度及COOKIE长度限制说明
    • JavaScript
      • 使用ElementUI配合API数据快速渲染合并表格
      • JavaScript调用语音合成Speech Synthesis API
      • JavaScript解析并遍历Excel示例代码
      • JavaScript下的RSA对称加密DEMO
    • MySQL
      • MySQL腾讯云数据库导出备份到本地服务器导入
      • MySQL设计与使用规范
      • MySQL在5.7及以上版本中的ONLY_FULL_GROUP_BY问题处理方案
      • MySQL字符串截取
    • PHP
      • PHP大文件视频上传WebUploader
      • PHP的坑XML转JSON
      • PHP多进程同时处理任务示例DEMO代码
      • PHP高精度计算常用代码
      • PHP获取上周、本周、上月、本月、本季度、上季度时间方法
      • PHP获取真实IP之IP代理 IP伪造 真实IP
      • PHP获取URL HTTP_HOST和SERVER_NAME
      • PHP简单实现QQ登录代码
      • PHP解密微信小程序手机号简单DEMO
      • PHP实现二叉查找树的简单代码实现
      • PHP实现微博登录简单代码
      • PHP实现Web方式发起一个超时任务的处理请求
      • PHP使用独占文件指针实现阻塞少量并发
      • PHP使用root权限执行系统命令和切换到www用户
      • PHP微信JSSDK开发DEMO
      • PHP下的RSA对称加解密 根证书自签与签发子证书
      • PHP下phpMyAdmin数据字典美化代码
      • PHP下RSA对称加密超长字符串分段加密DEMO
    • Nginx
      • Nginx反向代理中的Host参数传递遇到的坑
      • 利用Nginx实现Java后端在开发中的高可用
      • Nginx反向代理NodeJS实现WSS协议
      • Nginx负载均衡的lnmp环境初始化脚本
      • Nginx配置HTTPS与HTTP2.0
      • Nginx图片递归代理服务器DEMO
    • NodeJS
      • NodeJS控制台简单表格打印
      • NodeJS实现超级方便的Git自动发布Webhook
      • NodeJS实现串口通讯简单例程
      • NodeJS实现微信协议登录
      • NodeJS实现UDP数据报套接字通讯
      • NodeJS实现Websocket聊天室
      • NodeJS使用express模块无法收到phpCurl的值
      • NodeJS使用jimp和qrcode-reader识别解析二维码
      • NodeJS使用Request模块实现CURL
      • NodeJS一些冷门但实用的npm包
      • NodeJS转码amr到mp3
      • NWJS配置文件
    • Python
      • Python3实现Webhook
      • Python3使用jieba分词并生成WordCloud词云图
      • Python3使用Pool进程池实现多进程并发
      • Python3使用request进行CURL操作
      • Python3使用Selenium进行自动化测试手册
    • Linux
      • Linux 信号说明列表说明
      • Linux利用CronTab定时执行ThinkPHP命令行模式
  • 😍分享生活
    • 我有个锤子的生活
由 GitBook 提供支持
在本页
  1. 分享文章
  2. Nginx

利用Nginx实现Java后端在开发中的高可用

上一页Nginx反向代理中的Host参数传递遇到的坑下一页Nginx反向代理NodeJS实现WSS协议

//TODO 何为开发过程中的高可用

废话不多,不提面试那一套,我们今天简单说说。

众所周知,Java作为编译型语言的老大哥,不像PHP/ASP/JavaScript等解释性语言一样,直接改动代码后代码文件被解释器加载即可执行。

输入图片说明

然而,当我兴高采烈修完一个我凭本事写的BUG,准备神不知鬼不觉的发布到开发服务器,让前端的好兄弟发现不了我刚才那有BUG的接口

前端的好兄弟脸一沉。。。

”这已经是今天上班到现在第38次502了!“

啊这。。。草率了,忘了重启后端服务,Nginx会因为找不到后端负载而炸掉。。。

算了笔帐,每次重启服务粗略花掉2分钟,38次,也就是38*2=72分钟。。。难怪前端的哥们又出去抽烟了,好家伙,我直接好家伙。

想到老夫改Nginx,百度复制粘贴一把梭。

那就改造下Nginx吧

我们来实现Java服务重启过程中

让前端好兄弟们无感知

说简单点,叫开发阶段的API接口服务高可用

本质上还是下面的

负载均衡与灾备策略

伟大且牛逼的伊戈尔塞索耶夫 在修BUG的时候手一抖写出了Nginx

作为反向代理圈子里的小老弟

实现负载均衡可谓是不在话下

于是尝试在开发服务器上主服务的基础下

再起一个除了端口不同 其他一毛一样的服务

我且称之为”备胎服务“

那么 两个服务这会同时在跑了

http://127.0.0.1:8080 主服务 http://127.0.0.1:9090 备胎服务

接下来,我们改动下之前的Nginx服务配置:

改造前

server{
    listen 80;
    #***其他配置***
    location /api {
        proxy_pass http://127.0.0.1:8080;#主服务
        #***其他配置***
    }
}

改造后

upstream api_service{
    server 127.0.0.1:8080;        #主服务
    server 127.0.0.1:9090 backup; #备胎服务
}
server{
    listen 80;
    #***其他配置***
    location /api {
        proxy_pass http://api_service; #指定上面定义的上游负载名称
        #***其他配置***
    }
}

好家伙,直接重载nginx服务

接下来 kill掉主服务并重启

再次访问api

好家伙,我直接好家伙,前端的好兄弟应该不知道我重启了吧?

丝滑,Nice!

接下来,我就可以在修复BUG之后 在前端好兄弟神不知鬼不觉之中重启服务

(当然,交替重启主服务和备胎服务,保证两个环境代码差异到最低也是很重要的)

第二天

前端好兄弟端来了一杯卡布奇诺。

/**

  • 全剧终 **/

/**

  • 彩蛋:

  • 不定时更新,下次讲点什么工作中的小故事呢? **/

输入图片说明
输入图片说明
输入图片说明

(谁在叫我?)

📚