Design de contêiner da web
O desenvolvimento de um contêiner da Web envolve muitas tecnologias em diferentes níveis, como o conhecimento da camada de comunicação, o conhecimento do nível do idioma do programa etc., e um contêiner disponível é um sistema relativamente grande e leva muito tempo para explicá -lo claramente. Este artigo tem como objetivo introduzir como projetar um contêiner da web, discutir apenas as idéias de implementação e não envolve muitas implementações específicas. Quebre -o em vários módulos e componentes. Cada módulo de componente é responsável por diferentes funções. A figura a seguir lista alguns componentes básicos e apresenta cada componente.
Conecte -se ao receptor
A principal responsabilidade é ouvir se existe uma conexão de soquete do cliente e receber o soquete e, em seguida, entregar o soquete ao executor de tarefas (pool de threads) para execução. Leia continuamente os soquetes da parte inferior do sistema, faça o mínimo de processamento possível e depois jogue -os no pool de threads. Por que enfatizar a necessidade de lidar com o mínimo possível? Isso está relacionado aos problemas de desempenho do sistema, e o processamento excessivo afetará seriamente a taxa de transferência. Como geralmente existe apenas um receptor (um thread é responsável pela recepção do soquete), provavelmente terá um impacto no comprimento de cada processo de recepção. Portanto, o receptor faz muito pouco e simples trabalho, mantendo apenas algumas variáveis de estado, a operação de acumulação do portão de controle de fluxo, a operação de recepção do servidorsocket, definindo algumas propriedades do soquete recebido, colocando o soquete recebido no pool de encadeamentos e algum manuseio de exceção. Outra lógica que leva muito tempo para processar é entregue ao pool de threads, como ler os dados subjacentes do soquete, analisar os pacotes de protocolo HTTP e responder a algumas operações do cliente, etc.
Controlador de número de conexão
Para uma máquina, o tráfego total de solicitações de acesso tem um período de pico e o servidor tem um limite físico. Para garantir que o servidor da Web não seja lavado, precisamos tomar algumas medidas para protegê -lo e evitá -lo. O tráfego aqui precisa ser explicado um pouco mais sobre o número de conexões de soquete, que controla o tráfego controlando o número de conexões de soquete. Um método eficaz é adotar o controle de fluxo, que é como adicionar um portão à entrada do fluxo. O tamanho do portão determina o tamanho do fluxo. Quando o fluxo máximo for atingido, o portão será fechado e parou de receber até que haja um canal ocioso. Os contadores podem ser implementados usando a estrutura AQS do JDK.
Fábrica de soquete
Diferentes ocasiões de uso podem exigir diferentes níveis de segurança. Por exemplo, quando as transações relacionadas ao pagamento, as informações devem ser criptografadas antes do envio, o que também envolve o processo de negociação-chave, enquanto em outras ocasiões comuns, não há necessidade de criptografar o pacote. Refletir na camada de aplicação é um problema de usar HTTP e HTTPS.
Simplificando, o protocolo TLS/SSL fornece serviços de autenticação para cada comunicação ① para autenticar a legalidade da identidade da entidade desta sessão. ② Fornecer serviços de criptografia e o forte mecanismo de criptografia pode garantir que as mensagens durante a comunicação não sejam decifradas. ③ Forneça serviços à prova de adulteração, use o algoritmo de hash para assinar mensagens e verifique se o conteúdo da comunicação não é adulterado pela verificação de assinaturas.
O protocolo HTTP corresponde ao soquete, enquanto o HTTPS corresponde ao SSLSocket. Como gerar soquetes e sslsockets é entregue à fábrica do soquete.
Definidor de tarefas - tarefa
Defina as tarefas a serem executadas e informe ao pool de threads que tipo de tarefas a serem executadas. A tarefa é dividida principalmente em três pontos: processamento de soquetes e resposta aos clientes, diminuindo o contador de contagem de conexões e fechando o soquete. Entre eles, o processamento do soquete é o mais importante e mais complexo. Inclui a leitura do fluxo de bytes subjacentes, analisando a mensagem de solicitação de protocolo HTTP (análise da linha de solicitação, cabeçalho de solicitação, órgão de solicitação e outras informações), obtendo o caminho com base na análise da linha de solicitação para encontrar os recursos do projeto da Web no host correspondente e a montagem do cliente.
Executor de tarefas
Um pool de threads com um número máximo e mínimo de threads é chamado de "executor de tarefas" porque o pool de threads pode ser considerado como iniciando vários threads para detectar continuamente uma fila de tarefas e, uma vez que uma tarefa precisar ser executada, será executada. O número máximo e mínimo de fios limitam, o limite redundante de tempo de recuperação de roscas, a ação de rejeição feita pelo pool de threads quando o número máximo de roscas excede, etc.
Leitura de mensagens
Usado para ler pacotes do cliente para o sistema operacional subjacente e fornecer um mecanismo de buffer. Copie a mensagem para Desbuf.
Saída de mensagem
Usado para escrever pacotes processados por contêineres da web no sistema operacional e fornecer um mecanismo de buffer. Escreva a mensagem outputbuf no sistema operacional através do buffer.
Filtro de entrada
Nesse processo de leitura, é desejado algum processamento adicional e esse processamento adicional pode ser feito de maneira diferente de acordo com diferentes condições. Considerando a dissociação e extensão do programa, os filtros são introduzidos. Somente após as operações de filtragem, podemos alcançar o Desbuf através de camadas de filtros. Esse processo é como adicionar níveis de processamento. As operações correspondentes serão executadas após a passagem dos níveis e, finalmente, os dados de origem para os dados de destino serão concluídos.
Filtro de saída
É semelhante à função do filtro de entrada e é usado quando a saída da mensagem.
Analisador de mensagens
Fornece a capacidade de analisar várias partes do protocolo HTTP.
Gerador de solicitação
De acordo com a idéia orientada a objetos, os campos de atributos e protocolo relacionados à solicitação em cada processo de solicitação são abstraídos em um objeto de solicitação. Inclui três partes: linha de solicitação, cabeçalho de solicitação e órgão de solicitação. Quais são os valores necessários durante o processamento podem ser obtidos diretamente no objeto de solicitação. Fornece conveniência para a implementação dos padrões do servlet.
Gerador de resposta
Correspondente à solicitação, é necessário um gerador de objeto de resposta. Inclui três partes: linha de resposta, cabeçalho de resposta e corpo de resposta. Os valores relevantes no resultado do processamento podem ser definidos diretamente para o objeto de resposta. Fornece conveniência para a implementação dos padrões do servlet.
Endereço Mapper
Um mapeador de endereço é um roteador que solicita e recursos. Um acesso solicitado é mapeado de acordo com o caminho para encontrar o recurso da resposta ao cliente solicitante.
vida útil
Para modularizar ainda mais, todo o contêiner possui muitos componentes, o que pode exigir eventos diferentes em momentos diferentes e exigir um ciclo de vida para gerenciar todos os componentes de maneira unificada. Por exemplo, a startup, a parada e o desligamento de todos os componentes são separados do gerenciamento unificado dos ciclos de vida, que podem facilitar o gerenciamento do ciclo de vida desses componentes. Espero fazer algo antes e depois que algo aconteça em um determinado estado? Adicione um ouvinte de ciclo de vida para alcançar graciosamente.
JMX Manager
Monitoramento e gerenciamento do status da operação do sistema, desempenho do servidor, coleta de parâmetros relacionados ao servidor, carga JVM, número de conexão da Web, pool de threads, pool de conexão de banco de dados, gerenciamento de cache, recarga de arquivos de configuração etc. Ele pode fornecer algum gerenciamento visual remoto, com alto desempenho em tempo real. Ele também fornece uma solução para o gerenciamento de sistemas distribuídos.
Carregador da web
O Webloader é usado para carregar projetos de aplicativos da Web. Um contêiner da web pode conter vários aplicativos da Web. Para alcançar o isolamento entre Lib e Servlet, um carregador de classe diferente, o carregador de classe, deve ser usado para cada aplicativo da Web, e esses carregadores de classe não são relacionamentos entre pais e filhos, de modo a alcançar o efeito de isolamento de classe, ou seja, o LIB de um aplicativo da Web não será usado por outros aplicativos da Web.
Gerente de sessão
O gerente da sessão gerencia principalmente as sessões, incluindo: ① Gere SessionIds. Geralmente, cookies ou URLs não possuem valores de JSessionID, e o SessionID precisa ser regenerado como SessionID. ② Muitas sessões de clientes são salvas no servidor. Para sessões de tempo limite, você deve limpar regularmente para garantir que a memória do servidor não seja desperdiçada. ③ Para algumas sessões importantes, elas podem ser persistidas no disco e podem ser recarregadas na memória para uso quando necessário.
Executar log
Registre alguns avisos, exceções e erros em tempo de execução.
Log de acesso
O log de acesso geralmente registra as informações relacionadas ao acesso do cliente, incluindo o IP do cliente, o tempo de solicitação, o protocolo de solicitação, o método de solicitação, o número de byte de solicitação, o código de resposta, o ID da sessão, o tempo de processamento etc. O log de acesso pode contar o número de usuários visitantes, as regras de acesso à distribuição de tempo, hobbies pessoais etc., e esses dados podem ajudar as empresas a tomar decisões em suas estratégias operacionais.
Gerente de segurança
Um projeto da web é executado em uma plataforma de contêineres da web, que é como incorporar um aplicativo em uma plataforma para ser executada. Para fazer com que o programa incorporado seja executado normalmente, a plataforma deve ser capaz de executar com segurança e normalmente. E para garantir que a plataforma não seja afetada por aplicativos incorporados na maior extensão, os dois alcançam o efeito do isolamento em certa medida. Na startup, o arquivo de política é especificado por -djava.security.manager -djava.security.policy == web.policy, que define várias permissões.
Monitoramento da operação e gerenciamento remoto
Fornece uma plataforma que pode monitorar o status de execução dos contêineres da Web em tempo real e pode ser gerenciado remotamente.
Conjunto
Geralmente, existem dois tipos de clusters: ① Clusters de balanceamento de carga, que geralmente usam um determinado algoritmo de distribuição para distribuir uniformemente o tráfego de acesso a cada máquina no cluster para o processamento. ② Clusters de alta disponibilidade, comunicação de cluster conecta várias máquinas. Esse tipo de cluster se concentra mais em garantir a disponibilidade externa de todo o cluster por meio de comutação automática ou transferência de tráfego depois que uma máquina no cluster falhar.
Geralmente, as solicitações da Web são sem estado e podem ser diretamente agrupadas, mas a sessão envolve o estado e requer o uso da tecnologia de comunicação de cluster para copiar sessões. As tecnologias relacionadas incluem multicast e unicast.
Motor de servlet
O mecanismo do servlet usa a reflexão para gerar objetos no servlet e no JSP no aplicativo da web e colocá -los no pool de objetos do servlet e chama os métodos correspondentes de acordo com a situação real. O aplicativo da web coloca o processamento da lógica de negócios no método dopost ou de cachorro. Quando o contêiner da web processar a solicitação, ele a processará de acordo com a lógica de processamento definida aqui e o cliente de resposta será respondido.
Compilador JSP
De acordo com a especificação, o JSP é compilado na execução do servlet, portanto o arquivo JSP deve ser compilado de acordo com a especificação. O compilador JSP realmente traduz a sintaxe do JSP e o processa de acordo com a sintaxe do JSP.
Um contêiner da Web contém basicamente as funções dos componentes introduzidos acima. Você pode criar um contêiner da Web que permita que sua Web seja executada de acordo com a implementação de cada módulo de componentes.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!