SpringCloud分布式Session共享同步

通常情況下,Tomcat、Jetty等Servlet容器,會(huì)默認(rèn)將Session保存在內(nèi)存中。如果是單個(gè)服務(wù)器實(shí)例的應(yīng)用,將Session保存在服務(wù)器內(nèi)存中是一個(gè)非常好的方案。但是這種方案有一個(gè)缺點(diǎn),就是不利于擴(kuò)展。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、麻栗坡網(wǎng)站維護(hù)、網(wǎng)站推廣。

目前越來(lái)越多的應(yīng)用采用分布式部署,用于實(shí)現(xiàn)高可用性和負(fù)載均衡等。那么問(wèn)題來(lái)了,如果將同一個(gè)應(yīng)用部署在多個(gè)服務(wù)器上通過(guò)負(fù)載均衡對(duì)外提供訪問(wèn),如何實(shí)現(xiàn)Session共享?

實(shí)際上實(shí)現(xiàn)Session共享的方案很多,其中一種常用的就是使用Tomcat、Jetty等服務(wù)器提供的Session共享功能,將Session的內(nèi)容統(tǒng)一存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)(如MySQL)或緩存(如redis)中。

下面我們將在springcloud微服務(wù)項(xiàng)目中,使用redis實(shí)現(xiàn)簡(jiǎn)單高效的session共享。官網(wǎng):www.fhadmin.org

  • eureka-server:注冊(cè)中心

  • springcloud-session-redis:業(yè)務(wù)session所在項(xiàng)目

  • springcloud-session-zuul:路由網(wǎng)關(guān)

springcloud-session-redis項(xiàng)目

新建一個(gè)spring boot項(xiàng)目,命名springcloud-session-redis

pom

<?xml?version="1.0"?encoding="UTF-8"?>
<project?xmlns="http://maven.apache.org/POM/4.0.0"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">
????<modelVersion>4.0.0</modelVersion>

????<groupId>com.carry</groupId>
????<artifactId>springcloud-session-redis</artifactId>
????<version>0.0.1-SNAPSHOT</version>
????<packaging>jar</packaging>

????<name>springcloud-session-redis</name>
????<description>Demo?project?for?Spring?Boot</description>

????<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter-parent</artifactId>
????????<version>2.0.4.RELEASE</version>
????????<relativePath?/>?<!--?lookup?parent?from?repository?-->
????</parent>

????<properties>
????????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
????????<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
????????<java.version>1.8</java.version>
????????<spring-cloud.version>Finchley.SR1</spring-cloud.version>
????</properties>

????<dependencies>
????????<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>
????????<dependency>
????????????<groupId>org.apache.commons</groupId>
????????????<artifactId>commons-pool2</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-starter-web</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-starter-actuator</artifactId>
????????</dependency>

????</dependencies>

????<dependencyManagement>
????????<dependencies>
????????????<dependency>
????????????????<groupId>org.springframework.cloud</groupId>
????????????????<artifactId>spring-cloud-dependencies</artifactId>
????????????????<version>${spring-cloud.version}</version>
????????????????<type>pom</type>
????????????????<scope>import</scope>
????????????</dependency>
????????</dependencies>
????</dependencyManagement>

????<build>
????????<plugins>
????????????<plugin>
????????????????<groupId>org.springframework.boot</groupId>
????????????????<artifactId>spring-boot-maven-plugin</artifactId>
????????????</plugin>
????????</plugins>
????</build>


</project>

配置文件

在application.yml中加入redis、eureka、port等配

server:
??port:?8090
spring:
??application:
????name:?service-session-redis
??redis:
????host:?192.168.68.100
????port:?6379
????password:?123456
????timeout:?6000ms
????lettuce:
??????pool:
????????max-active:?8
????????max-wait:?-1ms
????????max-idle:?8
????????min-idle:?0
????database:?0
eureka:
??client:
????serviceUrl:
??????defaultZone:?http://admin:123456@localhost:8761/eureka/
management:?
??endpoints:
????web:
??????exposure:?
????????include:?"*"
??????cors:
????????allowed-origins:?"*"
????????allowed-methods:?"*"

Redis Session配置類(lèi)

package?com.carry.config;

import?org.springframework.context.annotation.Configuration;
import?org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public?class?RedisSessionConfig?{

}

控制層Controller中添加測(cè)試方法

package?com.carry.controller;

import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpSession;

import?org.springframework.cloud.context.config.annotation.RefreshScope;
import?org.springframework.util.StringUtils;
import?org.springframework.web.bind.annotation.GetMapping;
import?org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public?class?UserManagementController?{

????/**
?????*?redis?sesion共享
?????*?
?????*?@param?request
?????*?@return
?????*/
????@GetMapping("/getUser")
????public?String?getUser(HttpServletRequest?request)?{
????????HttpSession?session?=?request.getSession();
????????String?username?=?(String)?session.getAttribute("username");
????????if?(StringUtils.isEmpty(username))?{
????????????username?=?"testSessionRedis|"?+?System.currentTimeMillis();
????????????session.setAttribute("username",?username);
????????}
????????System.out.println("訪問(wèn)端口:"?+?request.getServerPort());
????????return?username;
????}
}

springcloud-session-zuul項(xiàng)目

新建springboot項(xiàng)目,命名springcloud-session-zuul

POM依賴(lài)配置

<?xml?version="1.0"?encoding="UTF-8"?>
<project?xmlns="http://maven.apache.org/POM/4.0.0"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">
????<modelVersion>4.0.0</modelVersion>

????<groupId>com.carry</groupId>
????<artifactId>springcloud-session-zuul</artifactId>
????<version>0.0.1-SNAPSHOT</version>
????<packaging>jar</packaging>

????<name>springcloud-session-zuul</name>
????<description>Demo?project?for?Spring?Boot</description>

????<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter-parent</artifactId>
????????<version>2.0.4.RELEASE</version>
????????<relativePath?/>?<!--?lookup?parent?from?repository?-->
????</parent>

????<properties>
????????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
????????<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
????????<java.version>1.8</java.version>
????????<spring-cloud.version>Finchley.SR1</spring-cloud.version>
????</properties>

????<dependencies>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
????????</dependency>
????</dependencies>

????<dependencyManagement>
????????<dependencies>
????????????<dependency>
????????????????<groupId>org.springframework.cloud</groupId>
????????????????<artifactId>spring-cloud-dependencies</artifactId>
????????????????<version>${spring-cloud.version}</version>
????????????????<type>pom</type>
????????????????<scope>import</scope>
????????????</dependency>
????????</dependencies>
????</dependencyManagement>

????<build>
????????<plugins>
????????????<plugin>
????????????????<groupId>org.springframework.boot</groupId>
????????????????<artifactId>spring-boot-maven-plugin</artifactId>
????????????</plugin>
????????</plugins>
????</build>


</project>

配置文件

server:
??port:?1100
spring:
??application:
????name:?service-session-zuul
zuul:?
??ignoredServices:?'*'?#忽略所有未配置的service
??host:
????connect-timeout-millis:?20000
????socket-timeout-millis:?20000
??routes:
????redis-session-service:?
??????path:?/user-session/**
??????serviceId:?service-session-redis
??????sensitiveHeaders:?"*"?
ribbon:?#ribbon負(fù)載均衡參數(shù)配置
??ReadTimeout:?5000
??ConnectTimeout:?5000
eureka:
??client:
????serviceUrl:
??????defaultZone:?http://admin:123456@localhost:8761/eureka/

啟動(dòng)類(lèi)

package?com.carry;

import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import?org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableEurekaClient
@SpringBootApplication
@EnableZuulProxy
public?class?SpringcloudSessionZuulApplication?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(SpringcloudSessionZuulApplication.class,?args);
????}
}

當(dāng)前標(biāo)題:SpringCloud分布式Session共享同步
轉(zhuǎn)載來(lái)源:http://bm7419.com/article30/goscso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣、靜態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)用戶(hù)體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)