qq空間登陸 cookie_精:基於token的登陸驗證機制
Spring Data Redis
新增依賴:Spring Data Redis + 連線池(commos-pool2)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
<version>2.8.0</version>
</dependency>
配置Redis資訊
spring.redis.database=0
spring.redis.password=123
spring.redis.port=6379
spring.redis.host=127.0.0.1
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=10spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms
Spring Boot 中 Redis 的自動化配置類
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
自動化配置類理解:
-
首先標記這個是一個配置類,同時該配置在 RedisOperations 存在的情況下才會生效(即專案中引入了 Spring Data Redis)
-
然後匯入在 application.properties 中配置的屬性
-
然後再匯入連線池資訊(如果存在的話)
-
最後,提供了兩個 Bean ,RedisTemplate 和 StringRedisTemplate ,其中 StringRedisTemplate 是 RedisTemplate 的子類,兩個的方法基本一致,不同之處主要體現在操作的資料型別不同,RedisTemplate 中的兩個泛型都是 Object ,意味者儲存的 key 和 value 都可以是一個物件,而 StringRedisTemplate 的 兩個泛型都是 String ,意味者 StringRedisTemplate 的 key 和 value 都只能是字串。如果開發者沒有提供相關的 Bean ,這兩個配置就會生效,否則不會生效
Redis 中的資料操作,大體上來說,可以分為兩種:
-
針對 key 的操作,相關的方法就在 RedisTemplate 中
-
針對具體資料型別的操作,相關的方法需要首先獲取對應的資料型別,獲取相應資料型別的操作方法是 opsForXXX
Spring Boot 的自動化配置,只能配置單機的 Redis ,如果是 Redis 叢集,則所有的東西都需要自己手動配置
session共享
在傳統的單服務架構中,一般來說,只有一個伺服器,那麼不存在 Session 共享問題,但是在分散式/叢集專案中,Session 共享則是一個必須面對的問題
Spring Session 就是使用 Spring 中的代理過濾器,將所有的 Session 操作攔截下來,自動的將資料 同步到 Redis 中,或者自動的從 Redis 中讀取資料。
對於開發者來說,所有關於 Session 同步的操作都是透明的,開發者使用 Spring Session,一旦配置完成後,具體的用法就像使用一個普通的 Session 一樣
-
新增依賴,使用 Spring Boot2.1.5及以上的話,除了上面這些依賴之外,需要額外新增 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個依賴,當然也多了 Spring Security 的一些預設認證流程)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
-
配置Redis資訊
-
使用,配置完成後 ,就可以使用 Spring Session 了,其實就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已經自動幫你完成了
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/set")
public String set(HttpSession session) {
session.setAttribute("user", "javaboy");
return String.valueOf(port);
}
@GetMapping("/get")
public String get(HttpSession session) {
return session.getAttribute("user") + ":" + port;
}
}
使用兩個埠啟動兩個服務,訪問兩個服務能獲取同一session
-
引入Nginx
進入 Nginx 的安裝目錄的 conf 目錄下(預設是在 /usr/local/nginx/conf
),編輯 nginx.conf 檔案:
在這段配置中:
-
upstream 表示配置上游伺服器
-
javaboy.org 表示伺服器叢集的名字,這個可以隨意取名字
-
upstream 裡邊配置的是一個個的單獨服務
-
weight 表示服務的權重,意味者將有多少比例的請求從 Nginx 上轉發到該服務上
-
location 中的 proxy_pass 表示請求轉發的地址,
/
表示攔截到所有的請求,轉發轉發到剛剛配置好的服務叢集中 -
proxy_redirect 表示設定當發生重定向請求時,nginx 自動修正響應頭資料(預設是 Tomcat 返回重定向,此時重定向的地址是 Tomcat 的地址,我們需要將之修改使之成為 Nginx 的地址)。
配置完成後,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然後在 Linux 上分別啟動兩個 Spring Boot服務