Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Управление сервером через XML-RPC
#1
Во время разработки своего проекта столкнулся с проблемой - как эффективно управлять сервером с помощью веб-интерфейса. А также как связать сервер, расположенный на нескольких отдельных машинах с сайтом не имея возможности прямого доступа к базе данных сервера.

Конфиг:
* Машина с сервером авторизации и доп.сервисами. Имеет только 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
Ответ
#2
А почему бы не сделать "новые" подпакеты на стадии коннекта к ГС (к примеру) и уже ими рулить? Не надо будет создавать дополнительные сервисы, которые несут нагрузку, правда разработка на PHP усложнится, но все же...

P.S: сам думал над проблемой web-администрования сервера, но остановился на варианте сановского http-сервера, ибо разработка на PHP для меня слишком затратна.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#3
ASevenfold Написал:А почему бы не сделать "новые" подпакеты на стадии коннекта к ГС (к примеру) и уже ими рулить? Не надо будет создавать дополнительные сервисы, которые несут нагрузку, правда разработка на PHP усложнится, но все же...

P.S: сам думал над проблемой web-администрования сервера, но остановился на варианте сановского http-сервера.

моя система работы с сетью работает несколько по другому принципу чем у l2jserver/l2jfree.
Изначально я планировал что панель управления будет на jsp но потом перешел к РНР - это существенно упростит разработку и возможность расширения возможностей панели управления.
И если использовать РНР то нужно писать большооой хак на работу с сетью (подключение к серверу, выполнение запросов). С этой стороны уже реализованный в PEAR пакет работы с веб-сервисом выглядит ярче.

Добавлено через 5 минут
Забыл добавить - сервера гоняются в spring framework контейнере.


Я писал панель управления для aion-emu на jsp/servlet гоняющемся в jetty6. Уже была бета-версия но проект сервера "свернули".
for(;Forum.getPostCount() < Integer.MAX_VALUE; Forum.writeNewPost()); | TERA Video | GamezTERA Emu
Ответ
#4
Поддерживаю идею ТС-а всеми имеющимися конечностями.
Сам за стандартизацию "межпроцессных отношений" и XML-RPC на мой взгляд правильный выбор.
А используя ws-xml-rpc от апача, можно сделать достаточно гибкую систему управления, т.к. хендлером может выступать любой класс.
Если ТС-у интересно, есть чуток "облагороженный" ws-xml-rpc (полностью переведен на Log4j, добавлена "прозрачная" защита канала и т.д.).
Связаться со мной можно через ICQ (в профиле) после 13-ого числа.
Ответ
#5
Azagthtot Написал:Поддерживаю идею ТС-а всеми имеющимися конечностями.
Сам за стандартизацию "межпроцессных отношений" и XML-RPC на мой взгляд правильный выбор.
А используя ws-xml-rpc от апача, можно сделать достаточно гибкую систему управления, т.к. хендлером может выступать любой класс.
Если ТС-у интересно, есть чуток "облагороженный" ws-xml-rpc (полностью переведен на Log4j, добавлена "прозрачная" защита канала и т.д.).
Связаться со мной можно через ICQ (в профиле) после 13-ого числа.

Заинтересовало. Напишу вам в течении недели, когда появится хоть немного свободного времени.

Что на счет администрирования сервера то ещё есть такая полезная вещь как JMX. С помощью несколько модифицированного JConsole с его помощью тоже можно успешно работать с сервером.

[Изображение: 01.png]

[Изображение: 02.png]
for(;Forum.getPostCount() < Integer.MAX_VALUE; Forum.writeNewPost()); | TERA Video | GamezTERA Emu
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)