使用JMX监控游戏服务器

游戏服务器运行过程中,我们希望能够对游戏里各种资源进行监控。比如,查看在线玩家总人数,查看内存使用情况,统计请求消息数量等等。这种问题归结起来就是,我们希望查看游戏进程的内存数据。

前边有一篇文章 (查看生产环境的内存数据),介绍如果通过加载类文件或使用javascript脚本查看内存数据。但这篇文章并没有介绍如何让游戏进程执行我们外部的代码,这属于跨进程通信的范畴,总体来说也是比较复杂的。

现在,我打算介绍另外一种黑科技,让监控游戏服务器更加方便快捷。

我们使用的工具叫做JMX(Java Management Extentesions),简单来说,就是对运行中的服务器进行各种资源监控的工具。

有了JMX,我们可以轻易查看游戏进程里的各种资源,甚至触发各种管理接口。

关于JMX的具体框架结构,我了解得也不深入,就不过多介绍了=。=

我们直奔主题,来点干货吧。

1.使用JMX工具,我们首先需要定义一个接口,该接口必须以MBean词尾

定义MBean接口(ControllerMBean.java)

package com.kingston.jmx;

public interface ControllerMBean {

	/**
	 * 统计在线玩家总数
	 * @return
	 */
	int getOnlinePlayerSum();
	
	/**
	 * 统计内存使用情况
	 * @return
	 */
	String getMemoryInfo();
	
	/**
	 * 执行指定脚本 
	 * @param scriptId
	 */
	void exceScript(int scriptId);
	
	/**
	 * 关服
	 */
	void closeServer();
	
}


2.MBean接口实现类(Controller.java),命名必须是对应接口的前缀(除去MBean的部分)。

类似javabean规范,mbean类也有自己的规范,例如以get开头的方法,会被转换为对应的属性。

package com.kingston.jmx;

import com.kingston.jmx.ControllerMBean;
import com.kingston.jmx.GameStarter;

public class Controller implements ControllerMBean{

	@Override
	public int getOnlinePlayerSum() {
		return 100;
	}


	@Override
	public String getMemoryInfo() {
		StringBuilder sb = new StringBuilder();
		sb.append("free:")
		  .append(Runtime.getRuntime().freeMemory())
		  .append(",\n")
		  .append("total:")
		  .append(Runtime.getRuntime().totalMemory());
		
		return sb.toString();
	}

	@Override
	public void exceScript(int scriptId) {
		System.err.println("成功执行脚步"+scriptId);
	}
	
	@Override
	public void closeServer() {
		GameStarter.run = false;
	}

}


3.MBean的宿主,也就是游戏进程(GameStarter.java)

package com.kingston.jmx;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class GameStarter {
	
	/** 允许状态 */
	public volatile static boolean run = true;
	
	public static void main(String[] args) throws Exception {
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		 //创建MBean  
        ControllerMBean controller = new Controller();  
        
        //将MBean注册到MBeanServer中  
        mbs.registerMBean(controller, new ObjectName("GameMBean:name=controller"));  

        //模拟不停运行
        while(run) {
        	Thread.sleep(500);
        }
        System.err.println("服务关闭成功!!");
	}

}
其中ObjectName的作用是用于唯一标识具体MBean对象,稍后在gui工具就可以看到。


4. 游戏进程运行后,使用jdk自带的工具jconsole.exe(相对路径为Java/jdk1.8.0_45/bin),选择该进程

使用JMX监控游戏服务器_第1张图片

5. 将jconsole切换到mbean页签,如图

使用JMX监控游戏服务器_第2张图片


6.再点击我们创建的controler mbean下的属性按钮,可以立即看到我们所测试的两个监控指标的值,是不是非常神奇!!

使用JMX监控游戏服务器_第3张图片


7.点击操作按钮,即可看到我们为游戏进程所埋下的操作方法。选择指定方法所在的按钮,就可以触发游戏进程的方法调用了!!

使用JMX监控游戏服务器_第4张图片


8. 例如我们在 exceScript方框内输入123参数后,点执行,可以在程序终端看到打印

使用JMX监控游戏服务器_第5张图片


9. 除了使用jconsole这个工具,visiualvm也提供了同样功能的插件供下载。jmx还支持使用浏览器作为终端界面。这里就不具体介绍了。

你可能感兴趣的:(手游服务端,运维技能)