이번시간에 포스팅 할 것은 spring boot redis 로 세션관리를 하며 로드밸런싱을 사용하기 위해 nginx를 사용해 보겠다.
일단 nginx와 redis 가 설치 되어 있다고 가정하자. 설치 방법들은 각자 인터넷으로 찾아서 ...
레디스는 먼저 서버를 실행시켜도 된다.
먼저 spring boot redis를 살펴보자. 완전 간단하게 실행 시킬수 있다.
프로젝트를 생성하고 maven에 다음과 같이 추가 하자. spring boot 버전은 현재 최신 버전인 1.3.5 버전이다. 기본적으로 spring boot를 아는 기준으로 하겠다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
그리고 설정해줘야 할 것이 하나 있는데 main 클래스에 @EnableRedisHttpSession을 선언해줘야 한다.
@SpringBootApplication
@EnableRedisHttpSession
public class SpringSessionRedisSampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSessionRedisSampleApplication.class, args);
}
}
마지막으로 테스트를 할 수 있게 controller 한개 만들자
@RestController
public class IndexController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/index")
public String index(HttpServletRequest request){
logger.info("session id : {} ", request.getSession().getId());
return request.getSession().getId();
}
}
이제 준비는 끝났다. maven 으로 빌드를 한 후에 다음과 같이 두개의 서버를 띄우자. 한개의 port는 8080 으로 띄울 것이다 다른 한개의 서버는 port를 8081로 띄울 것이다.
java -Dserver.port=8080 -jar spring-session-redis-sample-0.0.1-SNAPSHOT.jar
java -Dserver.port=8081 -jar spring-session-redis-sample-0.0.1-SNAPSHOT.jar
서버실행되었다면 일단 각각의 서버로 들어가보자.
http://localhost:8080/index
http://localhost:8081/index
양쪽 어느 곳으로 가도 session 아이디는 똑같을 것이다. 일단 세션 클러스팅은 된 것이다. 다른 브라우저 혹은 시크릿 크롬창을 열어서 접속해도 마찬가지로 세션 아이디가 발급된 후에는 계속 아이디가 같을 것이다.
클러스팅은 됐으니 이제는 로드 밸런싱을 해보자
nginx 를 설치 했다면 nginx의 폴더에 config 폴더에 nginx.conf 파일이 있다. 거기에서 조금 수정해줘야 한다.
아래와 같이 수정하자.
http {
...
...
...
upstream springboot {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
...
...
...
location / {
proxy_pass http://springboot;
}
}
}
설정 파일을 수정한 뒤에 이제 실행 시켜 보자. 만약 nginx의 에러가 나오지 않았다면 정상적으로 설정 파일을 수정한 것이다. nginx 설정 값은 다음과 같다. (참고 http://blog.miyu.pe.kr/215)
weight : 가중치 (default:1)
max_fails : 연결 재시도 횟수 (default:1회)
fail_timeout : 죽은서버 복귀시간 (default:10초)
down : 이서버는 밸런싱에서 제외
backup : 모든 서버가 죽었을때만 사용하는 서버
ip_hash : 하나의 사용자는 하나의 서버를 호출한다.
이제 로드 밸런싱도 되었으니 브라우저를 띄어서 한번 접속해보자. nginx 기본포트는 80이므로 http://localhost/index 로 접속하자. sessionId 가 브라우저창에 띄어줬다면 성공적이다. 로드 밸런싱이 되고 있는 지 확인하기 위해 아까 띄었던 spring boot 서버의 로그를 확인해보자. 그러면 8080 서버 8081 서버 둘다 로그가 출력 되는 것을 확인 할 수 있다.
8080 서버 로그
2016-06-23 11:36:44.749 INFO 1876 --- [nio-8080-exec-2] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
2016-06-23 11:37:42.045 INFO 1876 --- [nio-8080-exec-3] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
2016-06-23 11:37:42.073 INFO 1876 --- [nio-8080-exec-4] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
8081 서버 로그
2016-06-23 11:37:14.893 INFO 7808 --- [nio-8081-exec-1] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
2016-06-23 11:37:16.072 INFO 7808 --- [nio-8081-exec-2] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
2016-06-23 11:37:39.552 INFO 7808 --- [nio-8081-exec-5] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
2016-06-23 11:38:21.396 INFO 7808 --- [nio-8081-exec-7] me.wonwoo.controller.IndexController : session id : bcfb717a-051f-49c1-bb4a-8a6dc2f7d88d
이렇게 우리는 spring session redis를 통해 세션 관리를 했으며 nginx 서버를 proxy 서버로 활용하여 로드밸런싱을 하는 것을 알아봤다. 원래는 haproxy 를 proxy서버로 활용하려고 하였으나 지금 현재 윈도우밖에 쓰질 못해서 간편하게 nginx 선택했다.(haproxy 설치가 귀찮아서..) proxy서버는 어느 것을 활용해도 괜찮다. 원하고 자기 상황에 맞게 선택하면 될 것이다.
참고: windows nginx 실행은 nginx.exe 도움말은 nginx.exe -h 정지는 nginx.exe -s stop