Um orientador customizado é uma pequena parte do código Java, fornecido como um arquivo de classe, chamado pelo código de base do Load Balancer para determinar a carga em um servidor. O código de base fornece todos os serviços administrativos necessários, incluindo iniciar e parar uma instância do orientador customizado, fornecer status e relatórios, registrar informações históricas em um arquivo de log e relatar resultados do orientador para o componente do gerenciador.
Quando o código de base do Load Balancer chama um orientador customizado, as seguintes etapas acontecem.
Os orientadores customizados podem ser projetados para interagir com o Load Balancer no modo normal ou no modo de substituição.
A opção do modo de operação é especificada no arquivo do orientador customizado como um parâmetro no método do construtor. (Cada orientador opera em apenas um desses modos, baseado em seu design).
No modo normal, o orientador customizado troca dados com o servidor e o código do orientador base determina o tempo da troca e calcula o valor de carregamento. O código base então relata esse valor de carregamento para o gerenciador. O orientador customizado retorna o valor zero para indicar sucesso ou um valor negativo para indicar um erro.
Para especificar o modo normal, configure o sinalizador de substituição no construtor como false.
No modo de substituição, o código base não executa nenhuma medida de tempo. O código do orientador customizado executa quaisquer operações que forem especificadas com base nos requisitos exclusivos e então retorna um número de carregamento real. O código base aceita o número de carregamento e o relata de maneira inalterada para o gerenciador. Para obter melhores resultados, normalize os números de carregamento entre 10 e 1000, com 10 representando um servidor rápido e 1000 representando um servidor lento.
Para especificar o modo de substituição, configure o sinalizador de substituição no construtor como true.
Os nomes do arquivo do orientador customizado devem seguir o formulário ADV_name.java, em que name é o nome escolhido para o orientador. O nome completo deve iniciar com o prefixo ADV_ in em letras maiúsculas, e todos os caracteres subsequentes devem ser letras minúsculas. O requisito para letras minúsculas garante que o comando para execução do orientador não faz distinção de maiúsculas e minúsculas.
De acordo com as convenções Java, o nome da classe definida dentro do arquivo deve corresponder ao nome do arquivo.
Você deve gravar orientadores customizados na linguagem Java e compilá-los com um compilador Java que esteja no mesmo nível do código do Balanceador de Carga. Para verificar a versão do Java em seu sistema, execute o seguinte comando do diretório install_path/java/bin:
java -fullversion
Se o diretório atual não fizer parte do seu caminho, você precisará especificar que o Java deve ser executado a partir do diretório atual para assegurar que você esteja obtendo as informações de versão corretas. Nesse caso, execute o seguinte comando no diretório install_path/java/bin:
./java -fullversion
Os seguintes arquivos são referidos durante a compilação:
A variável do seu ambiente de caminho de classe deve apontar para o arquivo do orientador e para o arquivo de classes de base durante a compilação. Um comando de compilação poderá ter o seguinte formato: para sistemas UNIX Windows, um comando de compilação de amostra é:
install_path/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java
onde:
A saída da compilação é um arquivo de classe, por exemplo, ADV_name.class. Antes de iniciar o orientador, copie o arquivo de classe no diretório install_path/servers/lib/CustomAdvisors/.
Para executar o orientador customizado, primeiro é necessário copiar o arquivo de classe do orientador em um subdiretório lib/CustomAdvisors/ na máquina do Load Balancer. Por exemplo, para um orientador customizado chamado myping, o caminho de arquivo é install_path/servers/lib/CustomAdvisors/ADV_myping.class
Configure o Load Balancer, inicie a função do gerenciador e emita o comando para iniciar o orientador customizado. O orientador customizado é especificado por seu nome, excluindo o prefixo ADV_ e a extensão de arquivo:
dscontrol advisor start myping port_number
O número da porta especificado no comando é a porta na qual o orientador abrirá uma conexão com o servidor de destino.
Como todos os orientadores, um orientador customizado estende a funcionalidade da classe base do orientador, que é chamada de ADV_Base. A base do orientador executa a maioria das funções do orientador, como relatar carregamentos de volta ao gerenciador para uso no algoritmo de peso do gerenciador. O orientador base também executa operações de conexão e de fechamento de soquete e fornece métodos de envio e de recebimento para uso pelo orientador. O orientador é usado somente para enviar e receber dados na porta especificada para o servidor que está sendo investigado. Os métodos TCP fornecidos no orientador base são cronometrados para calcular o carregamento. Um sinalizador no construtor do orientador base sobrescreve o carregamento existente com o novo carregamento retornado a partir do orientador, se desejado.
Os orientadores possuem os seguintes métodos da classe base:
Os detalhes sobre essas rotinas necessárias são exibidos posteriormente nesta seção.
Os orientadores customizados são chamados depois que orientadores nativos ou padrão forem procurados. Se o Load Balancer não localizar um orientador especificado na lista de orientadores padrão, ele consultará a lista de orientadores customizados. Informações adicionais sobre o uso de orientadores estão disponíveis no WebSphere Application Server Load Balancer Administration Guide.
Lembre-se dos seguintes requisitos para nomes e caminhos do orientador customizado.
public <advisor_name> ( String sName; String sVersion; int iDefaultPort; int iInterval; String sDefaultLogFileName; boolean replace )
void ADV_AdvisorInitialize()
Este método é fornecido para executar qualquer inicialização que poderá ser necessária para o orientador customizado. Esse método é chamado depois que o módulo do orientador base ser iniciado.
Em muitos casos, incluindo os orientadores padrão, esse método não é usado e seu código consistem apenas em uma instrução de retorno. Esse método pode ser usado para chamar o método suppressBaseOpeningSocket, que é válido apenas de dentro desse método.
int getLoad( int iConnectTime; ADV_Thread *caller )
Os métodos ou funções, descritos nas seções a seguir, podem ser chamados a partir de orientadores customizados. Esses métodos são suportados pelo código do orientador base.
Algumas dessas chamadas de função podem ser feitas diretamente, por exemplo, function_name(), mas outras requerem o prefixo responsável pela chamada. O Responsável pela Chamada representa a instância do orientador de base que suporta o orientador customizado que está sendo executado.
A função ADVLOG permite que um orientador customizado grave uma mensagem de texto no arquivo de log do orientador base. O formato é o seguinte:
void ADVLOG (int logLevel, String message)
A função getAdvisorName retorna uma cadeia Java com a parte do sufixo do nome do orientador customizado. Por exemplo, para um orientador chamado ADV_cdload.java, essa função retorna o valor cdload.
Essa função não usa parâmetros.
Observe que não é possível que esse valor seja alterado durante uma instanciação de um orientador.
A função getAdviseOnPort retorna o número da porta na qual o orientador customizado de chamada está em execução. O valor de retorno é um número inteiroJava (int), e a função não utiliza nenhum parâmetro.
Observe que não é possível que esse valor seja alterado durante uma instanciação de um orientador.
A função getCurrentServerId retorna uma cadeia Java que é uma representação exclusiva para o servidor atual.
Normalmente, esse valor é alterado sempre que você chama seu orientador customizado, porque o código base do orientador consulta todas as máquinas servidores em série.
Essa função não usa parâmetros.
A chamada de função getCurrentClusterId retorna uma cadeia Java que é uma representação exclusiva para o cluster atual.
Normalmente, esse valor é alterado sempre que você chama seu orientador customizado, porque o código base do orientador consulta todos os clusters em série.
Essa função não usa parâmetros.
A chamada de função getSocket retorna um soquete Java que representa o soquete aberto para o servidor atual para comunicação.
Essa função não usa parâmetros.
A função getInterval retorna o intervalo do orientador, ou seja, o número de segundos entre os ciclos do orientador. Esse valor é igual ao valor-padrão configurado no construtor do orientador customizado, a não ser que o valor tenha sido modificado no tempo de execução usando o comando dscontrol.
O valor de retorno é um número inteiro Java (int). A função não usa parâmetros.
A função getLatestLoad permite que um orientador customizado obtenha o valor de carregamento mais recente para um determinado objeto do servidor. Os valores de carregamento são mantidos em tabelas internas pelo código base do orientador e pelo daemon do gerenciador.
int caller.getLatestLoad (String clusterId, int port, String serverId)
Os três argumentos juntos definem um objeto do servidor.
O valor de retorno é um número inteiro.
Essa chamada de função é útil se você desejar tornar o comportamento de protocolo ou de porta dependente do comportamento de outro. Por exemplo, você pode usar essa chamada de função em um orientador customizado que desativou um determinado servidor de aplicativos se o servidor Telnet nessa mesma máquina foi desativado.
A função de recebimento obtém informações da conexão do soquete.
caller.receive(StringBuffer *response)
O parâmetro response é um buffer de cadeia no qual os dados recuperados são colocados. Adicionalmente, a função retorna um valor de número inteiro com a seguinte significância:
A função de envio usa a conexão de soquete estabelecida para enviar um pacote de dados para o servidor usando a porta especificada.
caller.send(String command)
O parâmetro command é uma cadeia que contém os dados a serem enviados ao servidor. A função retorna um valor de número inteiro com a seguinte significância:
A chamada de função suppressBaseOpeningSocket permite que um orientador customizado especifique se o código do orientador de base abre um soquete TCP para o servidor em nome do orientador customizado. Se o orientador não usar comunicação direta com o servidor para determinar seu status, ele poderá não ser necessário para abrir esse soquete.
Essa chamada de função pode ser emitida apenas uma vez, e deve ser emitida da rotina ADV_AdvisorInitialize.
A função não usa parâmetros.