摘要
基于nginx的反向代理和负载均衡机制,可以部署一个多节点的web应用。再写个shell脚本实现简单的灰度机制,这样就能做到无损发布,下面废话不多说直接上干货吧!
nginx反向代理和负载均衡
对于什么是nginx,nginx能做些什么,如果不熟悉的朋友建议先看下这里
(全面了解Nginx到底能做什么:juejin.cn/post/684490… ),这里我就直接贴上个人配置了:
对于同个服务我在本地启动了两个节点,分别占用9999和9998两个端口,并且指定两个服务各负载的权重为1:1,nginx的监听端口为8091。这里proxy_next_upstream是nginx的重试机制,我配置的是当请求后端服务报500,502或者请求超时的时候,重试下一个节点。关于proxy_next_upstream机制的文章也很多( 例如:blog.csdn.net/zhuchunyan_… ),建议结合文档按需配置,需要注意的是non_idempotent选项,通常情况下,如果请求使用非等幂方法(POST、LOCK、PATCH等),请求失败后不会再到其他服务器进行重试。加上non_idempotent选项后,即使是非幂等请求类型(例如POST请求),发生错误后也会重试。所以如果加上了此配置,对于一些写请求可能会出现业务不幂等的情况,所以non_idempotent选项在实际应用中建议谨慎选择。
shell脚本实现灰度机制
有了nginx我们就可以写个shell脚本,来发布我们的服务,使得在发布版本的时候能做到用户无感知,也即无损发布或游戏行业通常说的热更新。我个人实现的如下,创建一个项目目录pj,然后再在pj目录下创建node1,node2节点目录,并把应用程序(server)以及配置文件(注意:同一台机器上端口要配置不一样的)等放在各节点的目录下,然后在pj目录下写启动脚本,具体启动脚本的内容如下(注:仅供参考,某些场景下可能存在bug)
然后各节点下的启动脚本和回退脚本如下,这里我就仅贴node1的了,node2的类似(注:仅供参考,某些场景下可能存在bug):
总结
以上就是我结合个人本地实际,构建的一个多节点的web应用,以及如何发布启动这个应用的例子。具体如何构建个人的多节点应用,各位要结合自己的实际情况(如服务器版本,nginx版本,服务本身是否适合等)来进行配置和修改启动脚本,如果不熟悉shell的话,也可以写一个程序来发布你的应用。