What is Apache MINA & MINA in Action

in #dev8 years ago

안녕하세요 @flyyou 입니다.

미나라고 아시는지요? 자바로 네트웍 프로그램을 쉽게 할 수 있도록 구성된 네트웍 개발 프레임워크라고 볼 수 있습니다.
지금은 Netty라는 이름으로 변경되어서 오플 프로젝트로 진행되고 있습니다.

자세한 사항은 MINA 나 Netty로 검색해보면 정말 수많은 자료가 나옵니다.
Netty는 아래 그룹스에서 활발하게 토론이 이루어지고 있습니다.
https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!forum/netty-ko

이전에 대충 메모해둔 내용과 그려놓은 아키텍처 디자인이 있어서 기록에 남기기 위해서 이곳에 다시 정리해 봅니다.

(참고 : https://mina.apache.org/)

What is Apache MINA

  • A Java open-source network application framework
    • high performance
    • high scalability
  • Abstract API
    • Event-driven
    • Asynchronous
    • Unit-testable
  • Implementations
    • Sockets & datagrams ? Java NIO & APR via Tomcat Native
    • Serial ports ? RXTX.org
    • In-VM pipes

MINA Features

  • Unified API for various transport types:
    • TCP/IP & UDP/IP via Java NIO
    • Serial communication (RS232) via RXTX
    • In-VM pipe communication
    • You can implement your own!
  • Filter interface as an extension point; similar to Servlet filters
  • Low-level and high-level API:
    • Low-level: uses ByteBuffers
    • High-level: uses user-defined message objects and codecs
  • Highly customizable thread model:
    • Single thread
    • One thread pool
    • More than one thread pools
  • Out-of-the-box SSL · TLS · StartTLS support using Java 5 SSLEngine
  • Overload shielding & traffic throttling
  • Unit testability using mock objects
  • JMX managability
  • Stream-based I/O support via StreamIoHandler
  • Integration with well known containers such as PicoContainer and Spring

MINA Key Concepts

MINA in Action

아래 디자인은 실제로 제가 진행했던 과제에서 도입했던 디자인입니다.

  • MINA의 Event-Driven 방식으로 I/O 수행 쓰레드와 비즈니스 로직처리 쓰레드를 분리
  • Handler를 이용하는 방식으로 Pool지원

Architecture Design

  • Start Daemon 시에 ServiceDaemonLoader의 main()메쏘드 실행
  • Main() 메쏘드에서 init() / start() 실행
    • Init() : Spring DI를 이용하여 HttpProxyService의 서버 종류를 선택
    • Start() : 선택된 HttpProxyServie 실행.

  • HttpProxyServie를 구현한 구현체(HttpProxyServiceMINA / HttpProxyServicePOJO)에서 start()메쏘드 실행시 해당 Bean Id에 list 형태로 매핑된 Processor Bean이 실행.
    • AbstractServiceProcessor을 구현한 해당 서비스 프로세스(ProxtServerProcessor / CommunicationProcessor / CommonProcessor)의 serviceStart() 메쏘드 실행

context-beans.xml

<bean id="proxyServerProcessor" class="com.~~~~~~~~~.service.mina.ProxyServerProcessor">
<property name="startYn" value="Y" />
<property name="ipAddress" value="127.0.0.1" />
<property name="port" value="1001" />
<property name="sslYn" value="N" />
<property name="processorName" value="proxyServerProcessor" />
</bean>
<bean id="httpProxyServiceMINA" class="com.~~~~~~~~~.service.HttpProxyServiceMINA" >
<property name="processorList">
<list>
   <ref bean="proxyServerProcessor" />
   <ref bean="communicationProcessor" />
   <ref bean="CommonProcessor" />
    </list>
 </property>
</bean>
  • Http Client에서 요청시 MINA 실행 데몬은 Accept를 받아서 Agent에서 등록된(Session ID) Socket Object를 찾는다.
    • ServiceLocator는 동기화된 MAP으로 Command Socket Map과 Communication Socket Map의 Repository 역할.
    • Cashing으로 관리되며 Pooling.

Class Diagram

요즘은 Netty가 책도 잘 나와있고 인터넷에 자료도 많아서 훨씬 도입하기가 쉽습니다.

좀 지난 자료지만 올려봅니다.
많은 의견 부탁드립니다.

Sort:  

어여쁜 네티의

이희승님의 자바소녀 네티군요 :)

네 맞습니다. 네티라는 이름보다 예전에 미나라는 이름으로 아파치 프로젝트로 관리되었을때 정말 대단했습니다. ㅋ 네티 책사면 자바소녀 브로마이드가 들어가 있어요 ㅋㅋ

이희승님 트위터에 스카웃됬다가 현재 라인플러스에 계시죠ㅎㅎ 구글그룹스에서 질문하면 잘 답변해주십니다ㅎㅎ트위터가 네티 기반이라더군요ㅎㅎ