Mac系统下Spring Boot + Nginx实现负载均衡

Nginx多强大,对性能提升多大,作用是什么,这里不做解释了,百度上一大把。

安装下载工具:ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

查看是否安装好了brew: brew -v

在这里插入图片描述

下载Nginx:brew install nginx

在这里插入图片描述

检查下是否安装好了nginx: nginx -v

在这里插入图片描述

啟動nginx:sudo nginx

重啓nginx:sudo nginx -s reload

停止nginx: sudo nginx -s stop

sudo nginx -s quit // 完整有序的停止nginx/优雅关闭(先服务完已打开的连接)

然后,找到它的安装目录,这里注意,Mac中的安装目录一般是在etc下面,你如果使用where nginx 显示的是在bin目录下面,那个不是文件夹来的,打不开的,也没办法修改配置文件:cd /usr/local/etc/nginx

下一步,就是修改配置文件,使得它能负载均衡分发请求到你指定的IP地址和端口号:sudo vim ./nginx.conf

加入这么两段,注意端口不要再用8080了,因为nginx默认启动端口是8080,不要跟它抢位置,作为它的马仔的,还是避避老大的风头选择其他端口号吧:

在这里插入图片描述

每次修改完配置文件后都要重启一下:nginx -s reload

如果说permission denied 就 sudo nginx -s reload.

最后看看是否启动成功:浏览器随便输入:localhost:8080

在这里插入图片描述

看到这幅图就是说Nginx大佬接管你的请求了,所有到8080端口的请求,Nginx都会帮你做一层转发!

然后再到Spring Boot那边:

我们先修改启动端口,在application.properties文件那里,加上一句:server.port = 9090

加一个方法,输出当前的端口的:


    @Value("${server.port}")
    private String port;

	@RequestMapping("/testC")
    @ResponseBody
    public String testC() {
       return "当前端口号是:" + port;
    }
点击启动:

在这里插入图片描述

然后,点击右上角的edit configuration . 允许 run parallel。

在这里插入图片描述
在这里插入图片描述

然后再启动一个Application run !

在这里插入图片描述

这样,我们9090,9999端口的服务都做好了,接下来就是请求一个controller,让Nginx帮我们随机分配,在上面我们做的权重都是10,所以请求到两个端口的次数应该都是公平的。
测试:

第一次访问:
在这里插入图片描述
刷新一下:
在这里插入图片描述
再刷新一下:
在这里插入图片描述

不同场景下的选用,设想一下:

场景一:假如有个用户,登陆了之后,关于一些用户偏好的设置数据和登陆状态等等都存放在session中,第一次请求到9090端口没问题,第二次请求又去到9999的另外一台机器了,因为nginx不知道啊,因为另外一台服务器没有该用户的登陆信息,又要求用户登录,这样就非常不好。那我们就要想办法让该用户的请求全部只会去到一台机器,这个就是 分发策略中的: IP_Hash

在这里插入图片描述

加上一句话,Nginx就会默认把同一个IP地址发起的请求,都统一发送到一台服务器上进行处理,怎么验证呢?我在刚才的浏览器页面中,不管再刷新多少,也还会是同一个端口号~

在这里插入图片描述

这样证明了IP_HASH分发策略确实是可行。

场景二:现在有一组很大的数据,比如一大段视频资源图片资源或者信息,平时存放到Algolia之类的第三方数据库上,当用户请求的时候才下载下来。或者有一个接口是专门负责很复杂的很耗费资源一组逻辑计算的,同时会将计算结果保留在缓存中,例如实时游戏数据这些。如果我们采用普通的IP Hash,其实是没帮助的,因为我们不需要区分不同IP发起的请求。同时如果采用默认的RR分发策略,那么几乎每台服务器都会在缓存中放一组那么大的数据,每台都保存一份,这很明显不太必要。这个时候我们可以采用url_hash,也就是根据请求路径来进行分发,所有用户共享一台服务器缓存中的那堆数据。

当然也还有更多的例如动静分离,反向代理正向代理等等~~~虽然说我们开发中实际场景可能没有那么多情况,但是我个人想法就是了解全面了,当个知识储备,在有需要的时候,能够快速设计出完美的解决方案去解决问题。

后期再用虚拟机做下实验自己逐个去模拟不同生产环境下的特殊场景,配置文件nginx.conf那里,直接写不同虚拟机的IP和端口号。(个人推荐MacBook用这个)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/105839983