봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

어떤 사람들은 사실,해도 과언이 제목은 어떤 미사 여구를 사용하지 않는, 조금 과장된 제목을 느낄 수 있습니다! 조심스럽게이 기사를 읽고, 당신은 노래 창은 바로 말했다 알게 될 것이다!

<! - 더 ->

기존의 단일 서비스 아키텍처에서, 일반적으로 하나 개의 서버가 세션 문제를 공유하지 않지만, 분산 / 클러스터 프로젝트에서 세션 공유가 직면 할 수있는 문제이다, 우리는 간단한 아키텍처 다이어그램을보고 :

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

이 아키텍처에서, 어떤 하나의 서비스에 문제가 예를 들어, 클라이언트가 톰캣 (A)에 Nginx에를 전달 요청, Nginx에에 도착 후 요청을 시작, 존재하지 않는이있을 것이다, 다음 세션에 톰캣에 저장됩니다 이 시간에 다시 다음 요청, 요청이 톰캣 B로 전달되는 데이터, 일부 데이터가 발견되지 전에 세션, 수집 된 데이터를 이동합니다. 이러한 문제를 해결하기 위해, 아이디어는 매우 간단 공공 장소에 저장된 다양한 서비스간에 데이터를 공유 할 필요가있다 (주류 프로그램 레디 스) :

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

모든 Tomcat은 모든 톰캣은 레디 스에서 읽은 데이터를 읽을 필요가있을 때, 쓰기, 모두 레디 스를 세션에 데이터를 작성해야합니다. 이러한 방법으로, 다른 서비스가 동일한 세션 데이터를 사용할 수 있습니다.

이러한 솔루션은 레디 스에 직접 데이터를 저장하는 현상 제에 의해 직접 얻을 수 수동 수동 또는 작업 수행이 함수 의심을 달성하기 레디 스 클라이언트 도구들을 사용하는 것과 등가, 레디 스로부터 데이터를 읽어 꽤 큰.

단순화 된 방식이 세션 스프링 기능을 달성하기 위해 사용되는 스프링 세션 프록시 필터 스프링에 사용되는, 세션이 인터셉트 모든 작업 데이터가 자동 레디 스 동기화 또는 자동 레디 스로부터 판독 될 데이터입니다.

구성이 동일한 일반 세션을 사용하여 같은 전체, 특정 사용이되면 개발자, 세션 동기화 작업이 투명 모두에 대해, 개발자, 봄 세션을 사용합니다.

1 개 전투

1.1 프로젝트 만들기

首先 创建一个 Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

创建成功之后,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>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
</dependencies>

注意:

这里我使用的 Spring Boot 版本是 2.1.4 ,如果使用当前最新版 Spring Boot2.1.5 的话,除了上面这些依赖之外,需要额外添加 Spring Security 依赖(其他操作不受影响,仅仅只是多了一个依赖,当然也多了 Spring Security 的一些默认认证流程)。

1.2 配置 Redis

spring.redis.host=192.168.66.128
spring.redis.port=6379
spring.redis.password=123
spring.redis.database=0

这里的 Redis ,我虽然配置了四行,但是考虑到端口默认就是 6379 ,database 默认就是 0,所以真正要配置的,其实就是两行。

1.3 使用

配置完成后 ,就可以使用 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;
    }
}

考虑到一会 Spring Boot 将以集群的方式启动 ,为了获取每一个请求到底是哪一个 Spring Boot 提供的服务,需要在每次请求时返回当前服务的端口号,因此这里我注入了 server.port 。

接下来 ,项目打包:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

打包之后,启动项目的两个实例:

java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8081

然后先访问 localhost:8080/set8080 这个服务的 Session 中保存一个变量,访问完成后,数据就已经自动同步到 Redis 中 了 :

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

然后,再调用 localhost:8081/get 接口,就可以获取到 8080 服务的 session 中的数据:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

此时关于 session 共享的配置就已经全部完成了,session 共享的效果我们已经看到了,但是每次访问都是我自己手动切换服务实例,因此,接下来我们来引入 Nginx ,实现服务实例自动切换。

1.4 引入 Nginx

很简单,进入 Nginx 的安装目录的 conf 目录下(默认是在 /usr/local/nginx/conf),编辑 nginx.conf 文件:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

在这段配置中:

  1. upstream 表示配置上游服务器
  2. javaboy.org 表示服务器集群的名字,这个可以随意取名字
  3. upstream 里边配置的是一个个的单独服务
  4. weight 表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上
  5. location 中的 proxy_pass 表示请求转发的地址,/ 表示拦截到所有的请求,转发转发到刚刚配置好的服务集群中
  6. proxy_redirect 表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)。

配置完成后,将本地的 Spring Boot 打包好的 jar 上传到 Linux ,然后在 Linux 上分别启动两个 Spring Boot 实例:

nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080 &
nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8081 &

其中

  • nohup 表示当终端关闭时,Spring Boot 不要停止运行
  • & 表示让 Spring Boot 在后台启动

配置完成后,重启 Nginx:

/usr/local/nginx/sbin/nginx -s reload

Nginx 启动成功后,我们首先手动清除 Redis 上的数据,然后访问 192.168.66.128/set 表示向 session 中保存数据,这个请求首先会到达 Nginx 上,再由 Nginx 转发给某一个 Spring Boot 实例:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

如上,表示端口为 8081Spring Boot 处理了这个 /set 请求,再访问 /get 请求:

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

可以看到,/get 请求是被端口为 8080 的服务所处理的。

2 总结

이 논문은 긴 글이지만, 그러나 구성의 사실 아무것도 봄 세션에서, 일부 사용의 Nginx을 포함 할뿐만 아니라, 봄 세션의 사용을 소개합니다.

우리는 몇 가지 구성을 수행하는 몇 가지 코드를 썼다 있지만, 모든 관련이없는 봄 세션 구성은 레디 스를 구성, 코드는 일반 HttpSession이, 봄 세션 할 수있는 아무것도입니다!

봄 세션 아마도 독특한 관련, 나는 그것의 의존의 봄 세션의 시작 부분에 도입 된 것을!

당신이 SSM 아키텍처의 봄 세션을 사용하지 않은 경우, 우리는 SSM 구조 때문에, 사용의 봄 세션이 세 곳을 구성하는 데, 거기에 봄 부팅에 봄 세션을 사용하는 것이 얼마나 쉬운 이해하기가 쉽지 않을 수 있습니다, 하나는 web.xml 파일입니다 프록시 필터를 구성하고 봄 컨테이너 레디 스를 구성하고, 마지막으로 봄 세션, 다소 성가신 여전히 단계를 구성하고, 봄 부팅 직접 우리가 이러한 번거로운 단계를 제거하는 데 도움이! 봄 세션을 구성 할 필요가 없습니다.

음, 우리는 내가 GitHub의에 업로드 한이 문서와 관련된 경우, 당신은 자신을 다운로드 할 수 있습니다, 여기 중지 :https://github.com/lenve/javaboy-code-samples

공공 우려 번호 코드 아이, 축산, 봄 부팅에 미세 초점 + 서비스, 일반 비디오 자습서는 우려 후 자바, 자바 건조 송 창 신중하게 준비 수신을 회신 공유!

봄 부팅이 공유 세션을 얻을 의존하고,이 계획의 최대보다 쉽게이 없습니다!

추천

출처blog.51cto.com/9806927/2404563