Показать сообщение отдельно
Непрочитано 12.06.2011, 14:03   #1
Пользователь

Автор темы (Топик Стартер) Управление сервером через XML-RPC

Во время разработки своего проекта столкнулся с проблемой - как эффективно управлять сервером с помощью веб-интерфейса. А также как связать сервер, расположенный на нескольких отдельных машинах с сайтом не имея возможности прямого доступа к базе данных сервера.

Конфиг:
* Машина с сервером авторизации и доп.сервисами. Имеет только 1 доступный извне порт (для авторизации)
* Машина с игровым сервером. Имеет только 1 доступный извне порт для игрового сервера.
* Машина с сервером базы данных. Не имеет доступных извне портов.
* Машина с веб-сервером. apache2, PHP 5.3.*. Доступны порты 80, 8080.

Все машины кроме сайта соединены между собой в одну локальную сеть.

Первым что пришло в голову это интергрировать полноценный контейнер сервлетов (jetty, tomcat-embedded) в сервер, установить на него сайт с панелью управления и запускать с сервером. Но идея была сразу отброшена - тратить ресурсы игрового сервера на поддержание сайта панели управления не желательно.

Вторым было использование панели управления на java/jsp с подключением к серверу через RMI либо прямое соединение. Отброшена из-за чрезмерных размеров конечного продукта плюс затраты на хостинг для сайта на JSP.

Третьим было это создание простейшего веб-сервера, на котором будет работать веб-сервис. Сайт будет расположен в другом месте. После долгих экспериментов с Java-WS (soap, xmlrpc) мой выбор остановился на XML RPC. ( http://ws.apache.org/xmlrpc/ )

Разработанная система позволяет выполнять различные операции с сервером в реальном времени без прямого доступа к базе данных.
Основа система - легковесный xmlrpc-server который запускается вместе с сервером на указанном порту.
И через XMLRPC клиент на PHP (из PEAR) можно осуществлять любые операции на сервере.
Система имеет встроенную систему аутентификации пользователей - неавторизованные пользователи не смогут ничего сделать.

Пример простого сервиса для сервера с функцией получения онлайна на сервере.

Код:
@WebService
public interface TestService
{
	@WebMethod
	public int getOnlineCount(boolean includeGm, boolean includeBots);
}
Код:
public class TestServiceImpl implements TestService, GameServerAware
{
	private GameServer gameServer;

	@Override
	public int getOnlineCount(boolean includeGm, boolean includeBots)
	{
		return gameServer.getWorld().countObjects(
			Filter.create()
				.addRule("TYPE", L2Player.class)                        
				.addRule("includeGm", includeGm)
				.addRule("includeBots", includeBots)
		);
	}

	@Override
	public void setGameServer(GameServer gameServer) {
		this.gameServer = gameServer;
	}
}
Хендлер добавляется к списку активных (загружаются по мере надобности ака lazy-init).

Код клиента.

PHP код:
<?php
/**
 * Created by IntelliJ IDEA.
 * User: Aquanox
 * Date: 25.05.11
 * Time: 14:16
 */
require_once 'XML/RPC.php';

$client = new XML_RPC_Client("/xmlrpc""server4.l2server.lan"7115);
$client->setDebug(1);
$client->setCredentials('superadmin''^@HQGE5g54g5W#@R');


// org.aquanox.l2j.ws.services.TestService.getOnlineCount - внутреннее имя с которым можно связать операцию
// для удобства используется имя_класса.имя_метода
$msg = new XML_RPC_Message('org.aquanox.l2j.ws.services.TestService.getOnlineCount', array(
        new 
XML_RPC_Value(true'boolean'),
        new 
XML_RPC_Value(true'boolean')
));

/** @var $responce XML_RPC_Response */
$responce $client->send($msg);

echo 
"Responce is " $responce->value();

?>
В ответ нам приходит наш ткущий онлайн:
Код:
Responce is 1
Таким образом мы можем выполнять любые операции на сервере без прямого доступа к нему в реальном времени с достаточной защищенностью. В разработке поддержка для SSL и дополнительное шифрование передаваемых по сети данных.

В данный момент разрабатывается полноценная среда управления игровым сервером посредством веб-интерфейса.


//add
Ядро серверной стороны системы можно интегрировать практически с любым существующим проектом эмулятора как l2 так и aion. Останется только реализовать специфический функционал и написать панель управления.

Здесь копирайт (с).


Хочу услышать стороннее мнение о разработке.
__________________
for(;Forum.getPostCount() < Integer.MAX_VALUE; Forum.writeNewPost()); | TERA Video | GamezTERA Emu

Последний раз редактировалось Aquanox; 12.06.2011 в 14:31.
Aquanox вне форума Ответить с цитированием
Сказали спасибо: