Во время разработки своего проекта столкнулся с проблемой - как эффективно управлять сервером с помощью веб-интерфейса. А также как связать сервер, расположенный на нескольких отдельных машинах с сайтом не имея возможности прямого доступа к базе данных сервера.
Конфиг:
* Машина с сервером авторизации и доп.сервисами. Имеет только 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) можно осуществлять любые операции на сервере.
Система имеет встроенную систему аутентификации пользователей - неавторизованные пользователи не смогут ничего сделать.
Пример простого сервиса для сервера с функцией получения онлайна на сервере.
Хендлер добавляется к списку активных (загружаются по мере надобности ака lazy-init).
Код клиента.
Конфиг:
* Машина с сервером авторизации и доп.сервисами. Имеет только 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;
}
}
Код клиента.
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. Останется только реализовать специфический функционал и написать панель управления.
Здесь копирайт (с).
Хочу услышать стороннее мнение о разработке.