Agora temos um serviço RPC pode ser usado como base para a implementação de um servidor de aplicação, mas apenas um serviço RPC não é suficiente. Para isso, vamos implementar esses módulos e serviços:
Segurança: autenticação, autorização e auditoria
Pool de conexões ao banco de dados
Serviço de mensagens assíncronas
E, além de ter uma API para adicionar serviços, o servidor irá fornecer uma API para adicionar módulos de usuário. Agora, o diagrama de componente de servidor:
Os componentes de camada superior usado funcionalidades dos componentes da camada inferior. Agora, vamos explorar cada um dos componentes.
Segurança reinos gerente
Isso é obrigatório em qualquer AppServer. No Gerenciador de Segurança Realms instala os reinos de segurança. O que é uma região de segurança? Conceitualmente é um componente que controla o acesso aos serviços. Do ponto de vista técnico, é a implementação da interface:
SecurityRealm de interface {public / ** * O método de login. * Os credenciais @ param As credenciais para validar * @ Throws LoginException Se um ocurrs exeption durante o login * / void login (credenciais credenciais) lança LoginException; / ** * O método logout. * Os credenciais @ param As credenciais * / vazio logout (credenciais credenciais); / ** * Este método retorna true se e somente se o método do serviço pode ser * Executado Com as credenciais fornecidas. * * Os credenciais @ param as credenciais do usuário que executa * @ Param serviceName o nome do serviço * @ MethodName Param o nome do método para executar * @ Param params os parametros para passar para o método * @ Throws NotExecutedException que sinaliza a execução não é permitido para as credenciais dadas, serviceName, methodName e params * / anular executionAllowed (credenciais credenciais, ServiceName String, String methodName, Object ... params) throws NotExecutedException; }
Existem apenas três métodos: login, logout e isExecutionAllowed. O dois primeiro referem-se ao conceito de autenticação e o terceiro refere-se ao conceito de liberação, mas também pode ser associado com auditoria e que é sempre executado antes de invocar o serviço.
O gerente de segurança usa os reinos interceptores que aparecem em Java RPC-07: o onPreExecution método () método é chamado executionAllowed () o domínio de segurança e continua a execução se isso não dá a exceção NotExecutedException. Por segurança, não são executadas se houver qualquer outra exceção (ou erro) na executionAllowed () e assim evita um bug quebrar o sistema de segurança.
Em seguida, colocando método de código arbitrário executionAllowed () pode autorizar ou proibir a execução de um método de um serviço com certos parâmetros.
O gerente de segurança reinos gerencia uma coleção de domínios de segurança. Eles correm todos e só autorizada levado para a chamada se tudo autorizado. O servidor tem implementado uma região de segurança com base no nome de usuário e senha e abstrato reino outra garantia para auditoria (log).
classe abstrata pública estende AbstractUserPasswordSecurityRealm SecurityRealmAdapter { público AbstractUserPasswordSecurityRealm () { } void login pública (Credenciais c) lança LoginException { UserPasswordCredentials cred = (UserPasswordCredentials) c; if (cred! = null) { String user = cred.getUser (); Cred.getPassword pass String = (); validar (usuário, pass); Else {} throw new LoginException ("credenciais nulas"); } } public void executionAllowed (credenciais credenciais, ServiceName String, String, methodName objeto ... params) throws {NotExecutedException if (credenciais == null) { jogar NotExecutedException novo ("não logado"); } } public void validar (String user, pass String) lança LoginException; }
Gerente do Módulo
Como vimos, o servidor é extensível. Mas como? Através de módulos. Um módulo é apenas um bean que tem um nome e dois métodos para gerenciar o ciclo de vida: startup () e shutdown (). Em seguida, o servidor tem um método para obter o formulário de pelo nome. À medida que a interface é tão simples, facilmente adaptado a incorporar qualquer serviço para o servidor. Por exemplo, serviço de mensagens assíncrona foi implementado separadamente e criou um módulo para atender este servidor de aplicativos. Mesmo com o pool de conexões com o banco de dados. A interface:
Módulo de interface {public vazio setName (String nome); Cordas getName (); inicialização void () throws Exception; desligamento void (); }
Para um módulo de um serviço, pedimos o ServerContext:
ServerContext.getModule (moduleName);
A classe nuclear ServerContext um conjunto de métodos estáticos que fornecem acesso a diferentes partes do servidor de aplicativos. O desatacan mais comumente são GetModule () e getServerConfig (). O primeiro que vimos. O segundo retorna um mapa com as propriedades que são carregados a partir de um arquivo de configuração. Vamos ver a configuração em uma seção dedicada a este.
Carregador de Serviços
Este é o componente responsável por ler um arquivo de configuração e criar serviços da RPC. Ele é implementado como um módulo de e pode ser facilmente substituído por outro e é acoplada para o servidor. Basicamente lê um arquivo de configuração que descrevem os serviços com seus parâmetros e adiciona-los para o servidor.
No próximo artigo vou descrever o pool de conexões para o banco de dados e serviço de mensagens. Além disso, vou descrever os arquivos de configuração.
Até a próxima.

