400 likes | 524 Views
The 2 nd CLOUD FRONTIER 2011 Hands On Lab. 2011.10.19. 한국자바개발자협의회. KT ucloud 에 대한 소개 – KT 박상학 팀장 (5 분 ) 클라우드 환경에서 Java Platform (5 분 ) IaaS 기반 Java Platform 환경 구축 실습 (55 분 ) Apache HTTP Server + Tomcat Integration Java Application Deployment
E N D
The 2ndCLOUD FRONTIER 2011Hands On Lab 2011.10.19 한국자바개발자협의회
KT ucloud에 대한 소개 – KT 박상학 팀장 (5분) • 클라우드 환경에서 Java Platform (5분) • IaaS 기반 Java Platform 환경 구축 실습 (55분) • Apache HTTP Server + Tomcat Integration • Java Application Deployment • KT ucloud Storage Service 소개 – KT 황진경 팀장(5분) • KT ucloud Storage Service 데모 (10분) • Ajax 기반 Application • KT ucloud PaaS Service 소개 – KT 김기현 팀장(10분) • KT ucloud PaaS Service 데모 (10분) • Auto Scaling • Threshold Agenda
IoC Framework :: Spring Framework • EJB POJO & POJI • POJO :: Plain Old Java Object • POJI :: Plain Old Java Interface • Java EE Server (WAS) Web Container • JSP/Servlet REST(JSON, XML) • Web Browser Any Device Java EE Application의 환경 변화
WebContainer :: Tomcat, Jetty, JBossWeb, … • WAR Deployment Virtual Machine 환경에 보다적합 • Stateless Application :: REST (JAX-RS Standard) • State Management :: Server Client Scalability 확보가 용이 • IoC Container :: Spring Framework • Lightweight, POJO, Unmanaged Environment Scalability 확보가 용이 Java EE Application의 변화
IaaS(Infrastructure as a Service) • Virtualization :: KT ucloud server • 기존의 애플리케이션을 그대로 Migration 하는 방식 • 경량의 Runtime Environment 구현 필요 • 장비만 없을 뿐, 설정은 그대로 진행해야 하나 on demand • 기존에 사용하던 소프트웨어의 라이선스 정책 확인 필요 • 서비스 제공자가 제공하는 서비스에 따라서 제약 발생이 있음 예) Database (Oracle을 사용하지만 VM에서는 라이선스 문제로 사용이 어려움) • PaaS(Platform as a Service) • 사전에정의되어 있는 개발 및 배포 환경 • 개발자는 개발과 배포에 집중 • 개발 및 배포에 있어서 환경적 제약이 발생하나 개발자는 시스템에 대해서 알아야 필요 없음 • 서비스 제공자는 개발 환경과 배포 환경을 제공 Java On Cloud
Java System Architecture on IaaS VM에 각각의 서비스를 개별로 설정 VM에 모든 서비스를 하나로 구성 KT ucloud콘솔 설정 VM에 서비스를 하나 이상의 서비스를 결합
KT ucloud server VM 접속 • install.sh 스크립트 다운로드 및 실행 • Apache HTTP Server, MySQL, Tomcat 다운로드 및 설치 • Apache HTTP Server & mod_jk 설정 • Apache Tomcat 설정 • MySQL 스키마 생성 • Apache HTTP Server & MySQL 서비스 재시작 • 예제 Application 배포 • Apache Tomcat 재시작 • 테스트 실습 절차
실습용 스크립트 http://14.63.194.232/download/script.txt
KT ucloud server 접속 • Putty를 실행하고 • 책상에 있는 접속 IP/Username/Password로 VM에 접속 • 접속 후 다음의 커맨드를 실행 실습 :: 1. 접속 및 설치 [root@i-2732-16209-VM ~]# wget http://14.63.194.232/download/install_x86.sh [root@i-2732-16209-VM ~]# sh install_x86.sh ... Press Enter to continue..... 엔터 Done. ... [root@i-2732-16209-VM ~]# . .bashrc [root@i-2732-16209-VM ~]# java
실습 :: 2. 다운로드 파일 확인 root@i-2732-16209-VM:~ #> ll total 14212 -rw------- 1 root root 973 Nov 8 2010 anaconda-ks.cfg drwxr-xr-x 6 root root 4096 Oct 19 00:36 apache-maven-3.0.3 drwxr-xr-x 9 root root 4096 Oct 19 00:36 apache-tomcat-7.0.22 -rw-r--r-- 1 root root 305 Oct 19 00:39 bashrc -rwxr-xr-x 1 root root 2598 Oct 19 00:42 install.sh -rwxr-xr-x 1 root root 2617 Oct 19 00:42 install_x86.sh lrwxrwxrwx 1 root root 11 Oct 19 00:36 jdk -> jdk1.6.0_27 drwxr-xr-x 10 root root 4096 Oct 19 00:36 jdk1.6.0_27 -rw-r--r-- 1 root root 9813 Oct 17 02:10 jpetstore-mysql-dataload.sql -rw-r--r-- 1 root root 5616 Oct 17 02:10 jpetstore-mysql-schema.sql lrwxrwxrwx 1 root root 18 Oct 19 00:36 maven -> apache-maven-3.0.3 -rw-r--r-- 1 root root 330 Oct 17 01:46 mod-jk.conf -rw-r--r-- 1 root root 394007 Oct 17 01:46 mod_jk.so -rw-r--r-- 1 root root 14064359 Oct 17 02:09 ROOT.war -rw-r--r-- 1 root root 31 Oct 17 01:46 uriworkermap.properties -rw-r--r-- 1 root root 345 Oct 17 01:46 workers.properties
실습 :: 3. mod_jk 설정 root@i-2732-16209-VM:~ #> cp mod-jk.conf /etc/httpd/conf.d LoadModule jk_module modules/mod_jk.so JkWorkersFile conf.d/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug 로깅레벨은 운영시 info JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories JkRequestLogFormat "%w %V %T" JkMountFile conf.d/uriworkermap.properties JkShmFile run/jk.shm root@i-2732-16209-VM:~ #> cp uriworkermap.properties /etc/httpd/conf.d /=loadbalancer /*=loadbalancer root@i-2732-16209-VM:~ #> cp workers.properties /etc/httpd/conf.d worker.list=loadbalancer worker.jvm1.host=localhost Tomcat이 하나 더 늘어나는 경우 추가 worker.jvm1.port=8009 worker.jvm1.type=ajp13 worker.jvm1.lbfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=jvm1 root@i-2732-16209-VM:~ #> cp mod_jk.so /etc/httpd/modules
실습 :: 4. Apache Tomcat 설정 root@i-2732-16209-VM:~ #> cd /root/apache-tomcat-7.0.22/webapps root@i-2732-16209-VM:~/apache-tomcat-7.0.22/webapps #> rm -rf ROOT root@i-2732-16209-VM:~/apache-tomcat-7.0.22/webapps #> cp ~/ROOT.war . root@i-2732-16209-VM:~ #> cd /root/apache-tomcat-7.0.22/conf root@i-2732-16209-VM:~/apache-tomcat-7.0.22/conf #> vi server.xml [FROM] <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost"> [TO] <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> [VI 커맨드] CTRL + F Page Down CTRL + B Page Up dd 라인 삭제 ESC + :wq 저장하고 종료
실습 :: 5. 테이블 생성 및 데이터 로딩 root@i-2732-16209-VM:~ #> cd /root root@i-2732-16209-VM:~ #> mysql -uroot -p Enter password: (그냥 엔터) mysql> show databases; mysql> create schema jpetstore; mysql> show databases; mysql> quit Bye root@i-2732-16209-VM:~ #> mysql -uroot -p < jpetstore-mysql-schema.sql root@i-2732-16209-VM:~ #> mysql -uroot -p < jpetstore-mysql-dataload.sql
실습 :: 6. 서비스 재시작 root@i-2732-16209-VM:~ #> cd /etc/init.d root@i-2732-16209-VM:/etc/init.d #> ./httpd restart HTTP Server Restart Stopping httpd: [ OK ] Starting httpd: [ OK ] root@i-2732-16209-VM:/etc/init.d #> ./mysqld restart MySQL Restart Stopping MySQL: [ OK ] Starting MySQL: [ OK ] root@i-2732-16209-VM:/etc/init.d #> cd /root/apache-tomcat-7.0.22/bin root@i-2732-16209-VM:~/apache-tomcat-7.0.22/bin #> ./catalina.sh run ... INFO: Starting ProtocolHandler ["http-bio-8080"] Oct 19, 2011 1:18:17 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-bio-8009"] Oct 19, 2011 1:18:17 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 2362 ms Tomcat 을백그라운드로 동작시키려면 run대신 start
참고 :: Sticky Session & JVM Route 세션을생성한 Tomcat으로 요청이 처리되지 않는 경우 다시 로그인 요청을 하게 되는 문제를 해결하기 위한 방법
KT ucloud :: Database Service 연동 #mysql --host=172.27.202.16 -ujpetstore -proot < jpetstore-mysql-schema.sql #mysql --host=172.27.202.16 -ujpetstore -proot < jpetstore-mysql-dataload.sql
KT ucloud :: Database Service 연동 • ROOT.war 파일의 WEB-INF/mysql.jdbc.properties 파일을 다음과 같이 작성 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://172.27.202.16:3306/jpetstore jdbc.username=jpetstore jdbc.password=root
KT Storage Service :: Container 생성 Container Object
KT Storage Service :: API Key 생성 Storage API를 사용하기 위한 정보
KT Storage Service :: Demo App /upload 컨트롤러 /list 컨트롤러 /download 컨트롤러
CLASSPATH에 cloudfiles.properties파일에 정보 추가 관련 정보는 KT ucloud 클라우드 콘솔에서 확인 KT Storage Service :: 사용자 설정 connection_timeout=300 auth_url=https://ssproxy.ucloudbiz.olleh.com/auth/v1.0 username=fharenheit@gmail.com password=********************************
KT Storage Service :: 파일 저장 @Controller @RequestMapping("/upload") public class UploadController { @RequestMapping(method = RequestMethod.POST) @ResponseBody public String upload(HttpServletRequest request, HttpServletResponse response) throws Exception { DefaultMultipartHttpServletRequest req = (DefaultMultipartHttpServletRequest) request; String containerName = req.getParameter("containerName"); MultipartFile uploadedFile = req.getFile("photo-file"); FilesClient client = new FilesClient(); java-cloudfiles API if (client.login()) { if (client.containerExists(containerName)) { client.storeStreamedObject(containerName, uploadedFile.getInputStream(), uploadedFile.getContentType(), uploadedFile.getOriginalFilename(), new HashMap()); String finalFilename = client.getStorageURL() + "/" + containerName + "/" + uploadedFile.getOriginalFilename(); return "{success:true, file:'" + finalFilename + "'}"; } } return "{success:false, file:'" + uploadedFile.getOriginalFilename() + "'}"; } }
KT Storage Service :: 파일 리스트 @Controller @RequestMapping("/list") public class ListController { @RequestMapping(method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public String list(HttpServletRequest request, HttpServletResponse response) throws Exception { FilesClient client = new FilesClient(); List list = new LinkedList(); if (client.login()) { List<FilesContainer> containers = client.listContainers(); for (FilesContainer value : containers) { FilesContainerInfo info = value.getInfo(); List<FilesObject> objects = value.getObjects(); for (FilesObject obj : objects) { TreeItem image = new TreeItem( obj.getName(), obj.getName(), client.getStorageURL() + "/" + info.getName() + "?objectName=" + obj.getName(), "Image" ); list.add(image); } } } return JacksonUtils.toString(list); } } 파일 목록을 JSON 형태로 구성하여 클라이언트로 전달하면 목록이 나타남 Storage URL은 서버에서 제공 https://ssproxy.ucloudbiz.olleh.com/v1/AUTH_a9876d72-5f73-46bf-af98-13779513dad9/test?objectName=DnD.png
KT Storage Service :: 파일 로딩 @Controller @RequestMapping("/download") public class DownloadController { @RequestMapping(value = "/{containerName}", method = RequestMethod.GET) @ResponseBody public void download(@PathVariable("containerName") String containerName, HttpServletRequest request, HttpServletResponse response) throws Exception { String objectName = request.getParameter("objectName"); if (containerName == null || objectName == null) { response.setStatus(500); } else { FilesClient client = new FilesClient(); if (client.login()) { if (client.containerExists(containerName)) { String contentType = FileUtils.getContentType(objectName); response.setHeader("Content-Type", contentType); response.setHeader("Content-Disposition", "attachment; filename=" + objectName); IOUtils.copy(client.getObjectAsStream(containerName, objectName), response.getOutputStream()); } } else { response.setStatus(500); } } } } /download/test?objectName=test.png
Source Code http://jcoorkr.tistory.com