使用Springboot实现Nginx均衡负载功能
**
使用Springboot实现Nginx均衡负载功能
** 1.什么是Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 2.Nginx的特点之一:负载均衡 什么是负载均衡呢,引用网上大佬的一段话:
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。 针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。 负载均衡主要是两种,一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的;一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略。 (来自“一枝花算不算浪漫”大佬的博客) (感谢瞿永超大佬在processon上分享的示意图)
简而言之,负载均衡就是通过一个代理服务器来对用户的业务量进行分担处理。
下面进入正题,如何使用springboot实现nginx的负载均衡呢
1.首先创建两个springboot项目,端口分别用8081和8082启动: 项目nginx1的IndexController类:
@RestController public class HelloController { @RequestMapping(value = "/index",method = RequestMethod.GET) public String say(){return "这是8081端口";} }
application.yml:
server: port: 8081
项目nginx2的IndexController类:
@RestController public class HelloController { @RequestMapping(value = "/index",method = RequestMethod.GET) public String say(){return "这是8082端口";} }
application.yml:
server: port: 8082
PS:这里仅仅做了基础的返回字符串的功能,表明这是两个不同的服务器端口方便后面测试负载均衡功能。
2.下载安装Nginx(Windows版) 大家可以在()自行下载稳定版Nginx,下载下来是一个压缩包,解压即可使用。 解压完是这样的: 可以直接双击nginx.exe打开Nginx,但笔者不推荐这样操作,因为想要关闭还要通过任务管理器,并可能造成不可知的问题。这里推荐的是使用控制台指令:
- 查看Nginx的版本号:nginx -V
- 启动Nginx:start nginx
- 快速停止或关闭Nginx:nginx -s stop
- 正常停止或关闭Nginx:nginx -s quit
- 配置文件修改重装载命令:nginx -s reload
通过控制台启动Nginx: 打开浏览器输入“locallost”,就可以看到这个页面,表明启动成功:
3.更改Nginx配置 找到conf文件下的nginx.conf文件,用记事本打开编辑内部内容:
#服务器的集群 upstream xxx.com{ #服务器集群名字 server 127.0.0.1:8081 weight=1;#服务器配置 weight是权重的意思,权重越大,分配的概率越大。 server 127.0.0.1:8082 weight=2; } server { listen 80;#监听80端口 location /{ proxy_pass http://xxx.com/index;#服务器集群路径 } }
保存文件,并在控制台输入nginx -s reload更新nginx配置,可以通过浏览器或者postman(推荐,没有缓存问题)测试,输入localhost可以看见返回的是8081或者8082的信息,表明每次访问的端口都是不一样的,负载均衡实现了。