利用Redis+Nginx实现Sping-Boot应用的负载均衡部署

来源:互联网 发布:简单bbs论坛源码php 编辑:程序博客网 时间:2024/06/18 14:49

利用Redis+Nginx实现Sping-Boot应用的负载均衡部署

@(个人博客)

众所周知,通过Nginx可以简单高效的实现对web后台服务负载均衡的需求。Nginx中内置权重等策略可动态配置实际连接每个后台进程的策略。

Spring-Boot是时下最为流行的web后台框架,其开箱即用的特性、与外部组件良好的集成性,越来越受到程序员们的青睐。

要实现多个Spring-Boot程序共同向外提供相同的web服务能力(每个进程拥有相同的能力,横向扩展),需要解决三个主要的问题:1、多进程间共享用户Session;2、每个进程需要无状态,特殊情况下需要共享的状态,需要集中化管理;3、对于某些一致性要求较高的场景,需要使用分布式锁进行相关逻辑控制。Spring-Boot提供与Redis无缝集成的能力来解决第一个问题,第二和第三个问题,需要读者自己根据自己应用的特点有针对性的解决。

这里写图片描述

1、Spring-Boot结合Redis实现外部用户Session

直接上干货,首先,我们需要在pom文件中引入redis和spring-Session的依赖:

<dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-redis</artifactId></dependency><dependency>        <groupId>org.springframework.session</groupId>        <artifactId>spring-session-data-redis</artifactId></dependency>

然后,我们需要在application.yml文件中配置一个redis,比如这样:

spring:    redis:        host: redis-session        port: 6379

这边作的配置比较简单,只设置了host和port,并且没有设置密码。实际上,spring-data-redis中会使用jedis连接池,而jedis连接池底层使用了comoms-pools2来管理连接对象,commons-pool2的配置,都可以在这边配置。
接着,需要新增一个配置类:

@Configuration@EnableRedisHttpSessionpublic class RedisSessionConfig {}

好吧,要做的事情已经做完了,使用spring-boot世界就是这么简单,这个时候不用修改原来的代码,所有的httpsession信息就会保存到redis中了,如下图所示:
这里写图片描述

2、配置Nginx连接多个Spring-Boot进程

Spring-Boot应用启动后,每个应用实例会对应一个端口,假设我们要对两个完全相同的应用实例进行负载均衡,其端口分别为8888和9999,那么Nginx可以如下配置:

upstream 127.0.0.1 {         server 192.168.1.180:8888 weight=1;         server 192.168.1.180:9999 weight=1;        }server {        listen       8080;        server_name  127.0.0.1;        location / {            proxy_pass        http://127.0.0.1;                 proxy_set_header  X-Real-IP  $remote_addr;                 proxy_http_version 1.1;            proxy_set_header Upgrade $http_upgrade;            proxy_set_header Connection "upgrade";        }       }

这个配置已经是支持websocket协议的标准配置了。Ngnix的配置还是比较复杂的,后面可以单独写一篇博文来说明。在配置负载均衡时,需要特别注意配置好http响应的超时时间,当一个应用实例宕机时,假如请求被分发到这个实例中,那么需要超时时间长度,原请求才会被转发到仍工作的应用实例中。那么,如果设置了一个很长的超时时间,那就有可能会导致某些请求响应非常慢的情况出现,这一点要特别注意。

3、总结

使用Spring-Boot+Ngnix+Redis实现后端的负载均衡,是比较清晰易懂的,对于应用实例不是特别多,又有一定负载均衡需求的场景,是一套性价比较高的解决方案。假如应用实例特别多,服务治理难度很大,就可以考虑使用微服务框架了,推介Spring-Cloud是一个不错的选择。