Os sistemas distribuídos nos cercam em todos os lugares hoje. O exemplo mais proeminente é a Internet que hospeda a World Wide Web. O ambiente de computação nos sistemas de computação corporativo também é frequentemente distribuído, interconectando diferentes serviços de recursos humanos, departamentos financeiros e sistemas de gerenciamento de ativos. Muitos aplicativos são hospedados na nuvem. Finalmente, a engenharia e a computação científica em larga escala hoje dependem muito de clusters para paralelizar sua carga de trabalho. Esses tópicos são discutidos na minha palestra de computação distribuída. Neste repositório, você pode encontrar os exemplos práticos que eu uso no meu curso.
Soquetes
em c
em java
HTML, CSS e JavaScript
Java Servlets
exemplos implantáveis
HTTP Proxy Servlet
Páginas JavaServer
exemplos implantáveis
JSPs independentes
Java RMI
Xml
Exemplos para documentos XML e padrões relacionados
Exemplos para processamento XML com Java
Serviços da Web
JSON RPC
Interface de passagem de mensagens
Hadoop
Cada um dos links acima leva você a um subdiretório contendo um conjunto de exemplos. Cada subdiretório possui um arquivo README.md próprio com descrições detalhadas.
Como também uso o mesmo código nos meus slides, existem alguns comentários especiais como //(*@serverBox{2)}@*) para formatação nos meus códigos ... você pode ignorá -los com segurança ^_ ^
O conceito deste curso é que queremos entender como a Web e os ambientes de aplicativos corporativos distribuídos funcionam. Queremos fazer isso começando a explorar como se comunicar em uma rede no nível mais baixo de abstração (normalmente) disponível para programadores, a API do soquete. A partir daí, trabalhamos em níveis mais altos de abstração, ou seja, mais simples e mais poderosos, empilhando um no outro (e, finalmente, fundamentados em soquetes). Dessa forma, obteremos um entendimento sólido de como os aplicativos distribuídos e a web funcionam. Seremos capazes de olhar para um site e imediatamente ter um entendimento aproximado de como ele pode funcionar, até as porcas e parafusos. Para cada nível de abstração que exploramos, sempre aprendemos tecnologias de exemplo.
Como dito, começamos no fundo: a comunicação em sistemas distribuídos hoje geralmente é baseada no UDP ou no TCP. Ambos os protocolos são acessados através da API de soquete, para a qual fornecemos exemplos em C e Java. Como parte desses exemplos, também mostramos como o texto pode ser codificado em Java e como construir servidores que podem processar várias solicitações em paralelo. Os soquetes são, portanto, a base dos aplicativos distribuídos, o nível mais baixo com o qual um programador pode ter que funcionar.
Agora, podemos entender os processos básicos de comunicação em andamento em praticamente qualquer rede de computadores atual e na Internet. Usaremos esse entendimento para investigar como uma organização ou empresa pode se apresentar ao mundo exterior por meio de um site. Queremos entender as tecnologias necessárias para construir um site que possa interagir dinamicamente com um usuário.
A World Wide Web é baseada em três pilares: HTTP, HTML/CSS/JavaScript e URLs. O HTTP, o protocolo de transferência de texto hiper, é um protocolo baseado em texto para consultar recursos que geralmente são transmitidos pelas conexões TCP. Na verdade, já fornecemos implementações de exemplo do servidor (servidor da Web) e do cliente do cliente (navegador da Web) da comunicação HTTP usando soquetes (e até um pequeno servidor da Web paralelo. Em seguida, fornecemos alguns exemplos rudimentares para HTML, CSS e Javascript.
A implementação do HTTP baseada em soquetes é bastante complexa. Os soquetes nos permitem acessar o TCP. O que gostaríamos de ter é uma API igualmente elegante para acessar o HTTP (o próximo nível mais alto de abstração). Uma dessas tecnologias são Java Servlets. Os servlets são usados para implementar o lado do servidor de uma conversa HTTP. Um servlet é uma subclasse de uma classe Java especial que implementa métodos de manipulador para diferentes interações HTTP ("métodos HTTP"). Esses métodos são chamados por um contêiner de servlet, a implementação real do servidor. Portanto, podemos nos concentrar totalmente na lógica do aplicativo e não precisamos nos preocupar com a interação do protocolo. Fornecemos uma ampla gama de exemplos para servlets Java, ambos exemplos implementáveis e um servlet de proxy HTTP independente. Assim, com o Java Servlets, podemos criar componentes do servidor que podem interagir dinamicamente com um cliente HTTP (como um navegador da Web). Isso significa que podemos gerar dinamicamente o conteúdo de uma página da web quando um navegador os solicita. No entanto, a criação de sites dinâmicos completos como Java Servlets é novamente bastante pesado, pois servlets são aulas de Java enquanto as páginas da web são HTML, que então escreveríamos em forma de constantes de sequência a serem gravadas na saída de um servlet.
O próximo nível mais alto de abstração são as páginas JavaServer (JSPs), que nos permitem escrever páginas HTML (ou outros formatos de texto) e incluir o código -fonte Java. As páginas são então servidas novamente por um recipiente de servlet. Sempre que uma página é enviada a um cliente, o código Java incluído é executado pela primeira vez no lado do servidor (e pode gerar saída adicional). Após uma inspeção mais minuciosa, podemos descobrir que os JSPs são realmente servlets "especiais": quando um JSP é acessado pela primeira vez, o contêiner do servlet cria dinamicamente o código -fonte de um servlet Java correspondente. Este servlet é compilado, carregado e executado para criar o conteúdo dinâmico da página a ser enviado ao cliente. Tudo o que foi "texto" no JSP se torna uma string dentro do servlet que é gravada na resposta HTTP do servlet. Tudo o que era "código" no JSP é copiado diretamente nos métodos manipuladores do servlet. Os JSPs são uma maneira mais natural de gerar dinamicamente a saída de texto (HTML) e servir a um cliente. Até agora, temos um sólido entendimento de como o conteúdo dinâmico na Web pode ser gerado, como um usuário pode interagir com um aplicativo da Web por meio de formulários da Web usando seu navegador e como podemos realizar sessões.
Embora essas tecnologias nos permitam criar uma visão dinâmica "externa" de uma empresa, a maneira como a empresa se apresenta na Web, agora exploramos a visão "interna" do ambiente de computação corporativa distribuída. Aqui, o objetivo é construir um ambiente no qual os aplicativos de diferentes departamentos (departamento financeiro, recursos humanos, gerenciamento de ativos, ...) podem ser conectados entre si de uma maneira extensível e segura de futuro.
A primeira etapa nesta estrada para a computação corporativa são as chamadas de procedimento remoto (RPCs), que exploramos no exemplo da Invocação do Método Remoto Java (RMI). Nossos exemplos mostram como um objeto de um aplicativo hospedado no computador pode ser acessado de outro programa em execução em outro computador. Isso nos aproxima de realizar aplicativos distribuídos interconectados em uma rede. No entanto, o Java RMI ainda é uma tecnologia específica de Java e seu protocolo é binário. Gostaríamos de implementar nossos aplicativos distribuídos de maneira independente da plataforma, usando protocolos muito claros, bem especificados e fáceis de entender.
Nossa busca de tal tecnologia nos obriga a levar primeiro o aprendizado sobre a linguagem de marcação extensível (XML. XML é um formato de auto-documentação para armazenar estruturas de dados complexas no texto. É semelhante a HTML, mas sem que qualquer número de documentos predefinidos e pode ser especificado para cada aplicação. Ambos procuramos os exemplos de mais definidos por XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML para XML
Em seguida, discutimos os serviços da Web. Os serviços da Web são a base básica de muitos sistemas de computação corporativa distribuídos e arquiteturas orientadas a serviços. Eles são chamados usando o protocolo SOAP baseado em XML geralmente sobre o HTTP. Sua interface e funcionalidade fornecida são descritas através do Web Service Descrição Language (WSDL), outro padrão XML. Com base no que já sabemos, agora poderíamos enviar dados XML para um servlet Java via HTTP-post, analisar esses dados com essas tecnologias de processamento Java XML, usar as mesmas tecnologias para gerar um documento XML de saída e enviar este de volta como a resposta do Java Servlet. Na verdade, poderíamos até usar as páginas do JavaServer para esse fim. No entanto, novamente há uma maneira mais simples: podemos criar serviços como objetos Java simples e publicá -los no servidor Apache Axis2/Java. O servidor os tornará acessíveis via SOAP e gerará automaticamente descrições WSDL. Eles podem ser usados para gerar objetos proxy para o lado do cliente usando, por exemplo, Maven. Investigamos essa tecnologia em vários exemplos.
O JSON RPC é outra abordagem de chamada de procedimento remoto (RPC) (especificado aqui) onde as estruturas de dados trocadas são codificadas na notação de objeto JavaScript (JSON). Os dados são trocados via HTTP ou TCP. Os RCPs JSON são semelhantes aos serviços da Web, mas projetados para serem mais leves. Discutimos novamente vários exemplos.
Como último caso de uso importante para computação distribuída, consideramos como os cálculos distribuídos em larga escala podem ser realizados. Tais cálculos são necessários em muitos cenários, desde simulações de engenharia até mineração e processamento de dados nas empresas.
Agora, nos concentramos em como o poder de computação de aglomerados maciços pode ser utilizado para cálculos científicos e de engenharia em larga escala. Tais cálculos ou simulações grandes são frequentemente divididos em vários subproblemas menores. Esses problemas menores são então resolvidos cooperativamente por vários threads ou processos em paralelo. Isso geralmente envolve a troca de mensagens em intervalos regulares entre os processos que trabalham em subproblemas intimamente relacionados. Obviamente, serviços da Web, Java Servlets, ou mesmo apenas Java e o Protocolo HTTP, seriam as tecnologias erradas para isso: para cálculos em larga escala, queremos obter o mais eficiente possível com o mínimo possível. Isso diz respeito especialmente à comunicação, que é muito cara e o fator limitante para a aceleração que podemos alcançar com a distribuição. Queremos trocar tipos de dados primitivos com eficiência e queremos usar paradigmas de comunicação não suportados pelo HTTP/TCP, como transmissões, multicasts e comunicação assíncrona. Para isso, uma implementação da interface de passagem de mensagens (MPI) seria o método de escolha. Exploramos essa tecnologia com base em vários exemplos na linguagem de programação C.
Em uma etapa final, discutimos uma tecnologia que combina a capacidade de criar cálculos distribuídos em larga escala (do mundo do MPI) com o rico suporte da ferramenta do ecossistema Java: MapReduce with Apache Hadoop. MPI is the technology of choice if communication is expensive and the bottleneck of our application, frequent communication is required between processes solving related sub-problems, the available hardware is homogenous, processes need to be organized in groups or topological structures to make efficient use of collective communication to achieve high performance, the size of data that needs to be transmitted is smaller in comparison to runtime of computations, and when we do not need to worry much about exchanging data with a Ambiente de aplicação distribuído heterogêneo. Hadoop, on the other hand, covers use cases where communication is not the bottleneck, because computation takes much longer than communication (think Machine Learning), when the environment is heterogeneous, processes do not need to be organized in a special way and the division of tasks into sub-problems can be done efficiently by just slicing the input data into equal-sized pieces, where sub-problems have batch job character, where data is unstructured (eg, text) e potencialmente enorme (aliando as vantagens da comunicação no estilo MPI), ou de onde vem os dados e os resultados devem ser transferidos de volta para outros aplicativos no ambiente, digamos às pilhas de serviço/servlet/web http/java. Nossos exemplos do Hadoop se concentram no padrão MapReduce (que é um pouco parecido com a dispersão/coleta/redução no MPI, apenas para o cenário descrito acima).
Em suma, este curso fornecerá uma compreensão aproximada das tecnologias dominantes em diferentes campos de computação distribuída, de sites dinâmicos em relação aos sistemas de aplicativos distribuídos da empresa interna, a engenharia distribuída e cálculos científicos. Cada campo é explorado com exemplos práticos e você pode testar e brincar com várias tecnologias de exemplo.
Para cada exemplo, listo explicitamente o software necessário e discuto como ele pode ser obtido e instalado. Aqui eu dou uma visão geral sobre esses componentes de software.
A maioria dos exemplos que forneço é escrita na linguagem de programação Java e pode ser executada em sistemas arbitrários, já que o Java está instalado. Para compilá -los, você precisa de um Java JDK instalado. Meus exemplos exigem Java 7 ou posterior.
No Windows, você precisa baixar e instalar o Java no site do Oracle.
Em Linux, você faria sudo apt-get install openjdk-7-jdk (onde você pode substituir 7 por qualquer versão posterior, como 8 , se quiser)
Vários dos meus exemplos de Java são construídos com Maven. Todos esses exemplos têm um arquivo pom.xml em sua pasta root. Para construí -los, você precisa instalar o Maven.
No Windows, você precisa baixar e instalar o Maven no site Apache.
Em Linux, você faria sudo apt-get install maven .
Se você estiver usando o Eclipse (veja abaixo), não precisará instalar o Maven, pois ele já está integrado ao Eclipse.
Eu recomendo o Eclipse como ambiente de desenvolvedor para todos os exemplos de Java neste repositório. Cada exemplo java já vem com um arquivo .project Eclipse e com .settings . O Eclipse integra o Maven e o Git. Isso significa que você pode clonar esse repositório dentro do Eclipse e importar diretamente os projetos Jave durante esse processo. Se você clicar com o botão direito do mouse nos projetos do Maven e no ChooSen Maven -> Update Project... , o Eclipse também baixará e usará todas as bibliotecas e dependências necessárias, conforme especificado pelo Maven pom.xml para você.
Você pode baixar o Eclipse no site Eclipse. Eu recomendo usar pelo menos o eclipse Mars.1 para seu excelente suporte ao Maven e Git.
Para executar alguns dos exemplos de páginas Java Servlets e JavaServer, você precisa baixar o servidor Glassfish no site de download correspondente. Eu recomendo usar pelo menos Glassfish 4.1.2.
Para executar os exemplos de serviços da Web, você precisará baixar o Apache Axis2/Java na página de download correspondente. Eu recomendo usar pelo menos axis2 1.7.3.
Para compilar os exemplos escritos na linguagem de programação C (como os exemplos de soquetes baseados C ), você precisará de um compilador C como o GCC. Em Linux, normalmente já deve ser instalado e pode ser instalado via sudo apt-get install gcc . No Windows, você precisará instalar o Mingw, geralmente através do instalador da web.
Vários dos exemplos C vêm para Windows ou Linux. O GCC permite que você com compile cruzado, ou seja, se você estiver usando o Linux, pode compilar programas C para Windows. Para esse fim, você instalaria primeiro sudo apt-get install gcc-mingw-w64-i686 e depois pode usar o comando gcc-mingw-w64-i686 da mesma maneira que usaria gcc sob o Mingw.
Para criar e compilar nossos exemplos para usar a interface de passagem de mensagens (MPI), precisamos de uma implementação do MPI. Escolhemos o MPICH.
Em Linux, você pode instalar os arquivos necessários via sudo apt-get install mpich libmpich-dev .
ssh e rsync ) Para testar nossos exemplos do Hadoop, agora precisamos configurar um cluster Hadoop único. Portanto, seguimos o guia dado em http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. Precisamos instalar pré-requisitos como ssh e rsync . No exemplo do Hadoop ReadMe, fornecemos o guia de instalação para o Hadoop 2.7.2 Linux / Ubuntu. Tudo se resume a baixar e instalar o Hadoop de um dos espelhos fornecidos em http://www.apache.org/dyn/closer.cgi/hadoop/common/, além das diretrizes do tutorial vinculado.
Este trabalho tem propósitos puramente educacionais. Além de tudo mencionado abaixo, para qualquer coisa neste repositório, importo uma condição adicional de licenciamento: o Código nunca deve ser usado para qualquer coisa que possa violar as leis da Alemanha, China ou EUA. Isso também vale para qualquer outro arquivo ou recurso fornecido aqui.
Os exemplos deste repositório estão licenciados sob a licença pública geral da GNU versão 3, 29 de junho de 2007, com as seguintes exceções:
Tudo nos diretórios /javaserverpages /standalonejspswithjetty e /javaservlets /proxy é licenciado sob a licença Apache v2.0 e é parcialmente derivado do projeto incorporado-jetty-jsp com direitos autorais (c) 1995-2013 Mort Bay Consulting Pty.
Alguns dos exemplos do Hadoop se inspiram no Maven-Hadoop-Java-WordCount-Template por H3ML3T, para os quais nenhuma informação de licenciamento é fornecida. Os exemplos são totalmente diferentes de várias maneiras, por exemplo, na maneira como construímos potes de gordura. De qualquer forma, este projeto original é bem descrito nesta entrada do blog.
Além disso, o nosso Hadoop Word é baseado no conhecido exemplo de contagem de palavras para o mapa do Hadoop, reduz a funcionalidade. É baseado na versão por Luca Menichetti [email protected] fornecido sob a Licença Pública Geral da GNU versão 2.