Tecnologias para Sistemas Distribuídos
Tecnologias para Sistemas Distribuídos
Tecnologias para Sistemas Distribuídos
inicializadas por um cliente que estava interligado a ele por meio da rede. Mais tarde,
2002).
novos padrões das linguagens de marcação como o XML, surgiram os serviços da Web
camadas são partes integrantes do aplicativo e elas podem estar em diferentes domínios
chamadas.
utilizá-los. Mas para que isto ocorra, um formato padrão deve ser compreensível para
(COULOURIS, 1998).
uma dessas operações precisa ser padronizada para que o serviço seja utilizado por
distribuída.
abordagem muito útil e com inúmeros benefícios. Dentre dos vários, pode-se destacar: o
desenvolvimento de software.
orientadas a objetos.
Desde o início dos anos 90, quando foram publicados os primeiros documentos
a sua especificação.
a mesma orientação do CORBA, a arquitetura DCOM, que tem sido vista como uma
linguagem C.
2.2 Tecnologia da arquitetura CORBA
CORBA é uma arquitetura definida pelo OMG e tem sua base no modelo
objeto de uma aplicação existe a especificação dos serviços que ele pode oferecer. O
cliente, de posse desta informação, é capaz de encaminhar sua solicitação ao objeto que
solicitado por um Cliente, devendo fazer uso de um ou diversos serviços providos por
outros objetos. O Cliente pode obter informações dos serviços do objeto nas interfaces
dos mesmos. Estas interfaces tanto podem fornecer estas informações ao cliente quanto
objeto (define o objeto que será distribuído pelo sistema heterogêneo) e o modelo de
Esta estrutura define a comunicação entre os objetos distribuídos por meio de quatro
elementos básicos:
características definidas de acordo com os seus objetivos. Também são tidos como os
introduzi-lo no ambiente.
objeto que possa executar a solicitação e passar os parâmetros, além de invocar seu
método e retornar seus resultados sem que o cliente tenha conhecimento de onde está
sistema operacional.
(CORBA, 2006).
necessário que exista uma interface chamada IDL (Interface Definition Language) (IDL,
2006).
Java, C, C++) e são incluídas as definições dos tipos de dados específicos de cada
Unix, Win32, Linux, FreeBSD e etc. Vide figura 3 com a qual o usuário tem contato
A transparência dos fatores citados acima é responsável não apenas pela garantia
componente está situado a nível local ou remoto (IDL, 2006). A figura 3 ilustra o
Essa ativação ocorre como se fosse uma requisição, como outra qualquer,
realizada pelo cliente, ao qual retorna a referência objeto. Isto faz com que a estrutura
Tanto o stub quanto o skeleton são criados com base na compilação da interface
figura 4.
2006).
foi o marco inicial da tendência de computação distribuída nas empresas. Na sua evolução surgiu
trabalha em conjunto com applets Java e componentes ActiveX por meio do uso do Component
Object Model.
(TANENBAUM, 2002).
define como os componentes e os seus clientes interagem. Esta interação é definida de maneira
que o cliente e o componente podem ser interligados sem a necessidade de qualquer sistema
Nos sistemas operativos os processos estão protegidos uns dos outros. Um cliente que
necessite trocar informações com outro componente distante não o pode solicitar diretamente, ou
seja, é necessário que o sistema operacional proporcione qualquer forma de comunicação entre
os processos.
componente.
tarefa de distribuir componentes para melhorar o desempenho lado cliente, supondo, por
exemplo, que certos componentes devam estar em uma determinada máquina e em uma
determinada localização.
tráfego na rede não for problema, então, é preferível colocá-los em máquinas mais
máquina ou até no mesmo processo. Mesmo que exista um número grande de pequenos
como o Microsoft Visual Basic, Delphi e mais tarde ser reimplementado em outra
Sun corrigiram uma série de problemas que apresentavam na linguagem C++, por
exemplo, a linguagem Java utiliza algoritmo coletor de lixo (garbage collector) para
deslocar regiões de memória que não estejam mais sendo usadas. Por ser orientada a
possa ser executado em qualquer plataforma: Linux, Unix, FreeBSD, Windows, AIX,
Macintosh, etc, desde que o computador tenha um interpretador que faça a interface
máquina real, os quais podem executar uma instrução diferente do que a fixada na
máquina real.
menos desempenho que uma máquina real equivalente que execute o mesmo software,
2005). A figura 7 ilustra uma abstração da Máquina Virtual Java comparada com a
máquina real.
Existe uma grande variedade de máquinas virtuais que fornecem também uma
virtuais desde que garantam a habilidade para nivelar o uso de recursos de hardware
pelo sistema.
As máquinas virtuais também podem empregar técnicas de emulação para apoiar
arquitetura para cada uma destas camadas, embora o termo "arquitetura" não seja
portabilidade.
difundidos e disponíveis nos últimos anos devido à larga expansão dos serviços
disponíveis da Web. Esses objetos podem interagir diretamente com um objeto que se
mantenha em um host remoto. O poder de distribuir objetos está no fato de que uma
(TANENBAUM, 2002).
Hello.idl
HelloServer.java
// Copyright and License Sun Microsystems.
// HelloServer.java
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;
import java.util.Properties;
class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB(ORB orb_val) {
orb = orb_val;
}
// implement sayHello() method
public String sayHello() {
return "\nHello world !!\n";
}
// implement shutdown() method
public void shutdown() {
orb.shutdown(false);
}
}
public class HelloServer {
public static void main(String args[]) {
try{ // create and initialize the ORB
ORB orb = ORB.init(args, null);
// get reference to rootpoa & activate the POAManager
POA
rootpoa=POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// create servant and register it with the ORB
HelloImpl helloImpl = new HelloImpl();
helloImpl.setORB(orb);
// get object reference from the servant
org.omg.CORBA.Objectref=ootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);
// get the root naming context
// NameService invokes the name service
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
// Use NamingContextExt which is part of the Interoperable
// Naming Service (INS) specification.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// bind the Object Reference in Naming
String name = "Hello";
NameComponent path[] = ncRef.to_name( name );
ncRef.rebind(path, href);
System.out.println("HelloServer ready and waiting ...");
// wait for invocations from clients
orb.run();
}
catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
System.out.println("HelloServer Exiting ...");
}
}
HelloClient.java
1) compile a IDL com o compilador IDLJ com o seguinte parâmetro: idlj –fall
da classe HelloOperations;
digitados;
criado pelo IDLJ. Nesta etapa, a linguagem Java incluirá o diretório helloapp. Utilize o
(porta 1050);
4) inicialize a classe Hello server com a seguinte instrução: java HelloServer
tarefas para desenvolver qualquer aplicação que venha a utilizar o padrão CORBA, uma
inovação estática que é usada pelo stub do cliente para a solicitação do serviço no
skueleton do servidor.
pode ser armazenada no serviço naming, e um cliente pode usá-lo para obter a
poderosa para a modelagem de objetos a partir dos recursos fornecidos pelo paradigma
aplicações complexas. É escrito na linguagem java utilizando uma IDE Java Beans
neste contexto sem a necessidade de refazer cada sistema sempre que surgir uma nova
funcionalidade.
Java podem acessar esses componentes por meio das interfaces padrões. Clientes não
Java também podem acessar os Beans usando o CORBA com total transparência
(BEANS, 2006).
Para caracterizar um componente Java Beans são necessários pelo menos três
encontrar um Bean, a interface remota define quais métodos de negócio um cliente pode
Objeto EJB, que mantém a referência remota ao cliente, e para respondê-la, cria-se uma
conexão com o cliente via stub. Quando o cliente invoca um método de negócios no
objeto EJB é necessário obter uma informação do contêiner que chama o método
campos estão corretos e, por fim, as requisições remotas do cliente podem ser atendidas.
Todos esses elementos envolvidos no processo têm suporte das seguintes APIs:
desse componente.
2.4.2 Sockets na linguagem Java
executados em uma rede. Ele está ligado a um número de porta de maneira que a
camada do protocolo TCP pode identificar a aplicação cliente para que os dados sejam
enviados.
ativado, o servidor fica pronto, esperando para ouvir as requisições do cliente (o pedido
de conexão, por exemplo). No lado cliente o aplicativo que utiliza o socket possui o
recebe um número de porta para a troca de dados. Caso contrário, o cliente poderia não
responder à entrada.
devem ser definidas tanto no lado do servidor quanto no lado do cliente, objetivando
cadastro.
componente Socket.
recebimento.
dados. Uma vez estabelecida a comunicação, o socket é acessado pelo uso de uma
operação baseada em conexões ser menos eficiente do que a operação sem conexão ela
para fazer sua entrega, como em um envelope (destinatário, endereço, CEP, remetente, e
etc.), além de conter os dados a serem transmitidos no seu conteúdo. Essa maneira de
datagrama. Apesar da operação sem conexão ser rápida e eficiente, ela não possui a
aplicativo. É evidente que se a opção for pela não orientação à conexão com o servidor,
pelo qual eles vão se comunicar. Caso contrário, os dados passarão de um lado para
cliente e o uso de servidores para que se realize a tarefa (HOPSON, 1997), (SOCKET,
2006).
A linguagem Java através de suas classes prove o suporte para esse modelo. O
pacote: import java.net contém as classes sockets que disponibilizam os serviços para o
transmitir solicitações de conexão com o servidor socket, e depois solicita seus serviços.
linha de código que cria um socket cliente e o vincula à porta e endereço 192.168.0.94 -
Todo socket cliente possui uma estrutura básica com as seguintes funções:
• fecha a comunicação;
import java.io.*;
import java.net.*;
public class KnockKnockClient {
public static void main(String[] args) throws IOException {
try {
kkSocket = new Socket("192.168.0.94", 4444);
out = new PrintWriter(kkSocket.getOutputStream(), true);
in = new BufferedReader(new
InputStreamReader(kkSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection
to: taranis.");
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(new
InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye."))
break;
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
out.close();
in.close();
stdIn.close();
kkSocket.close();
}
}
/********************************/
Outros parâmetros podem ser adicionados a esse método como, por exemplo, o
requisições de conexões de vários clientes, mas cada uma delas tem que ser processada
/********************************/
utilizar para se comunicar com o servidor. Essa classe mantém os dados onde o cliente e
várias mensagens de texto que o cliente utiliza para dar respostas às declarações do
import java.net.*;
import java.io.*;
public class KnockKnockProtocol {
private static final int WAITING = 0;
private static final int SENTKNOCKKNOCK = 1;
private static final int SENTCLUE = 2;
private static final int ANOTHER = 3;
private static final int NUMJOKES = 5;
private int state = WAITING;
private int currentJoke = 0;
private String[] clues = { "Turnip", "Little Old Lady", "Atch",
"Who", "Who" };
private String[] answers = { "Turnip the heat, it's cold in
here!",
"I didn't know you could yodel!",
"Bless you!",
"Is there an owl in here?",
"Is there an echo in here?" };
public String processInput(String theInput) {
String theOutput = null;
if (state == WAITING) {
theOutput = "Knock! Knock!";
state = SENTKNOCKKNOCK;
} else if (state == SENTKNOCKKNOCK) {
if (theInput.equalsIgnoreCase("Who's there?")) {
theOutput = clues[currentJoke];
state = SENTCLUE;
} else {
theOutput = "You're supposed to say \"Who's there?\"!
" +
"Try again. Knock! Knock!";
}
} else if (state == SENTCLUE) {
if (theInput.equalsIgnoreCase(clues[currentJoke] + "
who?")) {
theOutput = answers[currentJoke] + " Want another?
(y/n)";
state = ANOTHER;
} else {
theOutput = "You're supposed to say \"" +
clues[currentJoke] +
" who?\"" +
"! Try again. Knock! Knock!";
state = SENTKNOCKKNOCK;
}
} else if (state == ANOTHER) {
if (theInput.equalsIgnoreCase("y")) {
theOutput = "Knock! Knock!";
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0;
else
currentJoke++;
state = SENTKNOCKKNOCK;
} else {
theOutput = "Bye.";
state = WAITING;
}
}
return theOutput;
}
}
A execução das classes provê a aceitação da conexão através do método de um
cliente que começa pelo pedido de uma conexão no servidor. Neste exemplo, o servidor
está sendo executado na máquina com IP: 192.168.0.94 e tem associado a esse endereço
uma porta (neste caso a porta de número 4444). Quando uma conexão é solicitada e
porta e endereço remoto ligado ao cliente passando, então, a troca de mensagem entre o
2.4.3 Applets
Web (Opera, Netscape Navigator, Internet Explorer, Mozilla Firefox, etc) que interpreta
o código Java, ou seja, o código binário que está sendo transportado pela rede. Para que
seja possível, o documento HTML contém uma referência a uma classe Java que se
encontra no lado servidor e será executada na máquina cliente como, por exemplo, nas
seguintes tags:
Outra característica do applet é que o mesmo não possui um método main() como
explícita do usuário;
vieram;
• segurança;
• utiliza os métodos init( ), start( ), stop( ) e destroy( ) para definir seu ciclo de
vida.
invocado pelo navegador na primeira vez que o applet é carregado. O método start( ) é
chamado pelo navegador toda vez que o applet é concluído na tela. O método stop( ) é
invocado pelo navegador toda vez que o applet deixa de ser visível. E, finalmente, o
o desenvolvimento.
código deve ser armazenado em um arquivo de mesmo nome da classe que ele define,
componentes de interações WIMP, janelas, ícones, caixas de texto, menus, etc. Contém
mouse, etc.).
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.applet.Applet;
public class ApptoAppl extends Applet
implements ActionListener {
JLabel text;
JButton button;
JPanel panel;
private boolean _clickMeMode = true;
public void init(){
setLayout(new BorderLayout(1, 2));
setBackground(Color.white);
text = new JLabel("Este e um simples Programa!");
button = new JButton("Click Me");
button.addActionListener(this);
add("Center", text);
add("South", button);
}
public void start(){
System.out.println("Applet starting.");
}
public void stop(){
System.out.println("Applet stopping.");
}
public void destroy(){
System.out.println("Destroy method called.");
}
public void actionPerformed(ActionEvent event){
Object source = event.getSource();
if (_clickMeMode) {
text.setText("Botao Clicado");
button.setText("Click novamente");
_clickMeMode = false;
} else {
text.setText("Este e um simples programa");
button.setText("Click ");
_clickMeMode = true;
}
}
}
/***************************/
Na figura 14 abaixo, o código HTML carrega o applet no navegador. O applet é
carregado e formatado dentro de uma página Web de uma maneira semelhante a uma
imagem.
Na maioria dos navegadores, o arquivo HTML indica que uma imagem deve ser
especificado em suas funções uma URL relativa está associada, o applet normalmente
usa seu código ou o documento para formar a URL completa (APPLETS, 2006).
As dimensões do applet na área do navegador são definidas pelas linhas das tags
do arquivo HTML dentro da chamada ao applet, nos campos width (largura) e height
(altura).
Figura 14 - Um Applet sendo carregado no navegador (APPLETS, 2006)
instâncias desses objetos, e registrá-las para que possam cooperar entre si submetendo-
rede. Os sockets são as bases das comunicações em redes TCP/IP e também são muito
enviar pacotes de dados a qualquer processo que tenha um canal definido. Não
melhor esforço;
• raw: a comunicação provê acesso direto aos protocolos e interfaces de
os usuários dos serviços da Web, por exemplo, o comércio eletrônico tem direcionado
pela rede para que outros programas possam usá-las livremente. Outras arquiteturas
serviços das tecnologias CORBA e DCOM e conclui que ambas possuem diferentes
algumas comparações.
Tabela 1 - Comparações entre CORBA, DCOM (TANENBAUM, 2002)
As diferenças:
• COM provê somente facilidades de Remote Procedure Call local porque não
uma interface;
• CORBA provê uma ligação dinâmica de alto nível para linguagens como C+
outros.
• usabilidade;
a usabilidade:
Há várias ferramentas Open Source baseadas na linguagem Java JDK que dão
Java (SUN, 2005): IDE NetBeans; IDE Eclipse; IDE Jedit; IDE Jakarta Tomcat - Web
Container Servlet/JSP; Jakarta JMeter - ferramenta de teste de carga para Web Servers;