准备工作
在 Linux 上安装 redis 参考文章:阿里云 CentOS7安装redis4.0.9并开启远程访问
Spring Boot 官方提供了 spring-boot-starter-data-redis
依赖,可以很方便的操作 redis。
从 Spring Boot 2.1.5 版本之后,远程连接 Redis,必须使用 Spring Boot Security,当然,本地连接是不需要的。
redis 连接池有 lettuce 和 jedis 两种,Spring Boot 2.x.x 版本默认使用的 lettuce 客户端。
关于 lettuce 和 jedis 的异同,参考文章:Redis连接池Lettuce Jedis 区别
pom.xml 文件所需依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.properties 配置文件如下:
# 配置 Redis 的基本属性
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0
我在 Windows 本地安装的 redis,默认是没有密码,所以这里不需要配置密码。
如果要配置密码,参考文章:redis如何设置密码
示例
新建一个 HelloController
类,写入:
@RestController
public class HelloController {
@Autowired
StringRedisTemplate stringRedisTemplate;
@GetMapping("/set")
public void set(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
ops.set("name", "hahaha");
}
@GetMapping("/get")
public void get(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
System.out.println(ops.get("name"));
}
}
启动项目,先在浏览器访问 http://localhost:8080/set
,再访问 http://localhost:8080/get
,控制台的输出如下:
关于 StringRedisTemplate
这里用到了 StringRedisTemplate
,这是 Spring Boot 官方自带的操作 Redis 数据库的模板。
StringRedisTemplate
的源码如下:
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
可以看到,StringRedisTemplate 继承了 RedisTemplate,而 RedisTemplate 是在Spring Boot 中操作 redis 的基本模板。
利用 Redis 来实现 session 共享
在传统的单服务架构中,一般来说只有一个服务器,那么不存在 session 共享的问题。但是在分布式/集群项目中,session 共享是一个必须面对的问题。
解决 session 共享的方法,就是将各个服务之间需要共享的数据,保存到一个公共的地方(主流方案就是 Redis):
当所有 Tomcat 需要往 Session 中写数据时,都往 Redis 中写,当所有 Tomcat 需要读数据时,都从 Redis 中读。这样,不同的服务就可以使用相同的 Session 数据了。
session 共享示例
在 Spring Boot 中做 session 共享,主要使用依赖 spring-session-data-redis
。
相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
application.properties 配置文件:
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0
server.port=8080
基本配置完毕,接下来写个 HelloController
类:
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/set")
public String set(HttpSession session){
session.setAttribute("name", "fanqie");
return String.valueOf(port);
}
@GetMapping("/get")
public String get(HttpSession session){
return ((String) session.getAttribute("name")) + port;
}
}
将该项目打成 jar 包,分别在 8080 端口和 8081 端口运行,访问浏览器:http://localhost:8080/set
,再访问 http://localhost:8081/get
,可以看到两个服务的 session已经实现共享。
下图是存储在 Redis 中的 session 数据:
Nginx 简介
Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。
一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样:
在这样的架构中 , Nginx 所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx 上,再由 Nginx 根据提前配置好的转发规则,将客户端发来的请求转发到某一个 Tomcat 上去。
Nginx 所代表的,是服务端负载均衡服务器;对应的,在 Spring Cloud 中,RestTemplate 代表的是客户端负载均衡。
正向代理,指的是代理客户端,比如通过 VPN 访问谷歌,这就是正向代理;反向代理,指的是代理服务端,如 10086 ,它就是代理的话务员,而不是客户。
Nginx 的优势
-
使用 Nginx 做静态资源服务器
-
使用 Nginx 做负载均衡服务器
-
支持高并发、内存消耗少、成本低廉、配置简单、运行稳定等。
更多关于 Nginx 介绍和安装,参考文章:Nginx 极简入门教程!
每天学习一点点,每天进步一点点。