需求缘由
最近接收了一个新的工具业务:ipublish发布系统,刚接手这个业务的时候,发现每次发布新的代码 需要到群里告知大家,我要停服务几分钟,准备更新代码啦。这尼玛 哪个公司都不敢这么牛逼的和用户说,我们网站要停服务几分钟,准备发布的。
基于这个原因我要对ipublish进行优化,如何优雅的发布代码,而用户是无感的
功能需求
发布系统自己更新迭代需求的过程中,不能停止服务,对用户是无感知的
实现设计方案
其实这个问题基本都知道解决方案,我这里就王婆卖瓜自卖自夸吧,来一张架构图
架构非常简单,通过一个LB作为反向代理,然后将所有请求转发到 后端的tomat ,后端有两个tomcat ,但是提供服务的只能是某一个tomcat
操作步骤
前提条件
LB 使用的Nginx 监听 80端口
配置两个tomcat 一个 8080 端口,一个 8081端口
Nginx
No.1 安装
#Ubuntu sudo apt-get install nginx #Centos sudo yum install nginx
No.2 配置
如下配置,我给大家截图下重点,可以看到 upstream 中有8080 8081两个配置,其中后面有一个down关键字,表示对应端口不提供服务,
upstream ipublish { server 127.0.0.1:8080 weight=1 down; server 127.0.0.1:8081 weight=1 ; } server { listen 80 default_server; server_name www.54php.cn; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://ipublish; } }
Tomcat
其实tomcat 非常容易安装,因为官网提供编译后的可以直接下载运行就行了,我们这里重点讲解如何配置两个tomcat 监听不同的端口
No.1 下载
官网下载地址,这里我们下载tomcat7, http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.78/bin/apache-tomcat-7.0.78.tar.gz
No.2 准备
下载完成后,将 压缩文件解压,加入解压之后 文件夹名称是apache_tomcat,此时我们复制出两个文件夹,名称分别是tomcat_8080,tomcat_8081,这两个目录就是用来配置两个端口
No.3 配置
以 tomcat_8080为例,tomcat_8081配置逻辑一样
修改 tomcat_8080/conf/server.xml
#找到如下地方,将port 改为7080(tomcat_8081的这个地方改为 7081) <Server port="8070" shutdown="SHUTDOWN"> #找到如下地方,将port 改为8080(tomcat_8081的这个地方改为 8081) <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改tomcat_8080/bin/start.sh
#找到如下地方,增加配置 # ----------------------------------------------------------------------------- # Start Script for the CATALINA Server # ----------------------------------------------------------------------------- export JAVA_VERSION=jdk1.8.0_101 export JAVA_HOME=/usr/local/$JAVA_VERSION export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/usr/local/tomcat_8080 #此处根据各种路径配置 export CATALINA_BASE=/usr/local/tomcat_8080 #此处根据各种路径配置
No.4 启动
例如开始提供服务的是tomcat_8080,然后我要更新东西的时候我就把代码放入tomcat_8081,然后启动8081端口的tomcat服务,由于java启动是需要时间的,所以等启动好了之后,我就把nignx 中的 upstream 8080端口加上down关键字,然后nginx reload,这样就是8081 对外提供服务,我在关闭8080服务,这样对用户就是无感更新了
效果展示
主要给大家展示一下我们风骚的ipublish系统 界面