1 / 32

클라우드 컴퓨팅 구현 기술

클라우드 컴퓨팅 구현 기술. 3 장 . 경량 애플리케이션 서버. 발 제 자 : 장 영 태. 애플리케이션 서버란 ?. 시스템의 주요 기능을 실행하고 결과를 화면 계층으로 전달하는 기능을 수행하는 서버를 말하며 , 일반적으로 웹서버 같은 클라이언트의 요청을 받아 비즈니스 로직을 수행하고 수행한 결과를 반환 하는 기능을 수행한다 . 애플리케이션 서버는 분산 네트워크 내의 컴퓨터 내에서 응용프로그램에  비즈니스 로직을 제공하는 서버 프로그램 이다 . < 텀즈 코리아 > 이상적인 애플리케이션 서버의 요구 사항

bryga
Download Presentation

클라우드 컴퓨팅 구현 기술

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 클라우드 컴퓨팅 구현 기술 3장. 경량 애플리케이션 서버 발 제 자 : 장 영 태

  2. 애플리케이션 서버란? • 시스템의 주요 기능을 실행하고 결과를 화면 계층으로 전달하는 기능을 수행하는 서버를 말하며, 일반적으로 웹서버 같은 클라이언트의 요청을 받아 비즈니스 로직을 수행하고 수행한 결과를 반환하는 기능을 수행한다. • 애플리케이션 서버는 분산 네트워크 내의 컴퓨터 내에서 응용프로그램에 비즈니스 로직을 제공하는 서버 프로그램이다.<텀즈 코리아> • 이상적인 애플리케이션 서버의 요구 사항 • 안정적인 네트워크 요청처리 • 비즈니스 프로그램 컨테이너 • 다양한 프로그래밍 언어와 플랫폼 지원 • 공개된 표준 프로토콜 지원 • 보안 • 개발 용이 • 트랜젝션 처리

  3. 애플리케이션 서버 구성 RPC의 개념 • 3장에서는 톰캣, JBOSS 등과 같은 기존의 애플리케이션 서버가 아닌 다양한 프로그래밍 언어를 지원하는 경량 RPC 서버 라이브러리를 이용해 애플리케이션 서버를 구축하는 방법을 제시한다. 별도의 애플리케이션 서버를 구성하려면 기본적으로 네트워크로 전달된 요청을 받고 응답을 제공하는 기능이 반드시 필요하며 이런 서버는 주로 소켓을 이용해 만든다. • RPC : 분산된 환경에서 네트워크를 통해 원격에서 서비스하는 기능을 호출하는 기술 클라이언트 애플리케이션 서버 애플리케이션 call hello() hello() 실행 데이터 변환 데이터 변환 Transport Transport

  4. RPC(Remote Procedure Call)구현 솔루션 특징 • IDL : IDL 정의를 컴파일해 프로그램 코드를 자동으로 만들어지는 도구를 제공하지만 인터페이스 변경 시 매번 IDL을 컴파일 해야하는 불편함이 있음. • 클라이언트 측에서 사용하는 코드를 스텁, 서버 측 사용 코드 스켈레톤 • 데이터 타입 : 원격 메소드를 호출할 때 주고 받는 데이터가 기본 데이터 타입만을 제공하는 방식과 struct, class같은 사용자 정의 데이터 타입을 제공하는 방식으로 구분할 수 있다. • 플랫폼(언어)의존성 : RPC솔루션이 동일 프로그래밍 언어 사이에서만 호출 가능한 것인지, 다양한 프로그래밍 언어 사이에 호출이 가능한지 여부도 중요한 고려 사항이다. *가장 이상적인 RPC구현은 IDL이 없고 사용자 정의 데이터 타입을 자유롭게 사용 할 수 있으며, 다양한 프로그래밍 언어를 사용하는 것이다.하지만 현실적으로 어려운 일이며, 현재까지 나온 RPC솔루션 중 시스템의 요구 사항에 적합한 솔루션 선택이 중요.

  5. 쓰리프트(thrift) : 페이스북의 애플리케이션 서버 쓰리프트 개념 • 다양한 언어를 지원하는 RPC 서버와 이 서버에서 제공하는 서비스를 호출하는 클라이언트 코드를 생성해주는 소프트웨어 프레임워크이다. • 프로그래밍 언어별 소켓 서버에 대한 구현을 알 필요 없다. • RPC기반이기 때문에 함수 호출 형태로 서비스를 호출 할 수 있다. • 사용자 정의 데이터 타입을 이용 할 수 있다. • 서버 / 클라이언트 모두 다양한 언어를 지원한다. • 서버 / 클라이언트 간 구현 된 언어가 틀려도 서버의 메소드 호출 가능. • RPC 요청을 안정적으로 호출하면서이기종간 RPC호출을 지원하는 개념 IDL 파일 thrift 코드 생성기 자동으로 생성된 코드 (C/C++, Java, php, …) 클라이언트 애플리케이션 데몬 서버용 main( ) 작성 서버 호출 코드 작성 thrift 라이브러리 비즈니스 로직 코드 작성 thrift 라이브러리

  6. 쓰리프트(thrift) 설 치 하 기 • http://incubator.apache.org/thrift/download/에서 thrift-0.5.0.tar.gz을 다운 받는다. tar xzf thrift-0.5.0.tar.gz cd thrift-0.5.0 ./configure JAVAC=$JAVA_HOME –prefix=/usr/local/thrift make sudomakeinstall vi ~/.bashrc … export PATH=/usr/local/thrift/bin:$PATH source ~/.bashrc thrift // 명령을 실행하면 thrift의 사용 설명이 나타난다. cd lib/java ant libthift.jar 파일 복사 /usr/lib/jvm/java-6-openjdk/jre/lib/ext

  7. 쓰리프트 – 인터페이스 정의 언어 • 인터페이스 정의 언어를 이용해 제공할 기능에 대한 인터페이스와 데이터 타입을 정의하는 파일을 생성하고, 이 파일을 이용해 필요한 소스를 자동으로 생성해서 사용하는 방식을 이용 • 기본 데이터 타입 • 사용자 데이터 타입 • 사용자 데이터 타입을 선언하려면 struct라는 키워드를 이용 bool byte binary i16 i32 i64 double string struct Example { 1: i32 number = 10, 2: i64 bigNumber, 3: double decimals, 4: string name = “thrift”, 5: optional string optionVal; }

  8. 쓰리프트 – 인터페이스 정의 언어 • 컨테이너 • 복수의 객체를 저자아하는 데 사용하는 자료구조. • list<type> : type에 정의된 객체를 복수개 저장하고 데이터 중복 허용 • set<type> : type에 정의된 객체를 복수개 저장하고 데이터 중복 불허용 • map<type1, type2> : 키/값 형태로 복수개의 객체를 저장 할 수 있다. struct Student { 1: string name, 2: string sex } struct ContainerExample { 1: list<string> names, 2: set<Student> students, 3: map<string, Student> studentMaps, 4: map<string, set<Student>> classes }

  9. 쓰리프트 – 인터페이스 정의 언어 • 예외 • 사용자 예외를 정의 할 수 있다. • struct 키워드 대신 exception카워드 사용 exception ExampleException { 1: i32 exceptionNo, 2: string message } ## java 변환 모습 public class ExampleException extends Exception { private int exceptionNo; private String message; }

  10. 쓰리프트 – 인터페이스 정의 언어 • 서비스 • 애플리케이션 서버에서 제공하는 서비스를 의미 • Service라는 키워드를 이용해 정의 • 자바의인터페이스와 같은 개념에 해당 Service <name> { <returntype> <function name> (<arguments>) [throws (<exceptions>)] … } service HelloService { string hello(1:string name) throws ExampleException; } service KoreanHelloService extends HelloService { string greeting(1: string name, 2: i32 age); }

  11. 쓰리프트 – 인터페이스 정의 언어 • IDL 문법 (p.92 참조) • 사용자 정의 타입명으로 변수를 사용 할 수 없다. • 메소드 오버로딩이 가능하다. • namespace키워드를 이용 네임스페이스를 지정할 수 있다.(자바는 패키지로 변환) • Import키워드는 다른 thrift파일을 임포트할 때 사용한다. • 컨테이너 내에서 다른 컨테이너를 사용하는 것도 가능 • 예 : map<string, list<UserType>> • oneway키워드를 사용한 서비스의 메소드는 클라이언트가 서버로 요청을 보내고 결과 값을 기다리지 않는다. 쓰리프트는 비동기 RPC도 지원하는데, 반환 값이 없으면서버로부터의 응답을 기다릴 필요가 없다. oneway를 사용하면 반환 값은 반드시 void라야 하며, 예외를 던질 수도 없다. • enum 키워드를 이용해 열거형 데이터 타입을 정의한다. • Const 키워드를 이용해 상수를 선언한다. JAVA에서는 Constants라는 클래스 내에 정적 멤버 변수로 생성. • Typedef는 C언어의 typedef와 동일하다.

  12. 쓰리프트 – 예제 – hello.thrift • IDL예제 코드 vi로 생성 • thrift --gen java --gen cpp --gen py --gen perl --gen php hello.thrift • gen-<프로그램 언어> 디렉토리 생성 • HelloService.java 소스 코드가 자동 생성된다. • 코드를 수정하지 않고 이를 그대로 이용해 서버와 클라이언트를 구성한다. namespace cpp hello namespace java co.kr.jaso.hello.thrift.generated namespace php hello namespace perl hello namepsace py hello service HelloService { string greeting(1: string name, 2:i32 age) }

  13. 쓰리프트 – HelloService.java • greeting( ) 메소드를 구현한 내부 코드를 보면 실제 로직을 수행하는 것이 아니라 서버로 호출을 보내고 결과를 받아 반환하는 형태로 구현돼 있다. … public class HelloService { public interface Iface { public String greeting(String name, int age) throws TException; } …… public String greeting(String name, int age) throws TExcetiron; send_greeting(name, age); return recv_greeting(); } … }

  14. 쓰리프트 – 예제 실습 • 자동으로 생성된 HelloService의 Iface 인터페이스를 implements하고 있다. • 서버의 역할을 수행하게 하기 위해 HelloServer를 구현하여 원격에서 호출 가능하도록 소켓을 연결시키게 한다. public class HelloHandler implements HelloService.Iface { @Override public String greeting(String name, int age) throws TException { return “Hello “ + name + “. You are “ + age + “ years old”; } }

  15. 쓰리프트 – 예제 ( 서버 구현 ) • public class HelloServer { • public static void main(String[] args) throws Exception { • if(args.length < 1) { • System.out.println(“Usage java HelloServer <port>”); • System.exit(0); • } • int port = Integer.parseInt(args[0]); • final TNonblockingServerSocket socket = • new TNonblockingServerSocket(port); • final HelloService.Processor processoer = // HelloHandler와 바인딩 • new HelloService.Processoer(new HelloHandler()); • final TServer server = new THsHaServer(porcessor, socket, • new TFramedTransport.Factory(), • new TBinaryProtocol.Factory()); • System.out.println(“HelloServer started(port: “ + port + “)”); • server.serve( ); • } • } • TServer객체를 만들어 server() 메소드를 호출함으로써 애플리케이션 서버 역할 수행 • 서버의 스레드 관리는 Half-Sync / Half-Async를 사용

  16. 쓰리프트 - 전송 계층 쓰리프트 전송 계층 클라이언트 0 서 버 사용자 개발 코드 서버 호출 코드 작성 HelloService. Client HelloService. Processor Serviece. write()/read() Serviece. read()/write() TProtocol TProtocol (p98 참조) 쓰리프트에서 제공하는 프로토콜 쓰리프트에서 트랜스포트 계층의 구현체 TTransport TTransport

  17. 쓰리프트 - 예제 (클라이언트 구현) • public class HelloClient { • public static void main(String[] args) throws Exception { • if(args.length < 4) { • System.out.println(“Usage java HelloClient “ + • “<host> <port> <name> <age>”); • System.exit(0); • } • String host = args[0]; • int port = Integer.parseInt(args[1]); • int timeout = 10 * 1000; • final TSocket socket = new Tsocket(host,port); • socket.setTimeout(timeout); • final TProtocol protocol = new TBinaryProtocol(transport); • transport.open(); • String result = client.greeting(args[2]); • Integer.parseInt(args[3])); • System.out.println(“Receved [“ + result + “]”); • transport.close(); • } • } • 클라이언트 프로그램의 실행을 위해선 lib를 추가해 주어야 한다. • - libthrift..jar, commons-lang-2.4.jar, slf4j-api-1.5.8.jar, slf4j-simple-1.5.8.jar

  18. 쓰리프트 - 예제

  19. 에이브로(Avro) • 이기종 간 데이터 타입을 교환할 수 있는 체계를 제공하는 프레임워크 • 데이터 직렬화를 기본 개념으로 해 RPC호출을 이기종 간에 가능하게 하는 개념 • 따라서, 이기종 간 데이터 접근은 RPC뿐만 아니라 파일에 데이터를 저장하는 등의 용도로 사용 할 수 있다. • IDL방식도 지원하지만 JSON 기반의 문자열을 이용해 데이터 타입에 대한 정보를 클라이언트와 서버 사이에 주고 받으면서 데이터 타입을 확인하는 과정을 거치는 형태를 사용, 컴파일 시점이 아닌 실행 시점에서 IDL 정보를 이용해 호출하는 방식도 지원 가능. • 에이브로의 목적 • 하둡을 사용하는 다른 플랫폼에서 생성된 다양한 데이터를 상호 교환하고 처리하기 위해 동적으로 데이터 타입을 인식하고 처리하기 위한 목적 • 하둡 자체적으로 개발해 사용하고 있는 RPC모듈이 자바기반에서만 동작하기 때문에 파일 시스템 관련API가 자바만 지원하고 있다는 한계를 극복하기 위한 목적

  20. 에이브로의 개념 시스템 A 스키마 정의 JSON 데이터 (레코드1, 레코드2, ...) 스키마 + 데이터 전송 데이터 스키마 정보 분리 시스템 B 스키마 정보 스키마 정보 스키마 정보 이용 레코드 추출 레코드1 레코드2

  21. 에이브로의 설치 • 에이브로 프로젝트 싸이트 • http://www.bizdirusa.com/mirrors/apache//avro/ • avro-src-1.3.3 or 1.4.1 을 다운로드해 압축을 해제 한다. • vi로 build.sh 열어 svn 최신버전 다운로드 하는 부분 주석처리 후 build수행 • # svn export --force . build/avro-src-$VERSION • ./build.sh dist 명령 수행 • 언어별로 별도 빌드 시 • cd java; ant dist 수행 • 빌드가 완료 되면 dist 디렉토리가 생성되고 avro-x.y.z.jar, avro-tool-x.y.z.jar가 들어 있다. • avro-x.y.z.jar 의 경우 자바 클래스 패스에 추가해 사용 • avro-tool-x.y.z.jar의 경우 IDL컴파일러 같은 도구가 들어있어 명령어를 통해 사용가능. • java -jar avro-tools-1.3.3.jar

  22. 에이브로 - tools명령어

  23. 에이브로 - 코드 생성 • java -jar avro-tools-1.3.3.jar compile protocol ./interface/hello.avpr ./generated • Greeting.java, GreetingException.java HelloService.java 3개 파일 생성 { “namespace” : “kr.co.jaso.avrotest”, “protocol”: “HelloService”, “doc” : “Avro HelloService Test”, “types” : [ {“name”: “Greeting”, “type”: “record”, “fields”: [ {“name”: “greetingMessage”, “type”: “string”}]}, {“name”: “GreetingException”, “type”: “error”, “fields”: [ {“name”: “message”, “type”: “string”}]} ], “messages” : { “hello”: { “doc”: “Say hello.”, “request”: [{“name” : “greeting”, “type”: “string”}], “response”: “Greeting”, “errors”: [“GreetingException”] } } }

  24. 에이브로 - 스키마 • 스키마는 전송 또는 저장되는 데이터의 포멧에 대한 정의다. • RPC호출 시 스키마 정보 먼전 전송 -> 실제 데이터를 전송, 파일에 데이터 저장 시 파일 앞부분에 스키마 정보를 저장한다. 스키마는 JSON 형태로 표현 { “type” : “타입명” ... 속성 .... } • 원시타입 : null, boolean, int, long, float, double, bytes, string • 복합타입 : 레코드, 열거형, 배열, 맵, 유니온, 고정길이 등 6가지 타입 타입별로 속성 • 레코드(record) : name, doc, fields • 열거형(enum) : name, doc, symbols • 배열 (array) : items • 맵 (map) : values • 유니온 : JSON의 배열 표현식 - ex) [“data1”, “data2”] • 고정 길이(fixed) : name, size

  25. 에이브로 - 객체 컨테이너 파일 • 객체 컨테이너 파일 : 직렬화를 지원하는 자체 파일 포멧 • public class FileWriter { • public static final int DEFAULT_DEFLATE_LEVEL = 5; • public static void main(String[] args) throws Exception { • List<Field> fields = new ArrayList<Field>(); • fields.add(new Field(“first”, Schema.create(Type.STRING), null, null)); • fields.add(new Field(“last”, Schema.create(Type.STRING), null, null)); • fields.add(new Field(“age”, Schema.create(Type.INT), null, null)); • Schema personSchema = Schema.createRecord(“Person”, “test”, “”, false); • personSchema.setFields(fields); • DataFileWriter<Record> writer = new DataFileWriter<Record> ( • new GenericDatumWriter<Record> (personSchema)); • writer.setCodec(CodecFactory.deflateCodec(DEFAULT_DEFLATE_LEVEL)); • writer.create(personSchema, new File(“test.dat”)); • try{ • for(int i = 0; i <1000; i++) { • Record person = new GenericData.Record(personSchema); • person.put(“frist”, new Utf8(“kim” + i)); • person.put(“last”, new Utf8(“joon” + i)); • person.put(“age”, i); • writer.append(person); • } • } finally { • writer.close(); • } • } • } • 에이브로 스키마 정의 파일 없이 Field, Schema클래스를 이용해 바로 스키마를 정의하는 방식 • 스키마를 로딩한 후 DataFileWriter 클래스, Record클래스 등을 이용해 객체를 객체 컨테이너파일에 저장

  26. 에이브로 - 객체 컨테이너 파일 public class FileReader { public static void main(String[] args) throws Exception { Schema personSchema = Schema.parse(new File(“person.avoro”)); DataFileReader<Person> reader = new DataFileReader<Person> ( new File(“test.dat”), new SpecificDatumReader<Person> (personSchema)); while(reader.hasNext()) { Person person = reader.next(); System.out.println(person.first + “,” + person.last + “,”+ person.age); } } } • - 자바의 표준 직렬화 방식과 유사하지만, 다양한 프로그래밍 언어를 지원하는 • 것이 가장 큰 차이점이다. • Writer는 자바, Reader는 C++로 별도의 변환 과정 없이 읽는 것이 가능하다. • 한번 저장된 데이터를 다양한 프로그래밍 언어에서 타입 변환 없이 바로 사용할 수 있는 메커니즘 제공

  27. 에이브로 - 프로토콜 • 일반적으로 RPC 호출을 위해서는 프로시저에 대한 인터페이스 정의와, 숭수신되는 데이터에 대한 타입 정의가 필요하다. (p.123참고 프로토콜 정의 속성) package kr.co.jaso.avrotest; /** Avro HelloWorld Test */ public interface HelloService { Greeting hello(String name) throws GreetingException; } public class Greeting Exception extends Exception { } public class Greeting { private String greetingMessage; } { “namespace” : “kr.co.jaso.avrotest”, “protocol” : “HelloService”, “doc” : “Avro HelloService Test”, “types” : [ {“name” : “Greeting”, “type”: “record”, “fields” : [ {“name”: “greetingMessage”, “type”: “string”}]}, {“name” : “GreetingException”, “type”: “error”, :fields”: [ {“name”: “message”, “type” : “string”}]} ], “massages” : { “hello”: { “doc”: “Say hello.”, “request”: [{“name”: “greeting”,”type”: “string”}], “response” : “Greeting”, “errors”: [“GreetingException”] } } } *hello.avpr 파일

  28. 에이브로 - 코드 생성과 GenAvro Avro 컴파일 단계 genavro compile • java -jar avro-tools-1.3.2.jar compile protocol ./interfate/hello.avpr ./generated • 위 명령은 ./interfate/hello.avpr 프로토콜 정의 파일을 이용해 ./genetrated라는 디렉토리에 코드 생성 • Avro확장자 권장 사항 • .avpr : 프로토콜 파일 • .avsc : 스키마 파일 • .geavro : GenAvro파일 • 에이브로에서는 IDL을 GenAvro라고 하고 GenAvro의 문법(p.127 참고) • Avro는 IDL 인터페이스 정의 시 JSON문법이 아닌 프로그래밍 언어 같은 문법을 이용해 정의 할 수 있는 IDL언어와 컴파일러를 제공한다. hello.genavro (GenAvro) hello.avpr (JSON) HelloService.java

  29. 에이브로 - 코드 생성과 GenAvro • Genavro 파일을 JSON 형태의 프로토콜 파일료 변환 • java -jar avro-tool-1.3.2.jar genavro ./interfaces /hello.genavro ./interfaces/hello.avpr 에이브로의 JSON 포멧을 이용한 API 서버 구성 방법 웹 브라우저 프락시 서버 (apache_mod) 애플리케이션 서버 (AVRO) JavaScript(AJAX) call hello( ) HTTP Support Forward to AppServer hello( ) Return JSON format

  30. 제티 : 내장형 웹서버 • 제티는 서블릿 컨테이너로 독립적인 프로세스로 실행되면서 jsp나 서블릿 클래스에서 정의된 기능을 수행하는 역할을 담당한다. • 내장형 웹서버로 사용 가능. 즉, 다른 기능을 수행하면서 한편으로는 jsp, 서블릿 컨테이너 역할도 같이 할 수 있는 프로그램을 개발 할 수 있다. 일반적인 웹 애플리케이션 서버 내장형 웹 애플리케이션 서버 내장형 웹 애플리케이션 서버 애플리케이션 서버 톰캣 또는 제티 hello( ) greeting( ) a.jsp HelloServlet 내장된 제티 b.jsp BoardServlet b.jsp a.jsp

  31. 제티 - 설치 • http://dist.codehaus.org/jetty/jetty-6.1.25/에서 배포버전 제티 다운로드 • jetty-6.1.25.zip의 압축을 풀어 jetty-6.1.25.jar, jetty-util-6.1.25.jar, servlet-api-2.5-20081211.jar, jsp-2.1디렉토리 밑에 모든 jar를 eclipse프로젝트내에 lib폴더로 복사한다. • webapps/etc 폴더 생성 후 제티 설치 디렉토리의 /etc/webdefault.xml 파일을 복사한다. • webdefault.xml파일은 서버 설정 정보가 있으며, 내장형 웹서버에서도 이를 이용한다.

  32. 제티 - 라이브러리 • 제티 라이브러리는 Server라고 하는 웹서버 클래스를 제공한다. Server클래스는 Connecter, ThreadPool, Handler에 의해 요청을 처리한다. • Connect : http요청을 받는 역할을 수행 • Handler : 요청을 받아 필요한 기능을 수행해 결과를 반환하는 역할을 수행 • ThreadPool : 요청을 큐에 정령하고 스레드에 의해 처리되게 하는 역할을 수행 제티 서버 아키텍쳐 Connector Server ThreadPool Handler

More Related