JDJ 내 SCA와  SDO 관련한 새로운 아티클이 있어서  링크 남겨본다.
이곳 클릭!! -> Real SOA - Web Services and Service Oriented Architecture

참고로 저자는 Tuscany 팀의 3명의 IBMer 다.


Posted by 아름프로

Brian Schaffner (ZDNet Korea)

이전 글에서 각 비즈니스 프로세스에 적합한 서비스 지향 아키텍처(SOA)를 구축하는 방법에 대해 논의한 바 있다. 이번 글에서는 SOA 아키텍처를 보다 세심하게 살펴보고 컴포넌트를 실행하는 방법에 대해 알아보자.


아울러 웹서비스 기술을 이용해 서비스 에이전시, 서비스 제공자, 그리고 서비스 요청자 등을 실행하기 위한 설계를 구축하는 방법 등에 대해 설명하도록 하겠다.

웹 기술로 서비스 실행하기
웹 기술은 상당히 풍부한 수준으로 서비스 실행 도구를 제공할 만큼 성숙해 왔다. 웹서비스 기술은 대체로 다른 기술을 기반으로 구축되며 특히 XMLHTTP에 근거를 두고 있다.

각 서비스들은 흔히 현존하는 애플리케이션을 포장한 형태로 제공되고 있다. 그림 A는 다양한 웹서비스 컴포넌트와 이들이 하나의 서비스 아키텍처를 수행하기 위해 어떻게 공조를 이루는지 그 연관 관계에 대해 설명하고 있다.


그림 A : SOA의 웹서비스 구현

위 그림에서 UDDI가 서비스 발견 에이전시를 제공하며 웹·애플리케이션 서버는 서비스 제공자를 전달하고 애플리케이션은 서비스 제공자의 역할을 하는 것을 발견할 수 있다. 이런 모습이 바로 SOA 모델의 충족 요건이 된다.

서비스 제공자에서 애플리케이션 기능성 요약하기
웹 서비스는 하나 또는 그 이상의 애플리케이션 전반에 걸쳐 실행된다는 기능성을 갖춘 서비스의 ‘포장’을 반드시 제공해야 한다. 일부 웹서비스는 아마 다른 웹서비스들이 다중 애플리케이션에 대한 통합 인터페이스를 제공하는 반면에 단일 애플리케이션을 대상으로 한 기능성을 제공하고 있는지도 모른다.

애플리케이션을 서비스 측면에서 면밀히 계획해 보면 애플리케이션과 기술이 비즈니스 프로세스에 적합한지 살펴볼 수 있다. 그림 B는 애플리케이션의 기능성이 서비스 실행으로 면밀하게 계획되는 방법에 대한 사례를 보여준다.


그림 B : 애플리케이션 기능성이 서비스에 매핑되는 예

EJB와 같은 컴포넌트 아키텍처는 애플리케이션 서버 환경에서 수행될 수 있는 서비스를 요약해 보여준다.

웹 서버는 서비스 접근에 대해 HTTP 네트워크 전송 방법을 제시하며 애플리케이션 서버는 SOAP 인터페이스와 서비스를 구성하는 객체 컴포넌트를 주관한다. 객체 컴포넌트는 애플리케이션들에 대해 비즈니스 서비스 계층을 제공한다.

결과적으로 웹서비스는 기초적인 애플리케이션들에서 풍부하게 정의된 서비스들을 이끌어 낸다. 이러한 서비스는 이후 개념 정의가 잘 된 비즈니스 프로세스로 연결된다.

애플리케이션 전반에 걸친 개념적 계층을 구성하면 각 애플리케이션의 기능성을 비즈니스 서비스로 정의된, 보다 의미 있는 방법으로 전달할 수 있다.

WDSL 환경의 서비스 규약 정의
서비스 제공자는 WSDL 문서 형태로 해당 인터페이스 규약을 출판한다. WSDL 문서는 서비스 위치 지정, 그리고 해당 서비스에 대한 접근 방법까지 포함하는 서비스의 특징을 정의한다. 개발적 관점에서 볼 때 WSDL은 서비스 요청자와 서비스 공급자가 모두 동의하는 규약을 제공한다.

일단 비즈니스 프로세스를 정의하고 해당 프로세스를 실행할 서비스를 조직하고 나면 그 다음 단계는 서비스와 서비스 내부의 특정 방법론을 결정하는 것이다.

WSDL은 세부 서비스의 XML 포맷이다. WSDL 문서 내에서 서비스 접근법, 가능한 방법에 대한 판단, 방법에 대한 접근, 방법까지 나아가는 동안 거쳐야 하는 매개변수, 기타 여러 요소에 대한 세부 작업을 수행할 수 있다.

서비스 요청자들은 서비스 레지스트리를 이용해 서비스를 위치시킨다. 웹서비스의 실행에서 서비스 레지스트리는 UDDI를 이용해 실행된다. UDDI 서버는 서비스 내역에 대한 데이터베이스를 갖고 있으며 이들을 서비스 요청 애플리케이션에 제공한다.

서비스 요청자는 웹서비스와의 인터페이스 규약을 납득하기 위해 WSDL 문서를 활용한다.

일반적으로 WSDL 문서는 물리적으로 UDDI 서버에 저장되는 것은 아니다. 오히려 UDDI 서버는 서비스 요청자에게 WSDL 문서를 어디서 발견할 수 있는지 위치를 확인할 수 있는 URL들을 제공한다.

프로그래머의 측면에서 WSDL 문서는 서비스에 접속하기 위해 사용하는 개념 인터페이스를 정의한다. 설계 측면에서 WSDL은 서비스 요청자와 제공자 사이의 규약을 규정하기 때문에 반드시 이 2가지 앞에 위치해야 한다.

일단 WSDL이 설계돼 합의되면 서비스 제공자의 개발자와 서비스 요청자의 개발자는 다소 평행적으로 작업하게 된다.

서비스 발견
서비스는 UDDI 서버에 질의하고 관련된 WSDL 문서에 접근함으로써 발견된다. 중심 레지스트리를 사용함으로써 클라이언트 애플리케이션은 역동적으로 서비스를 발견하고 이에 결합될 수 있다.

UDDI 서버 및 프로토콜은 상당히 포괄적이다. 하나의 서비스 아키텍처로서 UDDI 컴포넌트는 자신의 도메인 내에 위치한 모든 서비스에 대해 잘 알고 있는 중앙 에이전시 역할을 수행한다. 언제든 서비스 요청자가 서비스에 접근하거나 서비스를 위치시켜야 할 때마다 UDDI 서버는 정보 요청을 받는다.

UDDI는 레지스트리를 검색하는데 있어 다양한 방법을 제공한다. 일단 하나의 조직과 서비스가 위치되고 나면 서비스 요청자는 WSDL 위치를 요약한다.

WSDL 은 대개 서비스 그 자체와 함께 위치한다. 그 다음 서비스 요청자는 서비스의 세부 사항을 알기 위해 WSDL 문서에 접근한다. WSDL 문서 내의 정보를 활용해 서비스 요청자는 서비스에 접근하는 방법, 그리고 어떤 방법론이 있는지, 어떤 매개변수가 보내져야만 하는지 등을 다른 것보다 먼저 이해하게 된다.

그림 C는 이러한 프로세스가 작동하는 것을 묘사한 것이다.

그림 C : 서비스 요청자로부터 WSDL에 접근하기

향후 과제
SOA를 구현하는 것은 정말 하나의 도전과도 같다. 구현을 통해 SOA를 구성하는 컴포넌트와 웹서비스 이면의 기술들을 이해함으로써 풍부한 전략적 솔루션을 제공함과 동시에 각 비즈니스의 필요 부분과 도전과제 등을 충족시키는 실속있는 아키텍처를 만들어 낼 수 있을 것이다.

Posted by 아름프로

떠돌아다니는 내용인데.. 괜찮은거 같아서.. 퍼봅니다.
=============================================

# SOA(Service Oriented Architecture; 서비스 지향 아키텍처)

연재 가이드

기본 배경 - J2EE 5.0
J2EE 1.4가 나온 지도 이제 1년이 지났고 예정대로라면 올해 하반기에 위용을 드러낼 J2EE 5.0(J2SE 5.0처럼 1.5가 아닌 5.0으로 버전이 고쳐졌다)을 벌써부터 다루는 것이 무척 성급하게 비칠 수도 있지만 이미 필자가 작년 11월에 J2EE 5.0의 핵심 기술 중 하나인 JBoss의 EJB 3.0 조기 구현체로 과제를 무사히 마쳤을 정도로 상황이 빠르게 진행되고 있다. 웹 쪽은 JSP 2.1, JSTL 1.1, 그리고 JSF 1.2로 EL 공유와 통합이 한창이고, 웹 서비스도 J2EE 1.4에서 보여준 초기적 기술 상태를 벗어나기 위해 JAX-RPC 2.0과 JAXB 2.0, 그리고 WSM(Web Services Metadata) 1.1로 재무장되어 가고 있다.

JBoss가 자신들의 AOP 프레임워크와 하이버네이트를 결합하여 EJB 3.0의 조기 구현체

웹 서비스 개발에서도 누누이 강조하는 개념 중의 하나로 coarse-grained가 있다. 필자가 처음 이 용어의 번역을 시도했을 때(O'Reilly의 Java Web Services, 2002년), 오로지 생각하는 것이라고는 스타벅스에서 원두를 샀을 때 “어떻게 갈아드릴까요?”라는 질문에 “굵게 갈아주세요”하는 바로 그 ‘굵게 갈음(coarse-grained)’이었다. 웹 서비스에서는 반대말인 fine-grained를 하지 말라는 뜻이기도 한데 도대체 뭘 잘게 갈지 말고 굵게 갈라는 뜻일까?

대답은 의외로 간단하다. 사용자가 사용할 인터페이스에 개발자의 잣대를 들이대지 말라는 말이다. 사용자는 장소와 시간을 주고 예약 가능한 택시 목록을 보고 싶다. 개발자는 ‘음··· 일단 xx1 메쏘드를 호출하는 식으로 장소와 시간을 받아온 뒤 xx2 메쏘드를 불러 DB 연결을 얻어 온 후 xx3 메쏘드로 사용자 인증을 한 후 xx4에서 장소를 정규화하고···’ 이렇게 머릿속에는 이미 아스트랄한 메쏘드 세상이 펼쳐지는 것도 모자라서 ‘이렇게 해놓으면 나중에 또 쓸 수 있겠지?’하며 흐믓한 미소마저 짓는다. 재사용을 위한다면 메쏘드를 public으로 할 것이고, 이러다 보면 메쏘드의 공개는 파죽지세로 이어진다.

이러한 public 메쏘드와는 별도로 공개된(published) 메쏘드라는 개념이 나와 관심을 끈다. 물론 공개된 메쏘드는 자바 문법으로는 나타낼 수 없지만 단순히 접근 수준을 정하는 정도가 아니라 이 메쏘드를 외부의 클라이언트가 호출할 수 있게 하겠느냐는 뜻에서 공개되었다는 표현을 쓴 것이다(Erich Gamma와 Kent Beck이 쓴 『Contributing to Eclipse』에서 발췌). WSM에서는 공개된 메쏘드에 대한 표식을 가능하게 하는 메타데이터가 제공되고 있으니 정리하면 사용자에게 쓰도록 내비칠 오퍼레이션(웹 서비스에서는 메쏘드라는 프로그래밍 언어적 용어 대신 오퍼레이션을 대응하여 쓴다)은 최대한 굵게, 그리고 프로그래밍 언어의 public과는 차별화해야함이 coarse-grained의 현실적 취지이다.

Posted by 아름프로
SOA(Service-oriented architecture)

SOA(Service-oriented architecture)란 무엇인가?

서 비스 지향 아키텍처는 기업이 내부 애플리케이션을 기업 내·외부까지 통합할 수 있는 표준 소프트웨어 요소이자 비즈니스 프로세스의 집합체이다. 예를 들어 알파벳에서 하나하나의 문자들을 서비스로 본다면, SOA는 이 문자들을 활용해서 문장이나 글로 써나가는 규칙을 설명하는 문법책이라고 볼 수 있다. 또한 레고 블록 하나 하나를 서비스로 본다면, SOA는 이들 블록을 사용하여 건물이나 자동차 등을 만들 수 있는 방향과 지침을 제시하는 것으로 비유할 수 있다. 따라서 IT 측면에서 볼 때 SOA는 기업 IT 자원간의 궁극적인 상호 호환성을 제공하기 위한 차세대 통합 개념이라고 할 수 있다.
SOA는 데이터와 애플리케이션을 표준 블록 단위로 나눠 하나의 서비스로 구성한 뒤 웹서비스 기술 등을 적용해 각 서비스를 조합 또는 재사용할 수 있게 한다. 내부 애플리케이션과 서비스를 통합하는 것은 물론이고 협력사·하도급업체 등의 외부 시스템까지 연계할 수 있다.

일례로 모 기업은 전사적자원관리(ERP)를 비롯한 주요 엔터프라이즈 애플리케이션으로 상이한 2개 업체 제품을 사용하고 있다. 게다가 고객과 제품·직원 및 파트너에 관한 엔터프라이즈 데이터베이스도 운영하면서 문서와 콘텐츠관리서비스·구글의 서치 서비스 등도 운영 중이다.

이처럼 분산된 정보시스템 인프라를 가지고 있는 사용자가 쉽게 서비스 받을 수 있는 환경을 만드는 것이 SOA의 기본 이념이다. 즉 시스템을 누구나 이용 가능한 서비스로 간주하고 연동과 통합을 전제로 아키텍처를 만든다는 것이다.

SOA는 컴퓨팅 환경 내에서 분산된 로직(서비스)을 유연하게 디자인·개발·배치·관리하기 위한 소프트웨어 인프라 시스템 패러다임이다. 이 정의는 SOA의 전반적인 범위를 표현한다.

SOA의 원리

SOA는 비즈니스 기능들을 네트워크 상에서 재사용이 가능한 공유서비스의 집합으로 구현한 소프트웨어 디자인 패러다임이다. Burton Group의 부사장이자 연구 책임자인 Anne Thomas Manes는 ‘웹서비스는 표준 메시지 포맷과 프로토콜을 사용하는 서비스 중심의 통합 기술’이라고 말했다.

한 덩어리의 방대한 코드로 이루어진 애플리케이션들을 각각 개발하는 대신 SOA를 디자인 패턴으로 채택하면 각각의 비즈니스 기능들로 이루어진 유연한 인프라를 구축할 수 있다. 즉 이 비즈니스 기능들을 조합하거나 분리함으로써 유연하면서도 상세하게 모든 비즈니스 프로세스들을 구현할 수 있게 되면서 급변하는 환경에 맞춰 신속하게 비즈니스 프로세스들을 수정할 수 있다.

그래서 SOA는 웹서비스 표준 지원, 기존 투자된 애플리케이션 인프라를 활용하기 위한 전사 애플리케이션 통합 하부구조, 비즈니스 프로세스를 자동화하고 애플리케이션간 비즈니스 프로세스 상호 교환을 위한 서비스 오케스트레이션, XML·non-XML·객체 등 다양한 유형별 데이터 통합 및 맵핑, 기존 컴포넌트 시스템 통합, 서비스 개발 환경을 위한 개발 도구 등을 요건으로 하고 있다.

SOA는 여러 시스템에서 애플리케이션 기능을 재사용할 수 있도록 함으로써 애플리케이션 개발과 통합 작업을 간소화할 것이다. 물론 이전의 컴포넌트 기반 아키텍처에서도 이런 시도는 있었다. SOA와 컴포넌트 기반 아키텍처의 근본적인 차이점은 SOA는 주로 표준 기반의 웹서비스에 의존하고 있기 때문에 기반 기술로서 그 어떤 것도 필요로 하지 않는다는 점이다.

도입 필요성

가트너 그룹은 ‘2008년에는 60% 이상의 기업이 회사의 핵심 애플리케이션과 프로세스를 개발할 때 SOA를 소프트웨어 개발 원칙으로 사용할 것’이라고 밝혔다. 또한 웹서비스 컨설팅전문회사 잽 씽크(ZapThink)는 ‘오는 2006년까지 네트워크화된 비즈니스 시스템에서 SOA가 지배적인 디자인이 될 것’이라고 예상하고 있다.

SOA를 적용하면 기존에 힘들게 애플리케이션 코드를 프로그래밍하던 방식에서 탈피, 애플리케이션 전체나 일부가 서비스 개념으로 인식되어 쉬운 조립(assembly)을 통해 새로운 비즈니스 애플리케이션을 빠르게 개발할 수 있다. 이를 통해 현업부서가 쉽게 업무를 재구축할 수 있도록 해주면서 기존 IT부서 중심의 컴퓨팅 환경은 비즈니스 중심으로 바뀌어 더욱 신속히 비즈니스 요구를 반영할 수 있다.

SOA 도입에 따른 혜택


- 탄력성의 증가로 인한 컴퓨팅 시스템 변경시 매우 유리
- 대규모 시스템이거나 원거리 협력 작업 용이
- 모듈의 재구성 가능에 따른 소프트웨어의 재사용 가능
- 이기종 환경의 통합
- 통합이 쉬워지고 민첩성이 높아지므로 ROI 높아짐
- 개발자들은 모든 종류의 사용자 접점 시스템과 작동하기에 충분할 만한 일반적인 서비스 디자인 가능
Posted by 아름프로

SOA 베스트 프랙티스: BPEL Cookbook

실제 애플리케이션 개발 경험을 보유한 설계 전문가들로부터 개발, 구축, 운영에 관련한 고급 BPEL 개념과 베스트 프랙티스를 배워 봅시다.


기존 애플리케이션을 컴포지트 애플리케이션(composite application)으로 통합하기 위한 보다 개방적이고 유연한 대안으로 SOA(service-oriented architecture)가 각광받고 있습니다. SOA의 구현 작업은 크게 두 단계로 나뉘어집니다. 먼저, 기존 애플리케이션을 재활용 가능한 서비스로 분할해야 합니다. 두 번째로, 이 서비스들을 유연한 비즈니스 프로세스 내에 “통합(orchestrate)”해야 합니다.

업계의 SOA 구현 노력을 지원하기 위한 목적에서, OTN은 SOA 및 BPEL 분야의 전문가들이 집필진으로 참여하는 새로운 시리즈 “SOA 베스트 프랙티스: BPEL Cookbook”을 기획하였습니다. 비즈니스 룰의 관리, BPEL 프로세스의 다이내믹한 생성, BPEL과 고전적 EAI 미들웨어의 통합 등을 주제로, 필자들이 실제 IT 환경에서 BPEL을 성공적으로 적용할 수 있었던 비결을 알려 드리게 될 것입니다.

이 연재에 관련한 의견 및 질문은 BPEL 사용자 포럼에 올려 주시기 바랍니다. BPEL에 관련한 개인적인 경험을 OTN 커뮤니티에서 공유하고자 하는 경우에도, 포럼을 통해 의견을 전달해 주시면 감사하겠습니다.
Oracle BPEL Process Manager를 직접 테스트해 보고자 하시는 경우, 제품 다운로드 페이지를 참고하시기 바랍니다. (15분 안에 설치를 완료하실 수 있습니다!)


Edwin Khodabakchian, VP, BPEL Development
Dave Shaffer, Director Product Management, Oracle BPEL Process Manager
Harish Gaur, Principal Product Manager and "BPEL Cookbook" Editor
Markus Zirn, Director, Strategic Customer Program


촐시된 아티클 *
Kevin Geminiuc제 1부 : 비즈니스 룰 개발을 위한 서비스 지향적 접근법
비즈니스 룰 개발 및 관리를 위한 서비스 지향적 접근법을 통해 유지보수 비용을 절감하고 조직의 유연성을 개선하는 방법을 배워 봅니다.
저자 - Kevin Geminiuc, Senior Software Architect, Policy Studies Inc.
Yves Coene제 2 부: BPEL을 이용한 웹 서비스 네트워크의 구축
European Space Agency가 BPEL 스코프, BPEL 도메인, Oracle BPEL Process Manager API 등을 이용하여 파트너 친화적인 웹 서비스 네트워크를 구축한 사례를 소개합니다.
저자 - Yves Coene, Project Manager, Spacebel s.a.
Sean Carey제 3 부: 다이내믹 BPEL 프로세스의 구현
런타임에 엔드포인트 레퍼런스를 조작하여 다이내믹 바인딩을 구현하는 방법을 설명합니다.
저자 - Sean Carey, Architect, SPS Commerce
Matjaz Juric 제 4 부: WSIF를 이용한 통합
WSIF를 이용하여 BPEL 프로세스가 Java 클래스, EJB 등의 J2EE 리소스에 네이티브한 방법으로 액세스하도록 하는 방법을 배워 봅니다.
저자 - Matjaz B. Juric, University of Maribor
Doug Todd 제 6 부: 워크플로우/프로세스 모니터링을 위한 리치 인터넷 애플리케이션(RIA)의 구현
Oracle BPEL Manager API를 확장하여 실시간 워크플로우/프로세스 모니터링 대시보드를 구현하는 방법을 설명합니다.
저자 - Doug Todd, CTO, Enterra Solutions
Jerry Thomas 제 7 부: BPEL 프로세스의 “즉석” 구현
XQuery를 이용하여 데이터베이스에 저장된 매개변수를 BPEL XML 정의 파일로 변환하고, BPEL 프로세스를 즉석에서 생성하는 방법을 설명합니다.
저자 - Jerry Thomas, Chief Architect, Centerstone Soft
출시 예정인 아티클...

제 5 부: BPEL을 EAI 환경에 추가하기
Oracle BPEL Process Manager의 “orchestration” 기능을 이용하여 표준 기반 비즈니스 프로세스를 통합하고 고전적인 EAI 미들웨어 환경을 보완할 수 있습니다.
저자 - Praveen Chandran and Arun P., Infosys


제 8 부: BPEL 운영자를 위한 가이드
BPEL 프로세스의 구축 및 운영을 위한 커스텀 프로세스 운영 툴을 생성하는 사례 연구입니다.
저자 - Stany Blanvalet

제 9 부: JMS 메시징 버스를 이용한 BPEL의 통합
JMS 호환 버스를 통해 전달되는 메시지에 기반하여 BPEL 프로세스를 다이내믹하게 생성하는 방법을 배워 봅니다.
저자 - Jeremy Bolie, IT Manager, and Todd Beets, Architect, Qualcomm


제 10 부: 포터블 SOA 통합 프레임워크의 구현
메시지의 트랜잭션 무결성을 보장하는 제너릭 BPEL 템플릿을 이용하여 새로운 애플리케이션을 기존 프레임워크에 통합하는 방법에 대해 알아 봅니다.
저자 - Edwin van den Thillart, Interaccess


* 게시 일정은 상황에 따라 변경될 수 있습니다.

Posted by 아름프로
 


ServiceMix as an enterprise service bus

Use ServiceMix 2.0 as a service-oriented message routing framework
Summary
Integrating old and new components and services using a service-oriented architecture requires an infrastructure that can connect any component or service, regardless of location, messaging protocol, and message format. To orchestrate existing services and components to meet the needs of today's dynamic business climate, this infrastructure must be highly customizable. The enterprise service bus (ESB) infrastructure fulfills these requirements. In this article, Jeff Hanson introduces the concepts behind an ESB and discusses the mechanisms it uses to facilitate cross-protocol messaging, message transformation, message security, service invocation, and other requirements of a service-oriented messaging infrastructure. (2,800 words; December 12, 2005)
By J. Jeffrey Hanson


Printer-friendly version Printer-friendly version | Send this article to a friend Mail this to a friend

Page 1 of 2


An enterprise service bus (ESB) is a centralized, logical, architectural component that operates in a distributed, heterogeneous environment to facilitate the requirements of a highly scalable, fault-tolerant, service-messaging framework. An ESB acts as an open and implementation-independent service messaging and interfacing model that isolates application code from the specifics of routing services and transport protocols, and allows substitution of service implementations as needed.

An ESB acts as a shared messaging layer for connecting applications and other services throughout an enterprise computing infrastructure. It supplements its core asynchronous messaging backbone with intelligent transformation and routing to ensure messages are passed reliably. Services participate in the ESB using either Web services messaging standards or Java Message Service (JMS). Originally defined by analysts at Gartner, ESB is increasingly seen as a core component in a service-oriented infrastructure.

In this article, I discuss the open source ESB ServiceMix and its relationship to the Java Business Integration specification.

Minimum requirements of ESB message delivery
The minimum requirements of an ESB, as a message delivery system, are often referred to by the acronym TRANS, which defines an ESB as a software entity that does the following:

  • Transforms messages from one format to another to accommodate the requirements of registered service providers.
  • Routes messages to registered services while providing quality-of-service and service-level features.
  • Augments message content with information, such as additional metadata, about the message requester. Augments the message protocol to meet service provider requirements.
  • Notifies registered message listeners about specific message requests.
  • Secures delivery of messages by enforcing authentication, authorization, nonrepudiation, confidentiality, etc.

Introducing Java Business Integration (JBI)
The Java Business Integration (JBI) specification and API defines a platform for building enterprise-class ESBs using a pluggable, service-based design. JBI builds on the TRANS foundation with normalized messages and component-based interactions.

JBI is a specification and an API for a normalized messaging service along with a component framework and management model for deploying integration services such as routing engines, rule engines, and transformation services. A JBI-based design specifies a standards-based pluggable architecture with a JVM-based runtime component called the normalized message router (NMR).

The high-level interactions of JBI can be seen in Figure 1 below.








Figure 1. High-level view of JBI. Click on thumbnail to view full-sized image.



JBI embodies a messaging model based on Web Services Description Language (WSDL) for easy mapping to Web services, HTTP, email, and JMS. JBI integrates with legacy systems, binary transports, document-oriented transports, and RPC (remote procedure call) systems.

Figure 1's binding components deal with protocol-oriented relationships and components. And service-engine components in JBI support content-based routing, orchestration, rules, transformations, custom augmentation, etc.

Normalized messages
JBI uses a "normalized" message—consisting of a payload, optional attachments, and metadata—for interaction between consumers and providers. Message normalization is the process of mapping context-specific data to a context-neutral abstraction to transport data in a standard format. All messages handled by the NMR are normalized.

A normalized message consists of three main parts:

  1. Message content, also referred to as "payload," which is an XML document that conforms to an abstract WSDL message type with no protocol encoding or formatting.
  2. Message properties or metadata that hold extra data associated with the message. This metadata can include security information, transaction-context information, component-specific information, etc. Message properties form the first part of what is referred to as the message context.
  3. Message attachments referenced by the payload, contained within a data handler used to manipulate the attachment's contents. Attachments can be non-XML data. Attachments form the second part of the message context.

Normalized message router
The JBI message exchange depends on the NMR to route message exchange objects between service consumers and providers. The NMR performs such message delivery with varying qualities of service, depending on application needs and the nature of the messages being delivered.

An NMR is not embodied by any concrete object. It is abstracted as a set of APIs, SPIs (service provider interfaces), and components. The NMR APIs include:

  • JBI Message API
  • JBI Service API
  • JBI Message Exchange Factory API
  • Service Description SPI
  • Message Exchange Patterns API
  • Endpoint Reference API

Delivery channels
A JBI delivery channel represents a bidirectional communication pipe used by binding components and service engines to transport messages across the NMR. The javax.jbi.messaging.DeliveryChannel interface forms the API contract between service consumers, service providers, and the NMR.

A service consumer uses its delivery channel to initiate service invocations, while a service provider uses its delivery channel to receive invocations. A component that functions as both consumer and provider uses the same delivery channel for both roles. Therefore implementations of DeliveryChannel must support concurrent use of a given instance from multiple threads.

Components
The JBI component framework provides a pluggable interface that allows binding components and service engines to interact with the JBI environment. The framework provides the interface to all of the JBI services.

JBI supports two kinds of components, service engines and binding components. Components interact with JBI in two ways:


  1. SPIs: Interfaces implemented by a binding or engine
  2. APIs: Interfaces exposed to bindings or engines by the framework

Service engines
Service engines are the business-logic components in a JBI system and can serve as service providers/consumers. Service engines orchestrate service consumption and requirements. Service engines can also provide services such as data transformation, sophisticated routing, and message coordination facilities.

Binding components
Binding components are used to send and receive messages across specific protocols and transports. They uncouple the JBI environment from protocol specifics by marshalling and unmarshalling messages to and from protocol-specific data formats, allowing the JBI environment to process only normalized messages.

Normalized message exchange
JBI's principal purpose is to route normalized message exchanges from one component to another. Messages are delivered in a normalized form.

Binding components must convert protocol/transport-specific messages to a normalized form. Binding components and service engines interact with the NMR via a delivery channel, which provides a bidirectional delivery mechanism for messages.

An external service consumer sends a service request across a specific protocol and transport to a binding component. The binding component converts the request to a normalized message. The binding component then creates a message packet called a message exchange (ME) and sends it across the binding component's delivery channel to the NMR for delivery to a service provider.

After receiving a message, the consuming service engine or binding component creates a normalized message, putting it into a new MessageExchange instance, and sends it to the target ServiceEndpoint instance. After accepting the ME, the ServiceEndpoint component de-normalizes the message into protocol and transport format, and sends the message along to the external service provider.

Service units
Component-specific artifacts deployed to an installed engine or binding are referred to as service units. Service units are grouped into an aggregate deployment file called a service assembly. This file includes a deployment descriptor that indicates the component into which each service unit is to be deployed.

Service units contain:


  • Metadata: JBI descriptor for services consumed/produced
  • Artifacts: Generally XML (possibly binary, whatever the target binding component or service engine needs)
Next page >
Page 1 ServiceMix as an enterprise service bus
Page 2 Introducing ServiceMix

See JavaWorld Talkback on the last page of this article to post your comments and see how fellow readers reacted.

Printer-friendly version Printer-friendly version | Send this article to a friend Mail this to a friend

Posted by 아름프로
JBI – A Standard-based approach for SOA in Java


December 2005

Discussion



The industry has witnessed the evolution of a wide range of solutions addressing the problem space of B2B and enterprise application integration (EAI). These solutions varied from proprietary message oriented middleware to standard JMS based solutions and web services. This paper provides a brief introduction to the upcoming JBI (Java Business Integration) standard in relation to SOA (service-oriented architecture) principles and the ESB (Enterprise Service Bus) infrastructure.


Service Oriented Architecture


SOA (service-oriented architecture) is one of the latest developments that have made a huge leap in the area of application and business integration. SOA defines a set of well-defined architectural principles, paradigms and best practices to enable loosely coupled interaction between applications.


SOA promotes loosely coupled interaction between participating applications based on well-defined interfaces. Service implementations are self-contained and dont depend on the contextual information and state of other services. Service interactions are mainly based on exchanging document-style data, defined using a standards-based messaging model. The services themselves are agnostic to the transport level interactions required to enable the communication between the service provider and service consumer.


Even though not a mandatory requirement, most of the modern SOA based systems utilise web services and related technologies for providing the required plumbing for the interactions between services. WSDL (Web Services Definition Language) is used as the main artefact for representing messaging models; SOAP as the message representation protocol and HTTP as the wire-level transport protocol. This doesnt mean you always need to use the aforementioned technologies for implementing systems based on service-oriented architecture. Lot of enterprises have used similar architectures for realising loosely coupled systems, well before any of these buzzwords came into existence. However, the key difference is that now we have standards-based protocols, toolsets and software for enabling service oriented architecture.


SOA principles are significantly different from object-oriented paradigms and principles. The key difference is that the interactions between services are defined using interfaces that are oriented more towards data than behaviour. A service in isolation may be realised using object-oriented principles and techniques, however, the interactions between the services seldom use any of these techniques. Rather, these interfaces are geared more towards document-based interchanges. Where object-orientation binds behaviour closer to data, service-orientation decouples data from behaviour.


Enterprise Service Bus


An ESB (Enterprise Service Bus) provides the infrastructure for realising service-oriented architecture. ESBs provide a runtime environment for deploying and enabling your services augmented with design-tools for defining the interaction and orchestration of the services.



In the ESB world the services dont directly interact with each other. Rather, the ESB runtime acts as a mediator between the services to loosely couple them. The ESB runtime would implement protocol bindings, message translation, message handling etc.


The key services provided by an SB would include:



  • Providing transport bindings for the services
  • Providing definition and discovery of the deployed services
  • Rules based routing and orchestration of messages between services
  • Value added services including document transformation etc

Most of the ESB vendors base their SOA proposition on open standards and technologies including the various web services standards and protocols. They provide a variety of transport bindings for invoking the services including HTTP, FTP, and JMS etc. Most ESBs use WS-BPEL (Business Process Execution Language for Web Services) for realising orchestration between the deployed services for implementing business processes. ESB vendors also provide quality of service features including fault-tolerance, failover, load balancing, message buffering etc.


Java Business Integration


JBI (Java Business Integration) is a Java-based standard addressing the EAI and B2B issues based on the paradigms and principles advocated by service-oriented architecture. The current version (1.0) is finalized through the JSR (Java Specification Request) 208 in August 2005. Both commercial and open source worlds have already started embracing JBI as an integration standard in their ESB products.


Mediator-based Architecture


JBI defines a plug-in based architecture where services can be plugged into the JBI runtime environment. JBI provides well-defined interfaces for services to interact with the JBI runtime environment. The services need to expose interfaces to the JBI runtime environment for the JBI runtime environment to route messages to the services. The JBI runtime environment acts as a mediator between the services that are deployed in the environment.



The JBI runtime core mainly comprises of the following components within the same JVM:



  • Component framework: The component framework enables the deployment of the different types of components within the JBI runtime.
  • Normalized Message Router: Normalized message router enables a standard mechanism of message interchange between the services.
  • Management framework: The management framework based on JMX enables the deployment, management and monitoring of components within the JBI runtime.

Component Model


JBI defines two types of components in the JBI runtime environment,



  • Service Engine Components: These are components responsible for implementing business logic and other services. The SE components can internally be realised using various technologies and design principles. SE components can be as simple as a component that provides low-level services like data transformation and translation or something more convoluted as a WS-BPEL instance that models an intricate business process.
  • Binding Components: Binding components are mainly used to provide transport level bindings for the deployed services. BC components can be of a variety of types including,

    • Enabling remote communication with external systems using standard transport protocols.
    • Enable in-VM invocation between two services deployed in the same JVM.
    • Enable communication between services using standard WS-I (Web Services Interoperability) profiles.

The key aspect of JBI is the decoupling of the service engine and binding components so that business logic is not infested with the infrastructure details required for invoking and consuming services. This promotes a flexible and extensible architecture. Both BC and SE components within JBI can be service providers and/or service consumers.


Both BC and SE components provide interfaces to the JBI runtime for accepting messages from the JBI runtime. Similarly, they use interfaces provided by JBI for communicating with the JBI runtime.


Messaging Model


JBI uses a messaging model that decouples the service consumers from the service providers. The messaging model is defined using WSDL. WSDL is used to describe the operations exposed by both SE and BC components. WSDL is also used to define transport level bindings for the abstract service operations.


One of the key components used in the JBI architecture is NMR (Normalized Message Router). NMR provides the main messaging spine built around WSDL, which provides the loosely coupled message exchange between the SE and BC components deployed within the JBI runtime. Services are required to have interfaces, which are an aggregation of operations. Each operation is composed of zero or more messages. An interface can have one or more transport level bindings.


JBI uses a normalized format for representing messages within the runtime. A normalized message is composed of the following parts,



  • Message properties
  • Message payload
  • Message attachments

The JBI specification provides standard interfaces for the service consumers and providers for exchanging messages with the NMR. NMR supports both one-way and request-response semantics for service invocation between consumers and providers.


Management


JBI uses JMX for the runtime installation, configuration and monitoring of services. The services are required to implement a set of JBI interfaces to make them manageable in the JBI environment. The JBI environment is required to provide a set of JMX MBeans to enable the management of the JBI runtime.


The JBI runtime environment allows the following operation related to the SE and BC components,



  • Installation of components: This will make the component interface available to the normalized message router.
  • Installation of component artefacts: This will allow deployment of component artefacts required for the functioning of installed components. For example, this could be deploying the connection details required to connect to a database for a deployed service that requires connecting to the database.
  • Starting and stopping of services and groups of related services.

JBI defines standard deployment descriptors and packaging models for both components and component artefacts.


Roles


JBI identifies the following roles for providing an end-to-end JBI based EAI solution,



  • Engine developers: Engine developers are required to provide the SE components that adhere to the NMR and management contracts.
  • Binding developers: Binding developers provide the binding components that adhere to the NMR and management contracts.
  • JBI Environment providers: JBI environment providers are required to support the JBI runtime using either J2EE 1.4 or J2SE 1.4 r newer platform.
  • J2EE Platform providers: J2EE platform providers may include a JBI runtime as part of their application server offerings.
  • JBI Application developers: JBI developers build JBI applications using the SE and BC components and the JBI environment.

Conclusion


With the whole industry aligning more and more towards open standards and specifications, JBI takes a great leap in enabling Java technologists adopting a standards-based approach in addressing integration issues using service oriented architecture and ESB infrastructure. Both commercial vendors like Oracle and open source software like ServiceMix have already started adopting JBI as part of their ESB offerings.


About the Author


Meeraj Kinnumpurath works as a Java architect with VOCA Ltd (formerly BACS), who are the largest clearing house in Europe. He has been using Java for the past eight years, developing enterprise applications. He has also published a few books on Java, J2EE and Web Services.


PRINTER FRIENDLY VERSION

Posted by 아름프로

Web Services + EA = SOA

2005. 10. 26. 16:54

Web Services + EA = SOA

.최근 정보기술의 방향에서 중요한 키워드 중 하나가 바로 서비스(Service)이다. 서비스는 정보기술이 현실에서 지향하는 바를 한 마디로 설명할 수 있는 중요한 단어이다. 서비스 지향 아키텍쳐(Services-Oriented Architecture; 이하 SOA) 역시 서비스의 관점에서 소프트웨어 아키텍쳐를 조망하는 기술로 최근 많은 각광을 받고 있으며, 시장조사업체인 가트너 그룹은 2006년까지 전 세계 비즈니스 애플리케이션의 80% 이상이 SOA를 기반으로 개발될 것이라고 전망하고 있다.
..SOA의 설명을 위해 자연스럽게 떠올리게 되는 두 가지 키워드가 웹 서비스(Web Services)와 전사적 아키텍처(Enterprise Architecture; 이하 EA)이다. 웹 서비스와 EA는 기업 및 공공기관에서 가장 관심을 높게 보이는 기술 이슈이다. 국내의 모든 공공기관들은 EA를 필히 구축해야 하고 전자정부 애플리케이션의 통합 및 연계를 위해서는 기업에 종속적인 EAI 메카니즘이 아닌 표준화된 기술 즉, 웹 서비스를 반드시 적용하도록 규정하고 있다.
..본 고에서 다루고자 하는 내용은 국가적 필수 적용 기술인 웹 서비스, EA와 새로이 떠오르고 있는 기술인 SOA의 관계를 도출하는 것이다. 그렇게 함으로써 SOA의 적용에 Web Services와 EA가 어떤 역할을 할 수 있는 지를 파악하고자 한다.
..이를 위해 먼저 SOA의 개념에 대해 간단히 설명한 후 Web Services, EA와의 관련성을 각각 분석한 후 결론 부문에서 이들 세 기술간의 관계를 도출하였다.

SOA 개

..SOA는 소프트웨어 아키텍처의 일종이다. 따라서, SOA를 이해하기 위해서는 이를 구성하고 있는 요소들을 파악할 필요가 있는데, 본 절에서는 먼저 SOA와 서비스를 정의하고 이를 기반으로 구성요소들을 살펴보도록 한다.


    1) SOA의 정의
    ..사실 SOA는 이미 CORBA나 DCOM등의 분산 객체 기술에서 그 기본 개념이 사용되었으나, 기술적인 문제(기술적인 미성숙 및 공개 표준의 부재)와 비즈니스 문제들(주요 소프트웨어 벤더들 간 협력의 부재)로 인하여 그리 큰 주목을 받지 못했다. 하지만 XML 기반의 웹 서비스 기술이 등장하면서 SOA는 새롭게 조명을 받고 있다.
    ..W3C는 SOA를 "호출 가능한 컴포넌트의 집합"으로 정의 하고 있다. 여기서 컴포넌트는 그 인터페이스의 정의 내용이 공개(publish)?발견(discovery) 가능한 것을 의미한다.
    ..하지만 CBDI는 이 정의에 대해 두 가지 문제점을 지적하고 있다. SOA가 단순한 컴포넌트의 집합이 아니라는 점과, 정의 자체가 아키텍처의 구성 방법 보다는 이미 정의되어 있는 컴포넌트만을 염두 해두고 있다는 점이다. 따라서 CBDI는 SOA를 "애플리케이션의 기능들을 사용자(consumer)에 적합한 크기(granularity)로 공개한 서비스들의 집합으로 제공하고 사용되게 하는 정책(policy), 적용(practice), 또는 프레임워크(framework)"로 정의하고, 이 때 서비스는 "단일한 표준기반의 인터페이스 형태를 사용하여 구현과 독립적으로 추상화되며, 호출(invoke)되고, 공개(publish)되며, 발견(discover)할 수 있는 것"이라 정의하였다.
    ..즉, SOA란 서비스라 불리는 분할(decomposition)된 애플리케이션 조각들을 단위로 느슨하게 연결해 하나의 완성된 애플리케이션으로 만드는 아키텍처이다.

    2) SOA의 구성요소
    ..<그림 2>는 SOA의 기본 구성요소를 도시하고 있는데, 각 요소는 다음과 같다.



    - 서비스 사용자(Service Consumer) : '서비스 제공자'에 의해 제공되고 있는 하나 이상의 서비스를 사용한다.
    - 서비스 제공자(Service Provider) : '서비스 사용자'가 호출시 입력하는 값을 가공하여, 그에 해당하는 결과를 제공한다. 경우에 따라 '서비스 제공자'는 또 다른 - - '서비스 제공자'의 서비스를 사용하는 '서비스 사용자'가 될 수도 있다.
    - 서비스 레지스트리(Service Registry) : 서비스에 대한 설명 정보(descriptions)를 저장하고 있다. '서비스 제공자'는 자신이 제공하고 있는 서비스를 등록하고, '서비스 사용자'는 자신의 원하는 서비스를 발견하여 사용한다.

<그림 2> SOA의 구성 요소

위의 그림으로부터 우리는 SOA를 이해하기 위한 세가지 주요 요소를 추출할 수 있다. 서비스, 메시지 그리고 서비스 발견 등이 그것이다. 이들 각각에 대한 이해를 통해, 우리는 SOA의 본질에 보다 가까이 갈 수 있다.


<그림 3> 서비스의 구조

가. 서비스(Services)
..SOA의 관점에서 서비스는 인터페이스를 통해 자신이 가진 비즈니스 프로세스를 처리할 수 있는 컴포넌트로 정의된다. <그림 3>과 같이 서비스는 인터페이스와 구현 부분으로 구성된다. 서비스가 가지는 특징을 다음과 같이 3가지로 요약할 수 있다.
..- 서비스의 인터페이스는 플랫폼에 독립적이다
..- 서비스는 동적으로 검색될 수 있으며, 호출될 수 있다.
..- 서비스는 self-contained하다. 즉, 자신의 상태를 스스로 유지한다.
..서비스의 탄생으로 인해 자체적으로 소프트웨어를 만드는 기업은 점차 사라지고, 향후에는 만들어져 있는 소프트웨어를 서비스 단위로 구입하여 사용하는 패러다임이 대세를 이룰 것으로 예상된다.
나. 메시지 (Messages)
..SOA를 이루는 두 번째 중요한 개념은 메시지이다. 서비스 제공자와 서비스 사용자는 메시지를 통해 서로 통신한다. 서비스 제공자는 서비스 명세를 통해 자신이 가진 서비스의 인터페이스를 공개하는데, 이 명세 내에는 서비스가 제공하는 기능과 이를 이용하기 위해 사용자와 주고 받아야 하는 메시지의 형식이 정의되어 있다. SOA 관점에서 서비스는 플랫폼 독립적이어야 하므로, SOA에서 정의되는 메시지는 특정 기술에 독립적이어야 한다. <그림 4>는 서비스 제공자와 서비스 사용자가 메시지를 통해 통신하는 모습을 보여준다.




<그림 4> 메시지를 통한 서비스 사용 구조



..이러한 SOA 메시지를 체계를 응용하면 <그림 5>와 같이 보다 복잡한 아키텍처를 구성할 수 있다. 그림과 같이 서비스 제공자는 동시에 서비스 사용자가 될 수 있다. 서비스 제공자는 다른 서비스 제공자로부터 비즈니스 프로세스나 컨텐츠 등을 제공 받아 보다 가치 있는 서비스를 제공할 수 있다.


<그림 5> 서비스 통합 구조



다. 서비스 발견(Discovery)
..서비스 발견이란 서비스 사용자가 서비스 레지스트리로부터 자신의 원하는 서비스 제공자를 찾는 작업을 말한다. 이를 위해서는 서비스 레지스트리는 서비스를 등록하고 발견하는 기능을 제공해야 한다. SOA의 관점에서 서비스 레지스트리는 다음과 같은 요구사항을 만족해야 한다.
..- 서비스의 확장성(scalability) 보장
..- 서비스 사용자와 제공자의 분리 (decoupling)
..- 서비스의 동적인 변경 기능 제공 (hot update)
..- 서비스 사용자를 위한 검색 기능 제공 (동적인 검색 기능 포함)


3) SOA의 특징
..SOA가 가지고 있는 중요한 특징을 정리하면 다음과 같다.



- 서비스는 발견이 가능하고 동적으로 바인딩 된다.
- 서비스는 컴포넌트와 같이 독립된 모듈이다.
- 서비스의 플랫폼간 상호 운용이 가능하다.
- 서비스는 느슨하게 연결된다.
- 서비스는 네트워크 주소로 접근 가능한 인터페이스를 갖는다.
- 서비스는 위치 투명성을 제공한다.
- 서비스의 조립이 가능하다.
- 서비스는 자기 치유(self-healing)를 지원한다.


4) SOA의 이점
..SOA는 기업 내의 어플리케이션 아키텍처를 보다 유연하고 확장 가능하도록 구성할 수 있게 하는 패러다임이다. 이러한 특징으로 인해 기업은 SOA를 통해 다음과 같은 이점을 얻을 수 있다.



- 기존 자산을 최대한 이용할 수 있게 한다.
- 빠른 시장 접근이 가능케 한다.
- 전반적인 IT 비용을 절감해준다.
- 위험관리를 용이케 한다.
- 끊임없는 비즈니스 프로세스의 진보를 이루게 한다.
- 프로세스 중심의 아키텍처를 유지할 수 있게 한다.


SOA vs. Web Services


..SOA와 웹 서비스의 관계는 많은 자료에서 언급하고 있다. 일반적으로 그 내용은 거의 유사하지만 제시하는 기관마다 약간의 시각차이가 존재하고, 특히 SOA를 정의하는 관점에 따라서도 차이가 존재한다. 여기서는 여러 자료를 토대로 SOA와 웹 서비스의 관계를 도출하고 구체적으로 웹 서비스를 통해 SOA를 구현하는 방법까지 정리하였다.


1) SOA와 웹 서비스의 관계
..SOA는 웹 서비스 개념보다 먼저 출현하였으며, 웹 서비스 보다 포괄적인 개념이다. SOA는 소프트웨어 개발 패러다임에 가깝고, 웹 서비스는 이러한 SOA의 패러다임을 실현하기 위한 다양한 기술 구현 사례라고 할 수 있다. 이름에서 알 수 있듯이 SOA는 아키텍처이다. 웹 서비스와 달리 특정 기술의 집합이 아니다. SOA는 기술적인 것을 초월할 뿐만 아니라 기술로부터 독립적이다. 비즈니스 환경에서 SOA의 순수한 아키텍처적인 정의는 "호출 가능한 잘 정의된 인터페이스를 갖는 독립된 기능의 서비스로 정의한 애플리케이션 아키텍처"이다. 반면, 웹 서비스는 기술의 집합이며 SOA의 개념을 보다 구체화한 것이다. <그림 6>은 이들 간의 관계를 개념화한 것이다.


<그림 6> SOA와 웹 서비스의 관계



..웹 서비스는 단순히 SOA를 구현한 것만은 아니다. 웹 서비스는 SOA 구현의 Best Practice라고 할 수 있다. 왜냐하면 SOA의 근본적인 철학을 고스란히 실현할 수 있도록 플랫폼 독립적인 프로토콜과 기술을 채택했기 때문이다. 앞에서도 밝혔듯이 웹 서비스가 HTTP, XML, SOAP, WSDL, UDDI 등의 프로토콜을 채택한 것은 SOA의 기본적인 요구사항을 만족하기 위해서라고 할 수 있다. 이들 기술은 특정 컴퓨팅 기술에 중립적이며, de-facto 표준에 가깝다.
..웹 서비스는 SOA를 개념 수준에서 구현이 가능한 현실로 끌어올리는데 중요한 역할을 한다. 현재도 웹 서비스를 이루는 기술표준들은 진화하고 있으며, 이들이 보다 견고해짐에 따라 SOA를 채택하기 위한 위험요소도 점차 제거될 것으로 기대된다.


2) 웹 서비스를 이용한 SOA의 구현
..SOA에서 기본적으로 요구하는 컴퓨팅 관련 사항과 웹 서비스의 대응 기술은 다음과 같다.



- SOA는 플랫폼 독립적인 방식으로 호출될 수 있는 서비스로 구성된다 - XML, SOAP
- 서비스는 플랫폼, 프로그래밍 언어에 독립적인 인터페이스를 갖는다. - WSDL
- 서비스는 표준체계에 의해 등록이 가능하며, 동적으로 발견 가능하다. - UDDI


..웹 서비스는 W3C SOAP 1.2 표준을 통해 서비스 사용자와 제공자 사이의 통신을 구현한다. <그림 7>은 이를 표현한 것이다.

<그림 7> SOAP을 통한 서비스 호출

..웹 서비스에서 사용하는 서비스 기술의 표준은 WSDL이다. WSDL은 서비스 사용자와 제공자가 주고 받을 메시지를 XML로 정의하며, 모든 프로그래밍 언어에 독립적으로 작동한다.


<그림 8> WSDL을 통한 웹 서비스의 기술


<그림 9 > UDDI의 동작 패턴

SOA vs. EA


..SOA와 EA의 관계는 다양한 시각에서 논의되고 있다. 이 둘의 관계는 바라보는 관점이나 적용 범위에 따라 차이가 있을 수 있으나 SOA가 EA의 하위 아키텍처를 구성한다는 관점과 SOA와 EA가 상호보완적 개념이라는 관점이 언급되고 있다. 여기서는 이러한 SOA와 EA의 관계에 대한 몇 가지 관점들에 대해 설명해 보고자 한다.



1) SOA를 EA의 하위 아키텍처로 보는 관점
..<그림 10>처럼 SOA를 EA의 하위 아키텍처의 구현 방안으로 보는 시각으로서 SOA가 EA의 기술 부문 (데이터/애플리케이션/기술)의 아키텍처라는 시각과 EA의 애플리케이션/기술 아키텍처의 일부라는 시각으로 나뉘어 진다. 이들은 SOA를 비즈니스 관점에서는 배제하고 주로 기술 관점, 특히 기업 애플리케이션을 구현하기 위한 기술 아키텍쳐 관점에서 주로 SOA를 바라보고 있다.

<그림 10> EA의 하위 아키텍처로서의 SOA


가. SOA는 EA의 기술부문(데이터/애플리케이션/기술)에 해당한다.
..SOA가 EA의 기술부문, 즉 데이터/애플리케이션/기술 아키텍처에 해당한다는 관점으로 비즈니스 프로세스 구현에 필요한 기술적인 사항들을 SOA로 구성할 수 있으며 이를 통해 EA가 추구하는 유연하고 민첩한 구조를 달성한다는 관점이다.


<그림 11> SOA를 통한 분산 데이터 아키텍처의 구현


SOA를 통한 조직의 데이터 아키텍처 변화를 <그림 11>에서 표현하고 있다. 이처럼 각각의 서비스가 관련된 데이터를 직접 관리하는 분산 데이터 환경으로 변화하게 된다.

나. SOA는 EA 기술아키텍처를 구성하는 패턴(Pattern)의 하나이다.
..이 관점은 가트너 그룹에서 주장하는 EA와 SOA의 관계로 SOA는 EA를 구성하는 하나의 기술 패턴이라는 관점이다. 패턴이란 '정해진 문제점에 대하여 여러 사람들이 공감하는 해결책'이라고 할 수 있다. 이는 <그림 12>의 가트너 EA 프레임워크를 통해 이해할 수 있다. 여기서는 일반적인 매트릭스 형태의 EA 프레임워크와 달리 EA 구성요소들의 수직적이고 계층적인 관계에 중점을 두고 있다.

<그림 12> 가트너 EA 프레임워크와 SOA


..가트너의 EA 프레임워크에서 SOA의 위치를 살펴보면 비즈니스 프로세스/스타일 하부의 기술 패턴에 위치하고 있으며 SOA의 구현과 관련된 기술들은 패턴의 하부를 구성하는 기술 단위체인 벽돌(Brick) 레벨에 위치하고 있는 것을 알 수 있다.


2) To-Be 아키텍쳐의 구현 방안으로서의 SOA
..EA는 그 정의에서 알 수 있듯이 As-Is 아키텍처와 To-Be 아키텍처 그리고 To-Be 아키텍처의 구현계획과 관련된 표준/가이드로 구성 되어 있다. To-Be 아키텍처의 구현 방법으로는 신규 개발, 외부도입, 기존 시스템의 전환(migration) 등의 방안이 있으며, 이중 기존 시스템의 전환 방안에 SOA가 적용 될 수 있다. 이는 CBDi에서 제시하는 방안으로 <그림 13> 과 같이 기존 시스템을 전환할 수 있다. 초기에는 획일적인 형태의 레가시 시스템을 웹 서비스와 같은 SOA에 적합한 기술을 적용하여 래핑을 실시하여 외부와의 인터페이스를 정형화한 후 최종적으로는 래핑한 내부의 레가시 시스템을 컴포넌트로 재정립함으로써 완전한 형태의 SOA 구조로 변환할 수 있다.

<그림 13> SOA를 이용한 As-Is 아키텍처의 Migration

..이처럼 SOA는 기업의 최종 목표 시스템 아키텍쳐를 구현하기 위한 방안으로서 가장 적절한 대안이라고 할 수 있다.

3) SOA와 EA의 관계
..앞에서 언급된 여러 가지 SOA와 EA의 관계를 분석해 보면, SOA는 EA와 매우 밀접한 관계를 가지고 있다는 것을 알 수 있다. 이들을 다시 정리해 보면, SOA를 단순히 EA의 하위 아키텍쳐로 바라봄으로써 단순히 기술 아키텍쳐를 표현할 수 있는 패턴으로 보는 관점과 보다 넓은 관점에서 미래 지향형 EA를 구축하기 위한 방안으로 볼 수 있다.
..두 가지 관점 모두 의미가 있지만, 후자의 관점이 보다 설득력이 있다. 결론적으로, SOA는 EA가 추구하는 목표들은 명확하게 달성할 수 있게 해주며, EA가 제공하는 조직의 전사적 구조는 SOA의 적용을 용이하게 해주는 상호보완적 관계라고도 할 수 있다.



<그림 14> SOA와 EA의 관계

..이를 그림으로 표현해보면 <그림 14>와 같다. 즉, 'SOA 개념이 EA에 반영되어 내재화됨으로서 조직의 정보기술구조를 보다 유연하고 민첩하게 할 수 있다'라고 정의하는 것이 바람직하다.


Web Services + EA = SOA ??


..지금까지 SOA, 웹 서비스, EA에 관한 개념과 이들 상호간의 관계에 관하여 다각적인 측면에서 조망해 보았다. 아직은 초기 단계이기 때문인지 대다수가 정답으로 받아들이는 내용은 아직 없다.
그래서 본 고에서는 이들 간의 관계를 주관적이긴 하지만 앞선 연구결과들의 객관성을 반영하면서 전체가 지향하는 방향에 맞게 이들의 관계를 정립해 보았으며, 최종 SOA 방정식의 결과로 아래의 두 가지 명제를 도출하였다.
.."웹 서비스는 SOA의 구현을 위한 현존하는 최적의 기술 대안이다."
.."SOA는 차세대(To-Be) EA 구현을 위한 최적의 아키텍쳐이다."
..이를 그림으로 표현하면 <그림 15>와 같다. SOA는 EA의 모든 부분을 구현할 수 있는 차세대 아키텍쳐이며, 웹 서비스는 SOA의 기술 도메인과 EA의 기술 아키텍쳐, 비즈니스 프로세스 영역을 담당하고 있으며, SOA 구현을 위한 최적의 기술이라고 할 수 있다.


<그림 15> Web Services + EA = SOA ??

..SOA의 구현을 위한 가장 최적의 기술이 웹 서비스라고 한다면 웹 서비스 성공의 1차 관건은 SOA라는 철학을 기업의 EA에 반영하는 것이다. EA에 반영된 SOA는 EA의 활용/진화 과정을 통해, 웹 서비스 형태로 기업에 내재화 될 것이며 이를 통해 기업은 정보기술분야의 효용성을 증대 시킬 수 있을 것이다.
..이러한 구조는 기업의 정보시스템 구조를 느슨하게 연결된(Loosely Coupled) 형태로 만들어 변화하는 비즈니스 환경에 보다 유연하고 신속하게 대응할 수 있는 능력을 제공한다. 즉, 비즈니스 환경이 변하여 그에 대한 정보기술부문의 요구사항이 발생하면 EA에 정의되어 있는 SOA에 관련된 기술, 표준 등을 통해 자체적으로 서비스를 개발하거나 표준화된 인터페이스에 적합한 외부 서비스를 서비스 중개자(Service Broker)를 통해 조달 하여 비즈니스 부문의 요구사항에 보다 신속하게 대응 할 수 있는 것이다.
..긍극적으로 SOA, 웹 서비스, EA는 미래지향적인 기업의 정보기술구조를 구현하고 관리하기 위해 꼭 필요하며, 이들은 서로가 독립적으로 위치하기도 하지만 상호간에 연결도가 높은 철학, 기술, 개념이라고 할 수 있다

Posted by 아름프로

ESB vs SOA

2005. 8. 2. 16:00

ESB vs SOA


I also would like to add some precisions on the differences between ESB (Enterprise Service Bus)
and SOA. There
is a fundamental difference between EAI (and the web service enabled EAI, a.k.a.
ESB) and SOA. EAI relies on a "common information model", with a
central EAI manager, onto which enterprise systems are bolted via
connectors (be it web services, JCA or anything else). The bus represents both
the common information model and the EAI manager. In an ESB, connected systems are not in control, the EAI manager is.
ESB is not SOA. SOA requires a registry onto
which peers registers and find other peers. In a SOA, every peer is at the same
level, there is no center of control, nothing in the middle, therefore no need
for a common
information model. Peers are not defined by their "contract" but
rather by how they interact with each other (i.e. collaborate via a message
choreography). To answer Collaxa's question, IMHO, Indigo is not an ESB, it
is a true SOA framework, just like TME's
GAIA or SUN's

JXTA project. (Please
take a look at figure 7 of the BCM introduction
). ESB can be viewed as a very
particular case of SOA, a special kind of fabric if you will, but it is
certainly not the only fabric possible. 


Another aspect that few people seem to be grasping at the moment is that for building SOAs
we need the
notion of "service domains" (no, this is not the same thing as
Scopes, since scopes have always a context associated to them). This notion is natural as soon as we
think of a company boundary (which will be its own service domain), but the
concept is also useful at a lower level of granularity. It greatly simplifies
problems like management, security, ... but also offer an extra level of
decoupling. WS-CAF is going a bit in this direction with the concept of
coordination, but it stops short of providing "domain level" logic, it
rather relies on well defined composition of web services packaged in a
"composite application".

Posted by 아름프로





Event-driven services in SOA


Design an event-driven and service-oriented platform with Mule





Summary


Responding to real-time changes and events in a timely manner is becoming one of the most important requirements for an enterprise framework. This article discusses technologies and mechanisms that enable a service-oriented framework to effectively respond to real-time stimuli and, therefore, send and receive synchronous and asynchronous events across layers of an architectural stack without knowing the details of the underlying event system. (2,800 words; January 31, 2005)


By Jeff Hanson








Internet transactions, business-to-business systems, peer-to-peer processes, and real-time workflows are too dynamic and too complex to be modeled by traditional sequential-processing methods. Therefore, the need for more sophisticated asynchronous processing techniques is quickly becoming apparent. To address these unpredictable environments, the current trend in systems architecture is service-oriented design and event-driven programming.



A service-oriented architecture (SOA) presents a dynamic runtime environment, where loose couplings between service providers and/or service consumers enable powerful and flexible component interactions. Building a communication model to exploit this power and flexibility is a high priority for competitive software development. An event-driven communication model is able to respond better to real-time changes and stimuli than conventional request/reply mechanisms.



Service-oriented and event-driven architectures are natural fits for distributed systems since they share many of the same characteristics, such as modularity, loose-couplings, and adaptability.



In this article, I discuss the details of designing an effective event-driven and service-oriented platform using Mule, a lightweight event-messaging framework designed around an enterprise service bus (ESB) pattern. Components and applications can use Mule to communicate through a common messaging framework implemented transparently using Java Message Service (JMS) or another messaging technology.

Overview of service-oriented architecture

The term "service-oriented" has evolved to define an architecture where a service is a software component that embodies a core piece of an enterprise's business logic and features the following characteristics:



  • Loosely coupled: Services are not fundamentally bound with other components


  • Protocol-independent: Multiple protocols can transparently access a given service


  • Location-agnostic: A given service typically performs a composite form of business logic and returns the result in a single call


  • Coarse-grained: Services can be accessed in the same manner no matter their location


  • Maintains no user state



Services typically focus exclusively on solving business-domain problems.



Generally, service clients rely on configuration data, registries, and software factories to determine the location, protocol, and public interface for each service.



Applications are typically described by what they do, not necessarily by what they are or what they contain. For this reason, it's much more straightforward to describe an application publicly using verbs (services) as opposed to nouns (objects). Since objects define a thing and not an action, an impedance mismatch can occur when attempting to encapsulate what a component does as opposed to what a component is. In SOA, an application is described naturally, since each logical business operation of the application that can be verbalized is a likely candidate for a service. Therefore, SOA solves the impedance mismatch by allowing applications and components to access the functionality of services based on what the services do, i.e., what actions they perform. In turn, application developers can more easily match their needs with the appropriate services, since the interfaces for the services describe more completely the problems they solve.

Overview of event-driven architecture

An event-driven architecture (EDA) defines a methodology for designing and implementing applications and systems in which events transmit between loosely coupled software components and services. An event-driven system is typically comprised of event consumers and event producers. Event consumers subscribe to an intermediary event manager, and event producers publish to this manager. When the event manager receives an event from a producer, the manager forwards the event to the consumer. If the consumer is unavailable, the manager can store the event and try to forward it later. This method of event transmission is referred to in message-based systems as store and forward.



Building applications and systems around an event-driven architecture allows these applications and systems to be constructed in a manner that facilitates more responsiveness, since event-driven systems are, by design, more normalized to unpredictable and asynchronous environments.

Benefits of event-driven design and development

Event-driven design and development provide the following benefits:



  • Allows easier development and maintenance of large-scale, distributed applications and services involving unpredictable and/or asynchronous occurrences


  • Allows new and existing applications and services to be assembled, reassembled, and reconfigured easily and inexpensively


  • Promotes component and service reuse, therefore enabling a more agile and bug-free development environment


  • Short-term benefits: Allows easier customization because the design is more responsive to dynamic processes


  • Long-term benefits: Allows system and organizational health to become more accurate and synchronized closer to real-time changes



EDA and SOA together

Unlike a request/reply system, where callers must explicitly request information, an event-driven architecture (EDA) provides a mechanism for systems to respond dynamically as events occur. In an EDA, events are published by event producers, and event consumers receive events as they happen.



Business systems benefit from the features of both an SOA and an EDA, since an EDA can trigger event consumers as events happen and loosely coupled services can be quickly accessed and queried from those same consumers.



For systems to be most responsive, they must be able to quickly determine the necessary actions when events are triggered. To this end, events should be published and consumed across all boundaries of the SOA, including the layers of the architectural stack and across physical tiers.



Figure 1 illustrates possible events that can be triggered across layers of an architectural stack:








Figure 1: Event flow across architecture stack. Click on thumbnail to view full-sized image.



In the context of Figure 1, an event can be defined as any published change in a system, platform, component, business, or application process. Events can be high-level and business-oriented, or low-level and technical in character. Because events can be transmitted and received, event-aware applications and services can respond to the underlying changes as needed.

Event taxonomies and causality

The secret to understanding a given event is to know its cause at the time the event occurred, knowledge often referred to as event causality. Event causality is typically divided into two basic categories:



  • Horizontal causality: Both the event's source and cause reside on the same conceptual layer in the architectural stack


  • Vertical causality: Both the event's source and cause reside on different conceptual layers in the architectural stack



Vertical causality implies an event taxonomy that remains somewhat constant across different layers of a system, as illustrated by the following list:



  • Lifecycle events: Signify changes in an entity's lifecycle, such as stopping or starting a process


  • Execution events: Signify runtime occurrences, such as service or component invocations


  • Management events: Signify when thresholds have exceeded defined limits or ranges



Horizontal causality implies an event taxonomy that also remains somewhat constant across different layers of a system, as illustrated by the following list:



  • System-layer events: Signify system-level activities, such as the creation of a file or the closing of a port


  • Platform-layer events: Signify platform-level activities, such as the modification of a datasource or the addition of a new service


  • Component-layer events: Signify component-level activities, such as the transformation of a view object or a state-machine transition


  • Business-layer events: Signify business-level activities, such as the creation of a user or the removal of an account


  • Application-layer events: Signify application-level activities, such as a premium increase or a quote submission



The benefits of event-driven communication within an SOA are currently being realized by a number of ESB frameworks and platforms. One of the most promising of these within the Java development realm is Mule.

Introducing Mule

Mule is an open source ESB-messaging framework and message broker, loosely based on the staged event-driven architecture (SEDA). SEDA defines a highly concurrent enterprise platform in terms of stages (self-contained application components) connected by queues. Mule uses concepts from SEDA to increase the performance of processing events.



Mule provides support for asynchronous, synchronous, and request-response event processing using disparate technologies and transports such as JMS, HTTP, email, and XML-based Remote Procedure Call. Mule can be easily embedded into any application framework and explicitly supports the Spring framework. Mule also supports dynamic, declarative, content-based, and rule-based message routing. Mule facilitates declarative and programmatic transaction support, including XA transaction support. Mule provides a representational state transfer (REST) API to provide Web-based access to events.



The Mule ESB model drives all services in a system over a decoupled, message-communication backbone. Services registered with the bus have no knowledge of other registered services; therefore, each service is concerned with processing only the events it receives. Mule also decouples container, transport, and transformation details from the services, allowing any kind of object to be registered as a service on the bus.



I use the Mule framework to demonstrate the concepts and ideas discussed in this article.



The Mule architecture

The Mule architecture consists primarily of the following elements:

The Universal Message Object (UMO) API

The UMO API defines the services and interactions of objects to be managed by Mule.

UMO components

UMO components can be any component in the Mule system that receives, processes, and sends data as event messages.

Mule server

The Mule server component is a server application launched to bootstrap the Mule environment.

Descriptors

The descriptor components describe a Mule UMO's attributes. New Mule UMOs can be initialized as needed from their associated descriptor. A descriptor consists of:



  • The UMO component name

  • The UMO component version

  • The UMO component implementation class

  • An exception strategy

  • Inbound and outbound providers

  • Inbound and outbound routers

  • Interceptors

  • Receive and send endpoints

  • Inbound and outbound transformers

  • Miscellaneous properties

Connectors

Connectors are components that provide the implementation for connecting to an external system or protocol and managing the session for that system or protocol. A connector is responsible for sending data to an external message receiver and for managing the registration and deregistration of message receivers.

Providers

Providers are components that manage the sending, receiving, and transformation of event data to and from external systems. They enable connections to external systems or other components in Mule. A provider acts as a bridge from the external system into Mule and vice versa. It is, in fact, a composite of a set of objects used to connect to and communicate with the underlying system. The elements of a provider are:



  • Connector: Responsible for connecting to the underlying system


  • Message receiver: Used to receive events from the system


  • Connector dispatchers: Pass data to the system


  • Transformers: Convert data received from the system and data being sent to the system


  • Endpoint: Used as the channel address through which a connection is made


  • Transaction configuration: Used to define the connection's transactional properties

Endpoint resolvers

Endpoint resolvers determine what method to invoke on a UMO component when the component receives an event.

Transformers

Transformer components transform message or event payloads to and from different data formats. Transformers can be chained together to perform successive transforms on an event before an object receives it.

Message adapters

Message adapters provide a common manner in which to read disparate data from external systems.

Message receivers

Message receivers are listener-endpoint threads that receive data from an external system.

Message dispatchers

Message dispatchers send (synchronous) or dispatch (asynchronous) events to the underlying technology.

Message routers

Message routers are components that can be configured for a UMO component to route a message to deferent providers based on the message or other configuration.

Agents

Agents are components that bind to external services such as Java Management Extension servers.

Mule model

A Mule model encapsulates and manages the runtime behavior of a Mule server instance. A model consists of:



  • Descriptors

  • UMO components

  • An endpoint resolver

  • A lifecycle-adapter factory

  • A component resolver

  • A pool factory

  • An exception strategy

Mule manager

The Mule manager maintains and provides the following services:



  • Agents

  • Providers

  • Connectors

  • Endpoints

  • Transformers

  • The interceptor stack

  • A Mule model

  • A Mule server

  • The transaction manager

  • Application properties

  • The Mule configuration



The diagram in Figure 2 illustrates a high-level view of the message flow for the Mule architecture.








Figure 2: Mule high-level architecture. Click on thumbnail to view full-sized image.


Mule events

Mule events contain event data and properties examined and manipulated by event-aware components. The properties are arbitrary and can be set at any time after an event is created.



The org.mule.umo.UMOEvent class represents an event occurring in the Mule environment. All data sent or received within the Mule environment is passed between components as an instance of UMOEvent. The data in a Mule event can be accessed in its original format or in a transformed format. A Mule event uses a transformer associated with the provider that received the event to transform the event's payload into a format the receiving component understands.



The payload for a Mule event is contained within an instance of the org.mule.umo.UMOMessage interface. A UMOMessage instance is composed of the payload itself and its associated properties. This interface also acts as a common abstraction of different message implementations provided by different underlying technologies.



The org.mule.extras.client.MuleClient class defines a simple API that allows Mule clients to send and receive events to and from a Mule server. In most Mule applications, events are triggered by some external occurrence, such as a message received on a topic or a file being deleted from a directory.



The following illustrates how to send an event synchronously to another Mule component:




String componentName = "MyReceiver"; // The name of the receiving component.

String transformers = null; // A comma-separated list of transformers

                            // to apply to the result message.

String payload = "A test event"; // The payload of the event.

java.util.Map messageProperties = null; // Any properties to be associated

                                        // with the payload.

MuleClient client = new MuleClient();

UMOMessage message = client.sendDirect(componentName,

                                       transformers,

                                       payload,

                                       messageProperties);

System.out.println("Event result: " + message.getPayloadAsString());



An instance of MuleClient requires a server URL to define the endpoint for the remote Mule server to which the MuleClient instance will connect. The URL defines the protocol, the message's endpoint destination, and, optionally, the provider to use when dispatching the event. Endpoint examples are:



  • vm://com.jeffhanson.receivers.Default: Dispatches to a com.jeffhanson.receivers.Default destination using the virtual machine provider. The VM provider enables intra-VM event communication between components using transient or persistent queues.


  • jms://jmsProvider/accounts.topic: Dispatches a JMS message via the globally registered jmsProvider to a topic destination called accounts.topic.


  • jms://accounts.topic: Dispatches a JMS message via the first (default) JMS provider.



Mule event processing

Mule can send and receive events in three different ways:



  1. Asynchronously: A given component can simultaneously process multiple events sent and received by different threads.


  2. Synchronously: A single event must complete processing before a component can resume execution. In other words, a component that produces an event sends the event and then blocks until the call returns, thereby allowing only one event at a time to be processed.


  3. Request-response: A component specifically requests an event and waits for a specified time to receive a response.



The org.mule.impl.MuleComponent implementation class provides a concrete component class that includes all the functionality needed to send and receive data and create events.



Objects that execute synchronously are encouraged to implement the org.mule.umo.lifecycle.Callable interface, which defines a single method, Object onCall(UMOEventContext eventContext). The Callable interface provides UMOs with an interface that supports event calls. Although not mandatory, the interface provides a lifecycle method that executes when the implementing component receives an event. The following illustrates a simple implementation of this interface:




import org.mule.umo.lifecycle.Callable;



public class EchoComponent

   implements Callable

{

    public Object onCall(UMOEventContext context) throws Exception

    {

        String msg = context.getMessageAsString();

        // Print message to System.out

        System.out.println("Received synchronous message: " + msg);

        // Echo transformed message back to sender

        return context.getTransformedMessage();

    }

}



The object returned from the onCall() method can be anything. When the UMOLifecycleAdapter for the component receives this object, it will first see if the object is a UMOMessage; if the object is neither a UMOMessage nor null, a new message will be created using the returned object as the payload. This new event will then publish via the configured outbound router, if one has been configured for the UMO and the setStopFurtherProcessing(true) method wasn't called on the UMOEventContext instance.

A simple event framework using Mule

Let's put the pieces of Mule together to construct a simple event framework. The framework consists of an event manager responsible for registering and deregistering services that can receive events, and for synchronously and asynchronously routing messages to these services.



The Mule "vm" protocol requires that a configuration file be located at a directory named META-INF/services/org/mule/providers/vm, relative to the event manager's working directory. This file defines numerous components for the protocol, such as the connector and dispatcher factory. The file's contents are as follows:




connector=org.mule.providers.vm.VMConnector

dispatcher.factory=org.mule.providers.vm.VMMessageDispatcherFactory

message.receiver=org.mule.providers.vm.VMMessageReceiver

message.adapter=org.mule.providers.vm.VMMessageAdapter

endpoint.builder=org.mule.impl.endpoint.ResourceNameEndpointBuilder



A simple interface defines the event manager's public view:




package com.jeffhanson.mule;



import org.mule.umo.FutureMessageResult;



public interface EventManager

{

   /**

    * Sends an event message synchronously to a given service.

    *

    * @param serviceName    The name of the service to which the event

    *                       message is to be sent.

    * @param payload        The content of the event message.

    * @return Object        The result, if any.

    * @throws EventException on error

    */

   public Object sendSynchronousEvent(String serviceName,

                                      Object payload)

      throws EventException;



   /**

    * Sends an event message asynchronously to a given service.

    *

    * @param serviceName    The name of the service to which the event

    *                       message is to be sent.

    * @param payload        The content of the event message.

    * @return FutureMessageResult The result, if any.

    * @throws EventException on error

    */

   public FutureMessageResult sendAsynchronousEvent(String serviceName,

                                                    Object payload)

      throws EventException;



   /**

    * Starts this event manager.

    */

   public void start();



   /**

    * Stops this event manager.

    */

   public void stop();



   /**

    * Retrieves the protocol this event manager uses.

    * @return

    */

   public String getProtocol();



   /**

    * Registers a service to receive event messages.

    *

    * @param serviceName      The name to associate with the service.

    * @param implementation   Either a container reference to the service

    *                         or a fully-qualified class name.

    */

   public void registerService(String serviceName,

                               String implementation)

      throws EventException;



   /**

    * Unregisters a service from receiving event messages.

    *

    * @param serviceName  The name associated with the service to unregister.

    */

   public void unregisterService(String serviceName)

      throws EventException;

}



The event-manager implementation class is encapsulated within a factory class, thereby allowing the implementation to change as needed without affecting the event manager's clients. The event-manager implementation is shown below:




package com.jeffhanson.mule;



import org.mule.umo.*;

import org.mule.extras.client.MuleClient;

import org.mule.impl.endpoint.MuleEndpoint;

import org.mule.config.QuickConfigurationBuilder;



import java.util.HashMap;

import java.util.Map;



public class EventManagerFactory

{

   private static HashMap instances = new HashMap();





   /**

    * Retrieves the event manager instance for a given protocol.

    *

    * @param protocol      The protocol to use.

    * @return EventManager The event manager instance.

    */

   public static EventManager getInstance(String protocol)

   {

      EventManager instance = (EventManager)instances.get(protocol);



      if (instance == null)

      {

         instance = new EventManagerImpl(protocol);

         instances.put(protocol, instance);

      }



      return instance;

   }



   /**

    * A concrete implementation for a simple event manager.

    */

   private static class EventManagerImpl

      implements EventManager

   {

      private UMOManager manager = null;

      private QuickConfigurationBuilder builder = null;

      private MuleClient eventClient = null;

      private String protocol = null;

      private MuleEndpoint receiveEndpoint = null;

      private MuleEndpoint sendEndpoint = null;



      private EventManagerImpl(String protocol)

      {

         this.protocol = protocol;

      }



      /**

       * Starts this event manager.

       */

      public void start()

      {

         try

         {

            builder = new QuickConfigurationBuilder();

            manager = builder.createStartedManager(true,

                                                   protocol + "tmp/events");

            eventClient = new MuleClient();

            receiveEndpoint = new MuleEndpoint(protocol

                                               + "tmp/events/receive");

            sendEndpoint = new MuleEndpoint(protocol + "tmp/events/send");

         }

         catch (UMOException e)

         {

            System.err.println(e);

         }

      }



      /**

       * Stops this event manager.

       */

      public void stop()

      {

         try

         {

            manager.stop();

         }

         catch (UMOException e)

         {

            System.err.println(e);

         }

      }



      /**

       * Retrieves the protocol this event manager uses.

       * @return

       */

      public String getProtocol()

      {

         return protocol;

      }



      /**

       * Registers a service to receive event messages.

       *

       * @param serviceName      The name to associate with the service.

       * @param implementation   Either a container reference to the service

       *                         or a fully-qualified class name

       *                         to use as the component implementation.

       */

      public void registerService(String serviceName,

                                  String implementation)

         throws EventException

      {

         if (!manager.getModel().isComponentRegistered(serviceName))

         {

            try

            {

               builder.registerComponent(implementation,

                                         serviceName,

                                         receiveEndpoint,

                                         sendEndpoint);

            }

            catch (UMOException e)

            {

               throw new EventException(e.toString());

            }

         }

      }



      /**

       * Unregisters a service from receiving event messages.

       *

       * @param serviceName  The name associated with the service to unregister.

       */

      public void unregisterService(String serviceName)

         throws EventException

      {

         try

         {

            builder.unregisterComponent(serviceName);

         }

         catch (UMOException e)

         {

            throw new EventException(e.toString());

         }

      }



      /**

       * Sends an event message synchronously to a given service.

       *

       * @param serviceName    The name of the service to which the event

       *                       message is to be sent.

       * @param payload        The content of the event message

       * @return Object        The result, if any.

       * @throws EventException on error

       */

      public Object sendSynchronousEvent(String serviceName,

                                         Object payload)

         throws EventException

      {

         try

         {

            if (!manager.getModel().isComponentRegistered(serviceName))

            {

               throw new EventException("Service: " + serviceName

                                        + " is not registered.");

            }



            String transformers = null;

            Map messageProperties = null;

            UMOMessage result = eventClient.sendDirect(serviceName,

                                                       transformers,

                                                       payload,

                                                       messageProperties);

            if (result == null)

            {

               return null;

            }

            return result.getPayload();

         }

         catch (UMOException e)

         {

            throw new EventException(e.toString());

         }

         catch (Exception e)

         {

            throw new EventException(e.toString());

         }

      }



      /**

       * Sends an event message asynchronously.

       *

       * @param serviceName    The name of the service to which the event

       *                       message is to be sent.

       * @param payload        The content of the event message.

       * @return FutureMessageResult The result, if any

       * @throws EventException on error

       */

      public FutureMessageResult sendAsynchronousEvent(String serviceName,

                                                       Object payload)

         throws EventException

      {

         FutureMessageResult result = null;



         try

         {

            if (!manager.getModel().isComponentRegistered(serviceName))

            {

               throw new EventException("Service: " + serviceName

                                        + " is not registered.");

            }



            String transformers = null;

            Map messageProperties = null;

            result = eventClient.sendDirectAsync(serviceName,

                                                 transformers,

                                                 payload,

                                                 messageProperties);

         }

         catch (UMOException e)

         {

            throw new EventException(e.toString());

         }



         return result;

      }

   }

}



The Mule framework dispatches messages by the payload's data type. The event framework can exploit this payload-based dispatching mechanism by defining generic event methods to act as event receivers in the services registered with the event manager. The following class defines one of these services with three overloaded event methods named receiveEvent():




package com.jeffhanson.mule;



import java.util.Date;



public class TestService

{

   public void receiveEvent(String eventMessage)

   {

      System.out.println("\n\nTestService.receiveEvent(String) received "

                         + "event message:  " + eventMessage + "\n\n");

   }



   public void receiveEvent(Integer eventMessage)

   {

      System.out.println("\n\nTestService.receiveEvent(Integer) received "

                         +"event message:  " + eventMessage + "\n\n");

   }



   public void receiveEvent(Date eventMessage)

   {

      System.out.println("\n\nTestService.receiveEvent(Date) received "

                         + "event message:  " + eventMessage + "\n\n");

   }

}



The event manager's client application sends three events to the test service to test each receiveEvent() method. The client application follows:




package com.jeffhanson.mule;



import org.apache.log4j.Logger;

import org.apache.log4j.Level;

import org.apache.log4j.BasicConfigurator;



import java.util.Date;



public class EventClient

{

   static Logger logger = Logger.getLogger(EventClient.class);



   public static void main(String[] args)

   {

      // Set up a simple configuration that logs on the console.

      BasicConfigurator.configure();

      logger.setLevel(Level.ALL);



      try

      {

         EventManager eventManager =

            EventManagerFactory.getInstance("vm://");

         eventManager.start();



         String serviceName = TestService.class.getName();

         String implementation = serviceName;



         eventManager.registerService(serviceName, implementation);



         Object result =

            eventManager.sendSynchronousEvent(serviceName, "A test message");



         if (result != null)

         {

            System.out.println("Event result: " + result.toString());

         }



         result =

            eventManager.sendSynchronousEvent(serviceName, new Integer(23456));



         if (result != null)

         {

            System.out.println("Event result: " + result.toString());

         }



         result =

            eventManager.sendSynchronousEvent(serviceName, new Date());



         if (result != null)

         {

            System.out.println("Event result: " + result.toString());

         }



         eventManager.stop();

      }

      catch (EventException e)

      {

         System.err.println(e.toString());

      }

   }

}



The Mule platform's simplifications and abstractions that the preceding framework provides enable you to send and receive synchronous and asynchronous events across layers of an architectural stack without knowing the details of the underlying event system. The use of the Factory pattern and SOA principles are exploited to facilitate a loosely-coupled and extensible design.

Summary

Designing an effective event-driven software system can grow complex when services and processes need to interact across multiple tiers and protocols. However, a service-oriented architecture built around a properly designed event-management layer using standard industry patterns can reduce or even eliminate these problems.



The Mule platform provides APIs, components, and abstractions that can be used to build a powerful, robust, event-driven system that is scalable and highly-maintainable.



About the author

Jeff Hanson has more than 18 years of experience in the software industry. He has worked as a senior engineer for the Windows OpenDoc project and as lead architect for the Route 66 framework at Novell. He is currently the chief architect for eReinsure.com, building Web services frameworks and platforms for J2EE-based reinsurance systems. Hanson has also authored numerous articles and books including Pro JMX: Java Management Extensions (Apress, November 2003; ISBN: 1590591011) and Web Services Business Strategies and Architectures (Wrox Press, August 2002; ISBN: 1904284132).





Posted by 아름프로
본인이 점점 나이를 먹어서인지도 모르겠지만 옛날에는 IT 세계가 참 단순했다.



대기업이 시장을 지배할 당시 IT 부서가 개발한 애플리케이션들은 대부분 단일한 데이터 소스를 공유했으며 애플리케이션 클라이언트 같은 경우도 동일한 기반 코드와 플랫폼을 공유했다. 데이터는 쉽게 접근되는 파일이나 메인프레임 테이블에 존재했기 때문에 배치 문제도 없었고 애플리케이션 간 데이터 공유도 쉬웠다.



한 시대를 풍미한 클라이언트/서버(C/S) 컴퓨팅에서도 역시 파워빌더나 비주얼 베이직으로 개발된 덩치 큰 윈도우 애플리케이션 클라이언트는 ‘엔터프라이즈 데이터 모델’로 불리는 단일한 관계형 데이터베이스를 공유했다. 이를 가능케 하는 서비스 데스크톱도 회사 내에 위치해 있었다.



이 아키텍처는 애플리케이션들이 트랜잭션을 통해 다른 애플리케이션의 데이터를 업데이트하는 방식으로 데이터 공유를 허용했다.



그러나 세계는 변화하고 있다. 모든 것이 연결된 세계에서 ▲기업내 혹은 기업간 데이터 공유에 대한 필요성 ▲범용 하드웨어에 애플리케이션을 확장해야하는 필요성 ▲윈도우 데스크톱 PC에서 다른 웹사이트나 PDA, 태블릿 PC에 걸친 다양한 클라이언트를 지원할 필요성 등으로 한때 간단했던 그림이 지금은 매우 복잡해진 상태다.



과연 애플리케이션들을 이 화려한 신세계로 어떻게 가지고 나올 수 있을까? 정답은 바로 서비스 지향 아키텍처(SOA)다.



가장 단순하게 분류해보면 별도의 애플리케이션들이 각각 수행하던 기능은 SOA에서 비즈니스 서비스 집합으로 나눠지게 된다. 이 서비스들은 ‘X를 알고 싶다’와 같은 서비스 요청 메시지를 수신하고 ‘Y는 여기 있다’라는 서비스 응답 메시지를 송신함으로써 고객, 그리고 내/외부의 서비스와 서로 통신을 주고 받는다. 이런 메시지들이 플랫폼, 장비에 독립적이려면 XMLSOAP으로 표현, 전달되야 한다는 것은 매우 당연한 사실이다.



그러나 아키텍트, 개발자들이 SOA 설계와 구현에 대해 실제적으로 생각하면서 문제가 발생한다. 여기에는 어떤 데이터 서비스를 공유하고 데이터 접근과 관리는 어떻게 할지, 데이터를 어떻게 표현할 지와 같은 것들이 있다.



이 기사에서는 SOA에 사용되는 데이터의 유형들을 살펴보고 서비스 내/외부에 존재하는 데이터의 표현 방법을 알아볼 것이다. 아래 기술되는 내용은 SOA를 고려하기 시작한 바로 그 시점에 당신의 생각을 명확히 하는데 도움이 될 것이다.



어떤 데이터를 표현해야 하나?

SOA를 구축할 때에는 4가지 데이터 유형을 우선 고려해야 한다. 이들은 서비스 외부에서 내부로 들어가는 순서에 따라 메시지 데이터, 조사 데이터, 프로세스 데이터, 비즈니스 데이터로 나눠진다. 이제 각 데이터들의 유형과 특징을 정의하고 데이터를 다룰 때 필요한 정보가 뭔지 살펴보자.



메시지 데이터

서비스 사이를 흘러 다니는 데이터를 메시지 데이터라고 한다. 이 데이터는 서비스 사용자가 원하는 업무나 동작인 ‘요청’과 그 결과로 고객이 받는 ‘응답’을 정의해준다.



서비스와 서비스 사이에는 이 데이터만이 송수신될 수 있다. 따라서 메시지 데이터는 서비스의 개방형 인터페이스를 표상하는 역할도 함께 담당한다. 이로 인해 SOA는 플랫폼 독립적인 성격을 갖게 된다.



정의에 따르면 메시지 데이터는 사용자가 요청을 구성하고 응답을 처리하는 방법을 발견할 수 있도록 하는 개방형 스키마(schema)를 요구한다. 따라서 ‘서비스에 의해 노출되는 동작’이라는 정의에 비춰볼 때 메시지 데이터는 비교적 정적인 성격을 갖는다.



그러나 변화가 생기면 분명히 버전을 명시해 관리해야 한다. 또한 메시지 데이터는 한번 작성되면 바꿀 수 없으며 변경 자체가 불가능하다.



서비스들은 생성시각, 버전 id, 대화 id, 대화 내부의 일련번호 뿐 아니라 각 메시지별로 유일 식별자를 생성해 메시지 데이터를 다룬다. 물론 보안 토큰도 여기에 포함된다.



이렇게 추가 정보를 이용하면 서비스는 생성시각을 참조해 제때 도착하지 않은 메시지를 버리는 등 메시지들을 적절한 순서로 한번만 처리할 수 있다. 또한 서비스는 여러번 도착한 메시지에 대해 이전에 만들어 캐시해놓은 응답을 보내 해결하기 위해 요청과 응답을 저장해놓는다. 이런 과정은 성능도 향상시킨다. 메시지 데이터는 조사 데이터를 이동시키는데 자주 사용된다.



조사 데이터

서비스에서 다뤄지는 두번째 데이터는 조사 데이터다. 이 유형의 데이터는 서비스 요청 동작의 일환으로 매개변수를 전달하거나 서비스 응답에서 온 데이터를 해석하는데 사용된다. 이 과정 이후 사용자는 조사 데이터를 요청하게 되며 이후 요청 메시지를 구성하기 위해 조사 데이터를 사용하게 된다.



예를 들어 기술 교육 제공 업체는 교육 장소와 업체들로 구성된 조사 데이터를 발행할 수 있다. 따라서 사용자들은 수업 스케줄을 요청할 때 유효한 값들을 전달할 수 있다.



예상하겠지만 조사 데이터도 비교적 정적이다. 그러나 변화가 있을 때는 버전 관리를 해야 한다. 즉 각 버전의 조사 데이터끼리는 변화가 없는 것이다. 메시지 데이터처럼 조사 데이터도 서비스 외부에서 사용되며 개방형 스키마를 요구한다.



서비스는 조사 데이터를 다룰 때 각 항목에 유일한 버전 id를 부여한다. 예를 들면 ‘퀼로지-위치코드-v012004’와 같은 식이다. 이 방식대로라면 사용자는 요청 작업을 수행할 때 참조 데이터 버전을 전달하기 때문에 서비스가 적절한 응답을 만들어낼 수 있다.



결국 조사 데이터는 일반적으로 정기적인 갱신 작업을 요구하게 된다. 따라서 서비스는 이메일, HTTP, 심지어 DVD까지도 사용하는 푸시(push) 방식이나 HTTP, FTP, 이메일을 이용한 풀(pull) 방식을 사용해 새로운 버전을 관심있는 가입자들에게 전달한다.



프로세스 데이터

서비스 내부에서 최초로 다뤄지는 데이터가 바로 프로세스 데이터다. 메시지나 조사 데이터와는 달리 프로세스 데이터는 각 서비스마다 고유하며 내부에 감춰지기 때문에 개방형 스키마가 필요없다.



프로세스 데이터는 서비스가 수행하는 비즈니스 절차나 기능 등을 표현한다. 대개 이 데이터들은 장기적인 동작 과정을 거쳐 완성된다. 이의 예로는 쇼핑 바구니, 구매 명령, 송장 등이 있다.



프로세스 데이터는 클라이언트나 대화에 의존적이며 단일 클라이언트에 의해 순차적으로 접근되기 때문에 병행성에 대한 요구가 낮다. 조사 데이터와 달리 동작 중에도 업데이트할 수 있으며 동작이 완료되면 일반적으로 읽기만 가능한 상태가 된다. 따라서 시간이 갈수록 참조 회수도 작아진다.



서비스 프로세스는 메시지를 요구하고 서로 대화하기 위해 서비스 사이에 프로세스 데이터를 구축하게 된다. 따라서 이들은 대화 인식자를 이용해 프로세스 데이터와 상관관계를 유지해야 한다.



서비스는 프로세스 데이터를 조작하는 다양한 기법을 사용할 수 있다. 예를 들면 프로세스가 활성화된 시간 동안 서비스는 프로세스 데이터를 객체에 캡슐화해 메모리에 캐시할 수 있다. 또한 서비스는 종료되거나 포기된 프로세스를 깨끗하게 제거할 수 있어야 한다.



비즈니스 데이터

SOA에서 사용되는 데이터의 마지막 유형은 비즈니스 데이터다. 이 유형은 고객 정보, 제품 재고, 은행 계좌들처럼 사람들이 애플리케이션을 생각할 때 떠올리는 바로 그것들이 대부분이다.



프로세스 데이터처럼 비즈니스 데이터도 각 서비스마다 고유하며 개방형 스키마를 필요로 하지 않는다. 그러나 프로세스 데이터와 달리 단일한 장기적 동작보다는 그 수명이 길며 여러 동작에 의해 동시에 변경될 수 있기 때문에 병행성에 대한 요구가 높다. 결과적으로 비즈니스 데이터는 휘발성이 강하며 본질적으로 유동적인 자료의 형태에 가깝다.



서비스가 비즈니스 데이터와 상호작용할 때 가장 중요한 부분은 단일 소유주의 원칙에 충실해야 하는 것일 것이다. 즉 서비스는 기업의 일부 데이터에 대해 소유 권한을 가져야 한다.



예를 들어 한 서비스는 고객 데이터를, 다른 서비스는 직원 데이터를 가질 수 있다. 데이터 공유가 필요한 경우 각 서비스는 변경사항을 다른 서비스에 공개하고 다른 서비스들은 내부에서 사용하기 위해 이것을 캐시한다.



따라서 서비스 데이터의 공개는 늘어나는 각 식별자들과 함께 버전이 관리돼야 한다. 서비스의 소유자만이 데이터를 업데이트 해야 하며 소유자가 아닌 사용자에 의한 변화 요청이 제기될 경우 소유권을 가진 서비스는 변경 작업을 진행한 이후 관심있는 가입자에게 해당 데이터를 재공개하는 절차를 밟아야 한다.



데이터 유형을 다루고 저장하는 방법은?

데이터 유형이 정의되면 이것을 처리하고 저장하기 위해 어떤 기술을 사용해야 할지 궁금할 것이다. 바로 XML, 객체, SQL이 기술의 핵심을 이룬다.



메시지 데이터

메시지 데이터는 개방형 스키마과 이질성을 요구하므로 SOAP을 이용한 모델이 가장 적합하다. 따라서 WSDL을 이용한 메시지 스키마를 발행할 수 있다. 또한 생성시각과 보안과 같이 구현하고자 하는 메시지 데이터 기능의 일부는 WS-*와 같은 SOAP 표준이나 MS의 웹서비스 인핸스먼트(WSE) 2.0과 같은 툴킷으로 구현할 수 있다.



서비스 내부에서는 동일성을 구현하기 위해 관계형 데이터 내부에서 인식 속성이 메시지 데이터에 XML 형태로 저장될 수 있다. 속성에 질의문이 주어질 가능성이 크기 때문에 이 방식이 권장될 수 있긴 하지만 불변성 측면에서 볼 때 메시지 내용을 자주 읽고 파싱(parsing)하는 것은 좋지 않다.



또한 메시지를 저장하면 감사, 그리고 향후 진행될 분석이 가능해진다. 그러나 유형 정의에 비춰볼 때 메시지 데이터는 가장 생명이 짧다. 또한 분석에 사용되지 않는다면 더 쉽게 저장될 수 있다.



메시지 데이터에 대한 또다른 측면은 서비스 간 메시지 송신이 이뤄질 때 어떤 일이 발생하는가에 관한 것이다. 독립적으로 전개되는 다중 서비스에 메시지 구조가 사용되는 조직 환경에서는 메시지가 서비스에 의해 소비되기 이전에 표준 스키마로 변환되도록 조치하는 것이 좋다. 이는 조사, 비즈니스 데이터를 각 서비스가 다른 형태로 표현할 때 일어날 수 있는 문제점들을 미연에 방지해주며 데이터 변환의 횟수를 획기적으로 줄일 수 있다.



조사 데이터

조사 데이터는 공개적이며 개방형 스키마를 요구하기 때문에 XML로 모델링돼야 한다. 즉 버전 정보를 표시하면서 조사 데이터의 스키마를 WSDL로 나타내는 방식이 좋다. 데이터베이스 측면에서 볼 때 조사 데이터는 한번만 기록되고 XML에 의해 직접 추출될 수 있기 때문에 성능 증가의 목적으로 관계형 테이블의 XML로 저장될 수 있다.



또한 관계형 테이블에 조사 데이터를 저장함으로써 버전 관리도 쉬워진다. 서비스는 내부적으로 메모리에 현 조사 데이터를 캐시할 수 있다. 이렇게 되면 사용자가 조사 데이터를 요청할 때 응답시간을 단축할 수 있다.



프로세스 데이터

프로세스 데이터는 서비스에 고유하기 때문에 XSD로 발행되거나 XML로 표시될 필요가 없다. 따라서 대개 표준화된 관계형 데이터베이스 테이블로 저장되며 예를 들면 비쥬얼 스튜디어 닷넷 ‘위드비(Whidbey)’와 함께 출하될 오브젝트스페이스(ObjectSpaces)와 같은 객체 보존 계층을 사용해 서비스 내부에 캡슐화된다.



이와 같은 방식으로 서비스는 메모리에서 프로세스 데이터를 완전한 객체로 처리하고 ASP.NET 캐싱 엔진과 같은 캐시 기술을 활용할 수 있다. 프로세스가 완료되거나 대기 상태에 들어가면 객체는 객체보존 계층을 이용해 데이터베이스에 차례로 나열된다.



프로세스 데이터는 단일 대화 내부에서 순차적으로 업데이트되기 때문에 병행성에 대해 낙관적일 수 있다. 분석을 위해 중요한 프로세스 데이터를 저장하는 것도 필요하다. 그러나 만들어진지 오래될수록 데이터들은 아카이브 형태로 보존될 것이다.



비즈니스 데이터

프로세스 데이터처럼 비즈니스 데이터는 서비스에 고유하며 XML로 표현되지 않는다. 물론 일부가 응답 메시지로 보내지는 경우는 예외다. 이런 경우 정형화된 XSD가 생성돼 다른 서비스들이 이 데이터를 해석할 수 있다.



따라서 비즈니스 데이터는 표준화된 관계형 테이블에 저장되며 COM+와 같은 트랜잭션 관리자에 의해 관리되는 구성요소를 통해 캡슐화된다. 이것은 트랜잭션 과정에서 병행성을 비관적으로 만들어 잠금을 보장하기 위한 것이다.



구성요소 자체는 데이터에 상태와 상관없는 접근을 제공하는데 이것은 높은 휘발성과 병행성 때문이다. 비즈니스 데이터는 프로세스 데이터와 결합돼 분석에 사용된다.



모델 산출

아래 그림에는 여기서 논의된 4가지 데이터 유형이 요약돼 있다. SOA를 개발할 때 독자들이 소속된 기업의 데이터를 위치시킬 수 있는 그림을 그리는데 도움이 됐으면 한다. 여기에는 SOA에서 사용되는 4가지 데이터를 강조하고 있으며 이들이 어떻게 표현되고 처리되는지 보여주고 있다. @

http://images.zdnet.co.kr/images/2004/06/69587-1.jpg

SOA 개념상 모델
Posted by 아름프로

BLOG main image

카테고리

분류 전체보기 (539)
이야기방 (19)
토론/정보/사설 (16)
IBM Rational (9)
U-IT (0)
SOA/WS/ebXML (110)
ebXML (64)
RossetaNet (0)
SOA (11)
ESB (5)
WebServices (30)
개발방법론/모델링 (122)
J2SE (34)
J2EE (60)
DataBase (39)
Open Projects (30)
BP/표준화 (50)
Apache Projects (15)
Web/보안/OS (22)
Tools (7)
AJAX/WEB2.0 (1)
Linux/Unix (1)
영어 (0)
비공개방 (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

글 보관함

Total :
Today : Yesterday :