[JAVA] JMX(MBean), JOLOKIA
JMX(Java Management Extensions)
JMX(Java Management eXtensions)는 응용 프로그램(소프트웨어)/객체/장치 (프린터 등) 및 서비스 지향 네트워크 등을 감시 관리를 위한 도구를 제공하는 자바 API이다.
JDK 1.5 이상부터 기본적으로 탑재된 기능 자바 어플리케이션의 모니터링과 관리 기능을 제공한다. Non-Java Resource와 하드웨어에 대해 wrapping한 인터페이스를 제공하며, API를 외부로 노출해 application 설정 및 통계데이터를 수집할 수 있는 기능을 제공한다.
mBean으로 알려진 하나 이상의 사용자 JavaBean 오브젝트를 통해(혹은 리소스를 호출하는) 애플리케이션, 디바이스, 서비스를 원격으로 제어할 수 있다.
mBean들은 mBean 서버에 등록되며, mBean 서버는 리소스에 접근하는 모든 원격 매니저를 관리한다.
- MBean(Managed Bean) 플랫폼 혹은 사용자에 의해 만들어진 모니터링용 객체.
- Standard MBean, Dynamic MBean, Model MBean, Open MBean 4가지 종류로 나뉨
- MBean Server : MBean을 등록. MBeans를 모니터링하기 원하는 원격 JMX 관리자는 MBean Server를 통하여 정보를 획득
- agent service : MBeans를 관리하는 (개발자가 제작한) 서비스 - client
MXBean은 Java Management Extensions (JMX)의 일부로, JMX 프로토콜을 사용합니다. JMX 프로토콜은 Java 애플리케이션에서 모니터링 및 관리를 위한 표준화된 방법을 제공합니다.
JMX 프로토콜은 RMI (Remote Method Invocation) 프로토콜을 기반으로 하며, 원격으로 JMX MBean을 연결하고 접근할 수 있도록 합니다. RMI는 자바 애플리케이션 간에 객체를 직접 주고받을 수 있도록 해주는 기술입니다.
따라서, MXBean은 RMI 프로토콜을 사용하여 JMX 서버와 클라이언트 사이의 통신을 처리하며, 자바 애플리케이션 간에 객체를 주고받을 수 있도록 합니다.
public interface MyMXBean {
public void setMessage(String msg);
public String getMessage();
}
public class MyMXBeanImpl implements MyMXBean {
private String message;
@Override
public void setMessage(String msg) {
message = msg;
}
@Override
public String getMessage() {
return message;
}
}
public class MyMXBeanServer {
public static void main(String[] args) throws Exception {
// MBeanServer 생성
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// JMX 커넥터 생성
String host = "127.0.0.1"; // 서버 IP 주소
int port = 9999; // 서버 포트 번호
// Rmi registry에 서버 IP, port를 설정한다.
Registry registry = LocateRegistry.createRegistry(port);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/server");
JMXConnectorServer connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
// 커넥터 시작
connector.start();
// MBean 등록
ObjectName mxbeanName = new ObjectName("jmx:type=MyMXBean");
MyMXBean mxbean = new MyMXBeanImpl();
mbs.registerMBean(mxbean, mxbeanName);
// 클라이언트 요청 대기
System.out.println("MXBean Server started, waiting for client requests...");
Thread.sleep(Long.MAX_VALUE);
}
}
public class MyMXBeanClient {
public static void main(String[] args) throws Exception {
// JMX 커넥터 생성
String host = "localhost"; // 서버 IP 주소
int port = 9999; // 서버 포트 번호
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
// MBean 조회
ObjectName mxbeanName = new ObjectName("jmx:type=MyMXBean");
MyMXBean mxbean = JMX.newMXBeanProxy(mbsc, mxbeanName, MyMXBean.class);
// MXBean 메서드 호출
mxbean.setMessage("Hello, MXBean!");
System.out.println(mxbean.getMessage());
// 커넥터 종료
jmxc.close();
}
}
Jolokia
Jolokia는 REST API를 통해 JMX를 사용할 수 있도록 하는 라이브러리입니다. 따라서 Jolokia를 사용하면 원격으로 JMX 데이터를 검색하고 조작할 수 있습니다.
Jolokia는 JMX MBean을 HTTP 요청으로 노출하므로, 서버에 웹 애플리케이션이 설치되어 있어야 합니다.
JMX (Java Management Extensions)는 자바 애플리케이션의 모니터링 및 관리를 위한 표준 API이지만, JMX를 사용하는 것은 불편한 경우가 있습니다. JMX는 RMI (Remote Method Invocation)를 사용하여 원격 애플리케이션을 모니터링할 수 있지만, 보안 문제 및 네트워크 설정 등 다양한 이슈가 있을 수 있습니다.
Jolokia는 JMX 데이터를 HTTP REST API를 통해 노출하므로, 원격으로 JMX 데이터를 검색하고 조작할 수 있습니다. 이를 통해 네트워크 설정 및 보안 문제를 해결할 수 있으며, 더 간단한 방식으로 애플리케이션을 모니터링하고 관리할 수 있습니다.
또한, Jolokia는 다양한 프로토콜을 지원하므로, JMX 데이터를 다른 언어로 구현된 클라이언트에서도 사용할 수 있습니다. 이를 통해 다양한 플랫폼에서 동작하는 애플리케이션을 모니터링하고 관리할 수 있습니다.
따라서, Jolokia는 JMX의 보완적인 역할을 하며, 보안 문제 및 네트워크 설정 등을 해결할 수 있는 간편한 방식으로 애플리케이션을 모니터링하고 관리할 수 있도록 합니다.
public class MyMXBeanClient {
public static void main(String[] args) throws Exception {
// Jolokia Client 생성
String host = "localhost"; // 서버 IP 주소
int port = 8080; // 서버 포트 번호
System.out.println(new URL("http", host, port, "").toString());
J4pClient j4pClient = new J4pClient(new URL("http", host, port, "").toString());
// MXBean 데이터 조회
J4pReadRequest request = new J4pReadRequest("com.app.woo.jmx:type=MyMXBean", "Message");
J4pReadResponse response = j4pClient.execute(request);
// JSON 데이터 파싱
Object value = response.getValue();
if (value instanceof JSONObject) {
JSONObject jsonObject = (JSONObject)value;
String message = (String)jsonObject.get("Message");
System.out.println("Message: " + message);
}
}
}
참조
https://ko.wikipedia.org/wiki/JMX