Gerencie dependências de processos e serviços em um ambiente SOA
Histórico Você sabe de quais serviços depende um processo BPEL? Se forem utilizadas versões diferentes de um processo BPEL, as dependências entre os dois podem rapidamente se tornar mais complexas. A complexidade do gerenciamento de dependências aumenta se levarmos em conta os serviços Enterprise Service Bus (ESB) invocados pelo processo BPEL. A complexidade torna a implantação e os testes demorados, difíceis e propensos a erros.
Freqüentemente, acabamos usando a ferramenta de modelagem do Microsoft Visio para diagramar manualmente as dependências e nos esforçar para atualizar as dependências após cada alteração no processo. Este é um grande obstáculo à agilidade das infraestruturas de arquitetura orientada a serviços (SOA), que são projetadas para permitir mudanças ágeis nos processos de negócios.
Nesta nota técnica, você aprenderá como melhorar com sucesso seu processo de construção e implementar a geração automática de gráficos de dependência de processo.
Nosso desafio é implementar um projeto de demonstração do Oracle SOA Suite para um cliente que contenha muitos processos BPEL e faça referência a muitos subprocessos BPEL e serviços ESB. Acabamos usando uma dúzia de processos BPEL e serviços ESB (que foram definidos como serviços públicos e compartilhados no registro de serviços), bem como outros processos BPEL e serviços ESB proprietários.
Primeiramente, decidimos criar uma implantação baseada em Ant para todos os serviços do projeto, implantar os processos BPEL (incluindo os casos de teste que os executam) em diferentes ambientes (teste, integração, produção), e também implantar os serviços ESB para os ambientes baseados em Ant. Download grátis de e-books de computador
Requisitos Após concluir o primeiro lançamento do projeto, temos alguns requisitos:
,
Quando um processo BPEL ou serviço ESB muda, não queremos implantar todos os serviços do projeto. Portanto, precisamos passar de uma implantação centrada em projetos para uma abordagem de implantação centrada em serviços públicos.
Ao implementar um processo BPEL, todos os subprocessos dependentes (proprietários) e serviços ESB também são implementados automaticamente.
Para evitar a substituição de uma versão específica de um processo, implemente essa versão do processo somente se ela ainda não estiver implementada no servidor. A substituição fará com que todas as informações do fluxo da instância sejam perdidas.
Um gráfico visual de todas as dependências de processos e serviços deve ser criado automaticamente durante a implantação, sem a necessidade de manter essas informações separadamente. A visualização deve ficar assim.
Perguntas abertas Em resposta a esses novos requisitos, fizemos as seguintes perguntas e fornecemos as seguintes respostas:
Pergunta: Onde as informações das dependências de processos e serviços são armazenadas? Precisa adicionar mais informações para criar um gráfico de dependência completo?
Resposta: Todos os serviços chamados pelo processo BPEL são armazenados no arquivo bpel.xml marcado por partnerLinkBinding. O processo BPEL chamado e as informações de versão também são codificados na URL. Por exemplo: download gratuito de e-books de computador
<nome da propriedade="wsdlRuntimeLocation">
${domain_url}/CustomerAccount_BES/1.3/CustomerAccount_BES?wsdl
</propriedade>
A versão atual do processo BPEL a ser implementado pode ser localizada no arquivo build.properties. Para manutenção de versão do processo BPEL, precisamos apenas alterar a propriedade rev no arquivo build.properties.
Para diferenciar entre processos BPEL públicos e privados, o link de parceiro do cliente no arquivo bpel.xml fornece um novo atributo "tipo" com um valor "público" ou "privado", conforme mostrado aqui:
<partnerLinkBinding name="cliente">
<property name="wsdlLocation">CustomerAccount_BES.wsdl</property>
<property name="type">público</property>
</partnerLinkBinding>
Pergunta: Existe uma ferramenta ou estrutura que pode gerar gráficos de dependência dinamicamente?
Resposta: Sim, o Graphviz ( www.graphviz.org ), uma ferramenta de código aberto, pode gerar gráficos a partir de arquivos de entrada em formato de texto.
Pergunta: Quais são as opções para referenciar outros processos BPEL?
Resposta: As opções são:
Fazer referência à versão padrão Fazer referência a uma versão específica Fazer referência a uma chave de serviço UDDI (com ou sem informações de versão codificadas)
Pergunta: Como todos esses novos requisitos de implantação podem ser implementados?
Resposta: Esses novos requisitos de implantação são melhor alcançados usando tarefas Ant customizadas.
Com as perguntas iniciais respondidas satisfatoriamente, vamos começar criando uma tarefa Ant customizada. O arquivo bpel.xml é analisado na tarefa Ant. Para todas as tags PartnerLinkBindings encontradas, a análise do arquivo bpel.xml correspondente começará recursivamente. Além da análise, o valor atual da propriedade de versão ("ref") é extraído do arquivo build.properties de cada projeto BPEL encontrado. Um dos desafios da análise recursiva é ignorar dependências cíclicas.
Nosso novo atributo "type" e análise recursiva no arquivo bpel.xml implementam todas as nossas necessidades de implantação com o serviço em mente.
Melhor ainda, usamos o Graphviz para resolver o problema de geração automática de gráficos de dependência. Para conseguir isso, mesclaremos todas as dependências obtidas da análise recursiva bpel.xml em um único arquivo XML, conforme mostrado abaixo. Download grátis de e-books de computador
<?xml versão="1.0" codificação="UTF-8"?>
<BPELMala>
<BPELProcess id="Resource_BAS_SetForAccount" src=" http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BAS_SetForAccount.bpel ">
<parceiroLinkBindings>
<partnerLinkBinding name="cliente">
<property name="wsdlLocation">Resource_BAS_SetForAccount.wsdl</property>
<property name="type">público</property>
<property name="versão">1.2</property>
</partnerLinkBinding>
<partnerLinkBinding name="RemoveFromAccount">
<property name="wsdlLocation">Resource_BAS_RemoveFromAccount.wsdl</property>
<property name="versão">1.5</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
<BPELProcess id="Resource_BAS_RemoveFromAccount" src=" http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BAS_RemoveFromAccount.bpel ">
<parceiroLinkBindings>
<partnerLinkBinding name="cliente">
<property name="wsdlLocation">Resource_BAS_RemoveFromAccount.wsdl</property>
<property name="type">público</property>
<property name="versão">1.5</property>
</partnerLinkBinding>
<partnerLinkBinding name="CheckAvailability">
<property name="wsdlLocation">Resource_BES_CheckAvailability.wsdl</property>
<property name="versão">1.1</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
<BPELProcess id="Resource_BES_CheckAvailability" src=" http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BES_CheckAvailability.bpel ">
<parceiroLinkBindings>
<partnerLinkBinding name="cliente">
<property name="wsdlLocation">Resource_BES_CheckAvailability.wsdl</property>
<property name="type">público</property>
<property name="versão">1.1</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
...
</BPELMala>
Use XSLT para converter os arquivos XML mesclados em um formato de destino (.dot), que pode ser usado como entrada para o gerador Graphviz para gerar uma imagem PNG, conforme mostrado abaixo:
estruturas de dígrafo {
nó [shape=record,fontname="Arial",fontsize="10"];
borda [fontname="Arial",fontsize="8"];
classificaçãodir=LR;
rótulojust=l;
"Resource_BAS_SetForAccount_1_2" [shape=record,label="{Resource_BAS_SetForAccount}|{1.2|public}",
fillcolor=amareloverde,estilo=preenchido];
"Resource_BAS_RemoveFromAccount_1_5" [shape=record,label="{Resource_BAS_RemoveFromAccount}|{1.5|public}",
fillcolor=amareloverde,estilo=preenchido];
"Resource_BES_CheckAvailability_1_1" [shape=record,label="{Resource_BES_CheckAvailability}|{1.1|public}",
fillcolor=amareloverde,estilo=preenchido];
"Resource_BAS_SetForAccount_1_2" -> "Resource_BAS_RemoveFromAccount_1_5" [decorate=true,label=""];
"Resource_BAS_RemoveFromAccount_1_5" -> "Resource_BES_CheckAvailability_1_1" [decorate=true,label=""];
}
O gráfico de dependência gerado pelo arquivo DOT acima é semelhante a este:
O nome, a versão e o tipo do serviço são mostrados na caixa. A cor da caixa indica o tipo de serviço. Neste diagrama temos três serviços públicos (verdes). O diagrama no início deste artigo também mostra o serviço ESB (branco) e o serviço BPEL (laranja).
Após gerar o diagrama ideal para cada processo BPEL público, precisamos implementar a implantação automática dos processos relevantes. Para esta implantação centrada em serviços, usamos a lista de processos gerada anteriormente. O destino de implantação padrão é chamado para cada processo na lista. Para evitar a substituição de versões de processos existentes no servidor, o destino de implementação só será chamado se não houver uma versão atual do processo no servidor.
É possível determinar se uma versão específica do processo está disponível abrindo uma conexão HTTP com a URL WSDL do processo e, em seguida, verificando o código de status retornado (status HTTP 200 ? Implementado, status HTTP 404 ? Ainda não implementado). Download grátis de e-books de computador
A saída de nossa tarefa Ant customizada (contendo análise recursiva), geração de imagem PNG e implantação centrada em serviço é semelhante a esta:
...
[mkdir] Diretório criado: /MyProject/Resource_BAS_SetForAccount/doc
[bpeltask] ** INICIANDO DeployWithDependencesTask **
[bpeltask] Resource_BAS_SetForAccount-1.2
[bpeltask] ** PARÂMETRO **
[bpeltask] nomedotfile: doc/bpel-recursiv-all.dot
[bpeltask] dotfilenamepublic: doc/bpel-recursiv-public.dot
[bpeltask] implantar alvo: implantar
Implantação [bpeltask]: verdadeiro
[bpeltask] sobrescrevendo: falso
[bpeltask] stoponalreadydeployed: falso
[bpeltask] ** RESOLVER RECURSIVAMENTE TODOS OS ARQUIVOS bpel.xml **
[bpeltask] [Resource_BAS_SetForAccount-1.2]
[bpeltask] [Resource_BAS_SetForAccount-1.2, Resource_BAS_RemoveFromAccount-1.5]
[bpeltask] [Resource_BAS_SetForAccount-1.2, Resource_BAS_RemoveFromAccount-1.5, Resource_BES_CheckAvailability-1.1]
[bpeltask] ** ESCREVER ARQUIVO CENTRAL bpel.xml **
[bpeltask] ** TRANSFORMANDO ARQUIVO DE PONTOS **
[bpeltask] ** IMPLEMENTAÇÃO DE SERVIÇO **
[bpeltask] =============================================== =========================
[bpeltask] SERVIÇO JÁ IMPLANTADO (HTTP/1.1 200 OK) 'Resource_BES_CheckAvailability' na versão '1.1' http://localhost:8888/orabpel/default/Resource_BES_CheckAvailability/1.1/ Resource_BES_CheckAvailability?wsdl
[bpeltask] =============================================== =========================
[bpeltask] =============================================== =========================
[bpeltask] SERVIÇO JÁ IMPLANTADO (HTTP/1.1 200 OK) 'Resource_BAS_RemoveFromAccount' na versão '1.5' http://localhost:8888/orabpel/default/Resource_BAS_RemoveFromAccount/1.5 / Resource_BAS_RemoveFromAccount?wsdl
[bpeltask] =============================================== =========================
[bpeltask] =============================================== =========================
[bpeltask] SERVIÇO AINDA NÃO IMPLANTADO (HTTP/1.1 404 não encontrado) http://localhost:8888/orabpel/default/Resource_BAS_SetForAccount/1.2/ Resource_BAS_SetForAccount?wsdl
[bpeltask] INICIANDO A IMPLANTAÇÃO DO SERVIÇO de Resource_BAS_SetForAccount na versão 1.2
[bpeltask] =============================================== =========================
...
Conclusão A implantação centrada em serviços que gera automaticamente gráficos de dependência atende a todas as nossas necessidades de transparência da infraestrutura SOA. Como a implantação é inteiramente baseada em Ant, também podemos usá-la para nossos trabalhos noturnos Luntbuild e de construção de produção (ambiente de construção contínua).
Para apoiar a governança SOA de nossos clientes, exporemos nosso processo público e sua documentação, juntamente com o gráfico de dependência resultante, no wiki do cliente, conforme mostrado aqui:
As páginas Wiki são geradas dinamicamente quando uma pesquisa no registro de serviço recupera a versão de um serviço público atualmente registrado. As figuras na página wiki fornecem links para o repositório fonte (Subversion), que contém figuras em tamanho real da documentação e versões registradas de nossos serviços públicos. Clique na miniatura para recuperar o arquivo correspondente do Subversion via WebDAV