1.前言
大锯哥早上发布了 纯手工无缝升级JavaWeb微服务程序(不停机更新) 这篇文章,里面提到的无缝更新,好用。但是有适用范围的限制。
对于微服务结构来说,一个服务名后面对应多个相同的微服务。即使有一台微服务掉线,注册中心就会把请求发给别的微服务。只要仍有一台微服务是在线的,就不会停机,所以可以实现无缝更新。
而对于单体架构来说,没有注册中心,是做不到上述效果的。单体就没有办法吗?其实是有的。
我们使用低配版来实现无缝更新。完全无缝可能做不到,但是我们可以让这个缝隙变的很小。
思路就是:nginx反向代理。每次更新前,我们必定有两个程序,一个是旧的java程序,一个是新的java程序。但是我们让java程序不对外暴露端口,只暴露nginx的端口。每次用户访问java程序,本质是访问nginx,然后由nginx转发到指定的服务。
基于上述思路,我们就可以这样做:由nginx向外暴露端口,转发到具体的java程序。那么在更新时,首先不要停止旧的java服务,先启动新的java服务,两者端口需要不一致。当新的java服务启动正常后,我们去修改nginx的转发端口,把端口指向新的java服务。最后执行nginx -s reload 即可轻松的切换转发地址。重载nginx的配置文件耗时相当短暂,这样就实现了 低配的无缝更新。
这其实就是负载均衡的配置。
2.具体nginx配置
nginx的配置文件就是nginx.conf,打开它,在http块下,添加一个server块:
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:9993
}
}
上面的配置意思是:nginx占用8081端口,用户访问8081时,会转发到http://127.0.0.1:9993端口。对于一个计算机内部,不需要指定https,https的证书大可配置给nginx就行。
每次更新时,只需要修改proxy_pass指向的端口即可,修改后执行 nginx -s reload
重新加载配置文件即可