Serviço de web de estratégia de versão
Obter através da App Store Leia esta publicação em nosso aplicativo!
Controle de API da Web Services.
Ofereço uma pequena API de Serviços Web para meus clientes, que planejo evoluir ao longo do tempo. Então eu preciso de algum tipo de versão, mas não consigo encontrar nenhuma informação sobre como você faz algo assim.
Existe uma melhor prática?
Como posso continuar adicionando novas funcionalidades sem quebrar a compatibilidade com os consumidores de serviços da Web?
O controle de versão é um tópico complexo, então primeiro você precisa definir seus objetivos de forma mais descritiva. Seria ótimo dizer que você possui uma interface que assegura que você nunca quebrará a compatibilidade, mas dependendo do que é a nova funcionalidade, talvez nem seja possível. Portanto, existem diferentes situações e trade-offs diferentes.
Se a sua intenção é apenas fornecer novas funcionalidades a novos consumidores, e todos os seus consumidores são consumidores diretos (sem intermediários, frameworks, etc.), então uma abordagem de ponto final discreto é a melhor escolha. Cada vez que você adiciona uma característica que arrisca uma ruptura, crie um novo ponto final, dê-lhe um novo número de versão e, em seguida, deixe os consumidores saberem para validar contra e mudar suas configurações. Esta estratégia é bastante tentada e verdadeira, mas tem as desvantagens de colocar o fardo sobre os consumidores para manterem-se atualizados. Além disso, se houver dependências entre serviços, ele pode se tornar uma tarefa rudimentar. O lado positivo é se o código quebrar não é (diretamente) sua culpa.
A outra estratégia principal é a interface extensível. Existem três variedades diferentes aqui que tenho conhecimento. Primeiro, é o tipo de interface que tenta tão bem descrever o domínio do serviço que todas as funções possíveis que você pode adicionar são de alguma forma possíveis, dada a interface existente. Se isso parecer difícil, é. Você pode chamar isso de interface perfeita. Tudo é completamente descrito, mas o domínio inteiro também é completamente descrito. O "perfeito" é realmente apenas em papel.
A segunda variedade é o tipo que parece uma interface normal, mas adiciona pontos de extensão genéricos. Em WSDLs, isso significa xs: qualquer, pares de nome-valor ou algo semelhante. Você pode chamar isso de interface básica extensível. Não é muito difícil de fazer, mas não é sem suas complicações. Os pontos de extensão podem tornar a interface mais difícil de trabalhar em certas ferramentas (xs: qualquer), ou perder explicitamente a sua capacidade de validar entradas e saídas (pares nome-valor). Também é muito fácil abusar desses pontos de extensão de uma forma que torna a versão 3 ou 4 muito difícil de usar.
A terceira variedade é o tipo que converte sua interface em um byte-stream. Você pode chamar estas interfaces Deus. Eles não estão sem suas justificativas, mas se você estiver usando um, você pode querer perguntar por que você está usando os serviços da Web. Talvez você devesse estar pensando em TCP / IP bruto, ou HTTP GET / POST básico. Mas talvez você esteja cansado da complexidade de WSDLs e XSDs e você quer começar do zero, mas você está vinculado a serviços da web por algum motivo de infraestrutura. Perceba, no entanto, que, uma vez que você inicia esse caminho, você precisará de uma maneira totalmente nova de descrever aos seus consumidores como usar / não usar seu serviço, e se você usar o XSD para isso ... bem, você está basicamente de volta onde você começou.
Sua melhor aposta é conhecer todas essas opções e abordar o design do seu serviço tentando pela primeira vez a "interface perfeita", desistindo e adicionando pontos genéricos de extensibilidade. Tentando projetar a interface perfeita, irá forçá-lo a aprender coisas que melhorarão o seu serviço, não apenas a sua interface, mas isso levará tempo e, se você não limitar esse tempo de alguma forma, isso levará uma eternidade.
Um pouquinho de uma verdadeira interface de deus, existe a interface do wrapper. Se você possui camadas de sistema, você deseja que sua interface esteja em camadas também. Quando você muda a camada B, você só quer mudar a camada B, nem todas as instâncias na camada C.
A estratégia mais comum que eu vi é a versão do WSDL, adicionando a identificação do controle de versão (normalmente aaaa / MM [/ dd]) ao namespace de objetos no wsdl, a saber:
Isso pode ser feito em um nível per-type (types / schema) ou em todo o nível WSDL - & lt; definitions & gt; em 1.1 ou & lt; descrição & gt; em 2.0.
Um pouco datado, mas esse link do IBM Developer Works fornece o raciocínio para essa abordagem e, especificamente, quando as versões precisam ser incrementadas:
Versões compatíveis com versões anteriores / não-rompentes:
Removendo ou renomeando operações Alterando parâmetros para um método Mudando um tipo complexo.
Eu geralmente adiciono a seqüência de versão ao URL do serviço da web, me dando "pontos de extremidade versionados". O código que implementa esses pontos finais pode ser compartilhado, se as diferenças são triviais e podem ser tratadas pelo mesmo código, ou o código pode ser clonado ou em algum lugar intermediário.
Os diferentes pontos de extremidade controlados também podem usar os esquemas XML versionados, se for isso que você precisa.
Uma das possibilidades é projetar todas as operações do serviço web para ter apenas um parâmetro de um tipo que herda de algum tipo abstrato que contenha o número da versão. Esta abordagem é implementada pela plataforma de serviços da Web eBay. Algo como o seguinte:
Além disso, se você trabalha em http, talvez seja necessário adicionar a versão como um parâmetro http GET para o URL do ponto final do serviço web, para que você possa detectar a versão solicitada facilmente servidor / serviço? Versão = 1.
Adicione o "número da versão da API" como parâmetro em todas as APIs, em seguida, implemente o padrão de estratégia no seu código de serviço da web, onde o número da versão determina a estratégia a ser usada.
Serviço de web de estratégia de versão
Obter através da App Store Leia esta publicação em nosso aplicativo!
Estratégias para atualização ou versão de serviços da Web?
Estou interessado em ouvir as melhores práticas sobre como as diferentes versões dos serviços da Web são tratadas.
Para esclarecer, se você tiver alguns métodos da Web expostos como um serviço da Web, então você deseja adicionar uma característica / funcionalidade e, assim, alterar a assinatura dessas chamadas de método, como você lida com isso de uma maneira que não quebra tudo dos seus clientes que atualmente chamam de serviço?
Você implanta o serviço em um URL diferente?
Você coloca uma versão no próprio nome do método (MyMethod, MyMethodv2 etc. - ugh ..)
Você passa uma versão como parte da chamada do método junto com uma lista de parâmetros?
Alguém sabe como o Google ou o Amazon lidam com esse cenário com sua extensa biblioteca de serviços da Web?
EDIT: Até agora, encontrei algumas informações boas neste artigo da Oracle. Também esta entrada de blog em alguns detalhes do Java foi útil. Ainda estou curioso para ver algumas das outras abordagens.
A maneira típica de versionar um serviço da Web é ter clientes especificando a versão desejada. Você pode permitir restrições simples, como "> 2.0", "& lt; 1.5", ou "= 1.1". Naturalmente, você deseja minimizar o número de versões suportadas para sua própria sanidade. Se um cliente não especificar uma versão, você assume o mais recente.
As técnicas para fornecer a versão variam. Alguns defendem o uso do URL, outros encorajam cabeçalhos, alguns podem incluí-lo como um parâmetro da chamada api. Quase nenhum mudaria o nome do método, no entanto. Isso é equivalente ao "pacote" ou "namespace" que controla o link do OSGi. Isso tornará a atualização muito difícil e impedirá as pessoas de atualizar mais do que quaisquer alterações ao serviço real.
Também depende da forma como você acessa seus serviços na web. Se você estiver usando o REST, manter o URL limpo e usando cabeçalhos faz mais sentido (e seria trivial cortá-lo como um parâmetro de consulta, se necessário). Se você estiver usando SOAP / XMLRPC / o que for, o RPC, então, colocá-lo no URL geralmente é bom.
Como o cliente especifica a versão geralmente é bastante fácil. O que é mais complicado é como você executa todas as versões simultaneamente. A maioria dos idiomas não tem uma maneira de carregar várias versões da mesma biblioteca / módulo / classe / função no mesmo ambiente de tempo de execução (seja uma VM, processo ou o que você tem). O link OSGi fornecido é a solução de Java para permitir isso.
Na prática, a OSGi será superada para a maioria das situações. Normalmente, é mais fácil enviar solicitações obsoletas para outro servidor ou processo.
A melhor maneira de "versão" de seus serviços, no entanto, é criar extensibilidade e flexibilidade para eles, de modo que permaneçam compatíveis e compatíveis. Isso não significa que todas as versões devem ser compatíveis entre si, mas as versões consecutivas devem ser compatíveis entre si.
Posso dizer-lhe que a solução de criar doAPIFunction, doAPIFunctionV2 e doAPIFunctionV3, etc, produziu apenas dores de cabeça no local em que trabalho. Adicione a isso a falta de nomes de funções claramente descritivos significa todo tipo de loucura.
Você quer nomes claros da função da API e, se uma api estiver mudando, o objetivo seria tentar fazê-lo de forma compatível com versões anteriores. Eu sugeriria a versão de seus pontos de entrada para que cada ponto de entrada ofereça suporte a API e doFunction estáveis em example. org/api-1.0/ pode ser diferente de example. org/api-2.0 se existisse uma boa razão para mudar a semântica.
Não tenho certeza se eu entendi sua pergunta corretamente. Mas meus 2 centavos. Se a assinatura do método muda como outro novo parâmetro, por que não pode ser feito opcional? Mas se um tipo de dados de parâmetro existente for alterado, não será aplicável.
Vote para isso se está errado. :)
Ele costumava ser mais simples quando você poderia ter o mesmo nome do método de serviço na web, e diferentes parâmetros, há anos. :)
Uma vez que você escreve um serviço na web, você está fazendo um contrato com os clientes que é isso que você apoiará.
Para métodos mais antigos, sugiro iniciar sessão para ver se eles estão sendo usados e por quem, para ver se você pode fazê-los atualizar.
Além disso, é melhor você simplesmente escrever um novo método, então você pode ter vários nomes de funções similares que diferem por uma versão.
O problema com a passagem de um número de versão é que você deve garantir que os clientes sempre passem num número válido, o que, se você gerar os talões, funcionará, mas, se não o fizer, isso é muito frágil.
Colocar um número de versão no nome parece funcionar melhor para mim, pois torna óbvio o que é antigo e você pode usar o AOP para registrar mais facilmente versões antigas dos métodos de serviço na web.
Versão de serviços da Web.
por Gabriel Bechara.
Introdução.
Os serviços da Web são obrigados a mudar e evoluir ao longo do tempo. Os princípios de acoplamento solto da arquitetura orientada a serviços (SOA) implicam que os provedores de serviços podem lançar uma nova versão de um serviço compartilhado sem esperar que os consumidores se adaptem e que os consumidores do serviço devem testar e certificar em uma nova versão do serviço compartilhado antes de mudar. Consequentemente, talvez seja necessário que várias versões de um serviço compartilhado sejam executadas ao mesmo tempo e simultaneamente acessíveis por diferentes consumidores de serviços. Alguns consumidores de serviços podem precisar continuar usando uma versão antiga de um serviço até a migração do código do consumidor ocorrer. Portanto, o controle de serviços da Web é um assunto importante que deve ser considerado cuidadosamente em todas as abordagens SOA da empresa.
Os padrões atuais para serviços da Web não possuem suporte explícito para versões, exigindo arquitetos e desenvolvedores para resolver o problema através da aplicação de padrões. Este artigo:
Identifique os tipos de mudanças que podem ocorrer nos serviços.
No final deste artigo, você deve ter uma boa compreensão dos principais aspectos que devem ser tratados ao construir sua própria estratégia de controle de serviços da empresa.
Tipos de mudanças.
Uma mudança na implementação de um serviço da Web pode afetar seus consumidores, dependendo de vários fatores:
Uma alteração nos parâmetros de operação de um serviço da Web. Isso pode envolver a adição de novos parâmetros (isso afetará os consumidores atuais) ou uma alteração nos parâmetros existentes, como uma alteração em um documento XML que pode ser usado como um parâmetro de mensagem em um serviço da Web. As alterações em um documento XML podem envolver a adição de elementos ou atributos opcionais (isso pode afetar os consumidores atuais) ou de elementos obrigatórios (isso afetará os consumidores atuais).
Portanto, uma tipologia de mudanças nos serviços da Web pode ser criada em relação ao impacto nos consumidores atuais desses serviços. Uma abordagem é qualificar uma mudança que não afetará os consumidores atuais como uma versão menor e uma mudança que afetará os consumidores atuais como uma versão importante.
Menor lançamento.
Uma versão menor pode ser um dos dois tipos. A primeira é uma correção de um bug ou um aprimoramento de desempenho. Esse tipo não afetará o WSDL (Web Services Description Language) do serviço da Web. O segundo tipo consiste em adicionar novos métodos a um serviço da Web, onde o WSDL é alterado sem impacto nos consumidores de serviços. Uma distinção pode ser feita entre esses dois tipos ao rotular essas versões. Por exemplo, para o primeiro tipo, você pode alterar a segunda casa decimal do número da versão (1.0X), enquanto que para o segundo tipo você altera a primeira casa decimal do número da versão (1.Y0).
Major Release.
Um lançamento importante envolve uma mudança que quebrará a compatibilidade com versões anteriores. Neste caso, os consumidores devem ser modificados. Um lançamento que afeta somente as funcionalidades de um serviço da Web, sem afetar o WSDL, também é considerado uma versão importante. Isso ocorre porque os consumidores atuais não podem invocar a nova versão sem considerar as funcionalidades modificadas do serviço da Web. Agora que identificamos os vários tipos de mudanças e seu impacto nos consumidores atuais, vamos dar uma olhada em padrões diferentes para o controle de versão de serviços da Web.
Os padrões.
Padrão de consolidação do consumidor.
Quando uma nova versão de um serviço da Web é lançada - seja uma versão maior ou menor - os consumidores são notificados sobre a mudança e são responsáveis por mudar o código para acessar a nova versão. O novo WSDL é publicado - em um registro UDDI, por exemplo - e uma notificação é enviada aos consumidores para que eles possam encontrar o novo serviço e estabelecer vinculação com o novo provedor de serviços. Uma prática para usar um registro UDDI envolve a associação de uma determinada versão de um tipo de porta a um tModel exclusivo. Um WSDL está associado a um tModel. Este tModel deve conter uma referência ao número da versão para uma versão principal porque duas versões principais implicarão dois WSDLs diferentes. O tModel pode conter uma referência à versão secundária se duas versões menores precisam ser acessadas ao mesmo tempo. Um consumidor desse portType / version poderia fazer uma pesquisa UDDI de páginas verdes para serviços que anunciam conformidade associando-se ao tModel da versão correspondente.
Este método pode impor mudanças no código do consumidor, pelo menos na pesquisa realizada no registro para acessar uma versão (maior ou menor) de um serviço, mesmo para lançamentos menores. E se você precisar ter duas versões menores executando ao mesmo tempo? Por exemplo, você pode querer implantar uma nova versão menor em um site de teste para ser usada por um número limitado de consumidores, mantendo a versão antiga para o resto. Os consumidores do serviço implantado no site de teste precisarão mudar o ponto final do serviço, mesmo que o WSDL não seja modificado (porque é uma versão menor). Neste caso específico, pode ser útil ter uma camada de indireção entre os consumidores e os provedores, para impulsionar a migração de diferentes consumidores de forma graciosa.
Figura 1. Padrão de ligação ao consumidor.
Nota: O padrão de vinculação do consumidor não implica o uso de UDDI; refere-se ao fato de que a decisão vinculativa é feita pelo lado do consumidor. Vamos discutir os usos interessantes deste padrão em um momento.
Padrão de camada de indutor.
Quando uma nova versão menor de um serviço da Web é lançada, o consumidor pode migrar de forma transparente para a nova versão. Essa capacidade é fornecida pela camada de indireção através de um mecanismo de roteamento que garante roteamento baseado em conteúdo ou roteamento baseado em usuário (com base no IP do solicitante, por exemplo, ou no principal do solicitante na propagação de funções de segurança) para chamar as diferentes versões de um serviço da Web.
O uso de uma camada de indireção permite que duas liberações menores coexistam sem alterar o código dos consumidores e ajuda a garantir uma migração graciosa para uma nova versão.
Figura 2. Camada do Padrão de Indireccional.
Mas no caso de uma versão importante, os consumidores precisarão mudar seu código. E se, por algum motivo organizacional, precisamos migrar para uma nova versão importante sem alterar o código atual dos consumidores, chamando o novo serviço com o cliente antigo? Isso pode acontecer se, por exemplo, algum motivo regulatório implique uma mudança acessível apenas através do uso da nova versão principal de um serviço, fornecida por um parceiro comercial externo à sua organização. Isso leva a usar um adaptador para permitir o uso de uma nova versão principal para consumidores atuais até que todo o código dos consumidores seja modificado.
Padrão do Adaptador.
O padrão do adaptador consiste em adaptar a solicitação e a resposta do cliente para poder consumir uma nova versão importante de um serviço. O uso deste padrão oferece uma migração mais suave, no caso de o uso de uma nova versão principal de um serviço ser obrigatório por algum motivo comercial, regulamentar ou organizacional.
Figura 3. Padrão do Adaptador.
Soluções para a aplicação dos padrões.
Os diferentes padrões podem ser aplicados de diferentes maneiras. Isso pode ser feito no código dos consumidores, mas isso raramente é o caso porque pode causar atrasos de codificação e aumentar a complexidade do código que gerencia o controle de versão. Uma alternativa é usar uma camada de mediação para desacoplar o consumidor do provedor e aplicar esses padrões na camada de mediação. O uso do Oracle Service Bus como camada de mediação fornecerá as funcionalidades do padrão Layer of Indirection associado ao Pattern Adapter, aliviando o código dos consumidores dessas preocupações. Veja a Figura 4.
Figura 4. Aplicando os padrões usando o Oracle Service Bus.
A utilização desta abordagem baseada no Oracle Service Bus oferece estas vantagens:
Uma mudança de lançamento menor pode ser abordada sem modificar os consumidores, e os sites de teste podem ser abordados através de roteamento baseado em conteúdo ou baseado em usuário.
A mediação no Oracle Service Bus é configurada principalmente usando proxies para acessar serviços empresariais. No meio há pipelines, consistindo em estágios, ações, ramos e nós de roteamento. A mensagem é adaptada dentro dessas encanamentos, roteando as solicitações nos nós de roteamento. A configuração dos proxies e dos serviços empresariais pode ser organizada com referência aos números de versão. Os proxies no Oracle Service Bus podem incluir no seu caminho uma referência ao lançamento principal e o serviço comercial pode incluir a versão maior e menor. Por exemplo, para um importante v1.XX, teremos um proxy, um ou mais serviços empresariais (um por lançamento menor) e um WSDL:
. e para o V2.XX principal:
Nota: Como os proxies eo WSDL são os mesmos para versões menores, o caminho que contém esses não precisa incluir uma referência à versão menor.
Nós abordamos o acesso a diferentes serviços através do Oracle Service Bus. Mas há outras questões a serem tratadas, como a implantação de duas versões diferentes de um provedor de serviços provenientes do mesmo ambiente de desenvolvimento. Esses serviços podem ter o mesmo caminho de contexto do módulo da Web Java Platform, Enterprise Edition (Java EE), porque eles podem ter sido desenvolvidos usando as mesmas ferramentas de desenvolvimento. Portanto, a menos que você forneça um script de compilação que adicione referência de versão no contexto do módulo Java EE Web, você pode querer considerar a implantação de diferentes versões do mesmo serviço em diferentes destinos. (Um alvo é um cluster ou um servidor gerenciado). Veja a Figura 5.
Figura 5. Implantando fornecedores de serviços em diferentes destinos.
Nota: algumas estruturas e ferramentas de desenvolvimento, incluindo o Oracle JDeveloper, automatizam a versão de alguns provedores de serviços. Essa capacidade foi estendida no Oracle JDeveloper 11 Technical Preview 4 para lidar com a versão de componentes de arquitetura de componentes de serviço (SCA) (vários serviços em um composto).
Serviços de apresentação e serviços de orquestração (serviços de processos de negócios) beneficiarão da transparência desta abordagem ao consumir outros serviços pertencentes à camada de serviços empresariais ou à camada de serviços de acesso a dados. Mas e os consumidores de serviços de apresentação? Um portal composto pode consumir serviços de apresentação usando Web Services para Portlets Remotos (WSRP) para consumir portlets remotos. O padrão Layer of Indirection, juntamente com o Adapter Pattern usando o Oracle Service Bus, também pode ser aplicado neste caso, mas podemos usar uma abordagem mais adaptada com base nas capacidades do portal. Os portais geralmente vêm com ferramentas de administração para configurar o acesso a portlets (serviços de apresentação reutilizáveis). O uso das regras e direitos baseados em funções dos usuários para exibir alguma parte do portal composto, dependendo das propriedades do usuário, pode ser mais apropriado para os serviços de apresentação. Isso é mais uma preocupação com um mecanismo de portal composto do que com o Oracle Service Bus.
Portanto, o controle de camada de serviços de apresentação é melhor acomodado usando o padrão de consolidação do consumidor. Nesse contexto, o padrão não é aplicado usando um registro UDDI para escolher o serviço. Neste caso, a aplicação deste padrão depende dos direitos ou do mecanismo de personalização fornecido pelo portal composto. Um aspecto importante deste uso específico deste padrão é que a escolha da versão é feita através da configuração, na ferramenta de administração do portal. Assim, não implicará qualquer modificação ou manutenção de código.
A figura abaixo mostra como um portal composto pode consumir portlets através do WSRP em diferentes versões do mesmo aplicativo. A seleção da versão do portlet a ser exposta é feita no mecanismo do portal composto.
Figura 6. O Padrão de Encadernação do Consumidor aplicado aos serviços de apresentação.
Isso permite que duas versões do mesmo aplicativo sejam executadas simultaneamente, expondo novas funcionalidades somente para usuários finais selecionados com base em atributos de perfil de usuário.
Conclusão.
O controle de versão dos serviços da Web pode ser gerenciado de várias maneiras, dependendo das restrições comerciais e da camada a que o serviço pertence. Neste artigo, abordamos práticas que podem ser aplicadas a uma variedade de tarefas de controle de versão:
Acessando e implantando várias versões de um provedor de serviços ao mesmo tempo.
Alguns fatores adicionais devem ser levados em consideração, incluindo o controle de XML Schemas e o gerenciamento de dependências entre serviços e os esquemas XML usados por esses serviços. No nível organizacional, isso se tornará muito difícil de lidar sem as ferramentas adequadas para gerenciar dependências e para dirigir as mudanças de forma adequada e holística.
Gabriel Bechara trabalhou com pré-vendas e serviços de consultoria Oracle-BEA desde 2003. Um veterano de 15 anos da indústria de software, Gabriel atuou como arquiteto e assessor em grandes projetos, proporcionando experiência prática e feedback sobre conceitos que podem constituir uma base para construindo novos sistemas de informação. Seus interesses incluem metodologias para a definição de software e arquiteturas empresariais, com foco em integração empresarial e SOA.
Serviço de web de estratégia de versão
Expo Microservices: artigo.
Estratégias de design para a versão de serviços da Web.
Adaptando-se às necessidades do negócio.
O controle de versão do aplicativo sempre foi um desafio para a comunidade de desenvolvedores. Com a introdução dos serviços da Web, essa questão torna-se ainda mais difícil, pois os desenvolvedores estão lidando com um conjunto de componentes mais distribuídos que não estão necessariamente sob seu controle.
É necessária uma estratégia de controle de versão robusta para suportar múltiplas versões de serviços da Web em desenvolvimento. Isso pode permitir que atualizações e melhorias sejam feitas em um serviço da Web, ao mesmo tempo em que suporta continuamente as versões lançadas anteriormente. A estratégia de versão correta pode maximizar a reutilização de código e fornecer uma abordagem mais gerenciável para a nomeação, implantação e manutenção de seus serviços da Web.
A questão do controle de versão é complicada, e este artigo não tenta responder a todas as questões relacionadas à versão de XML e serviços da Web. No entanto, existem algumas abordagens chave e práticas de design que foram úteis em nosso desenvolvimento que compartilharemos com você aqui. A abordagem que vamos tomar é começar no nível de componente (XML Schemas) e trabalhar com abstrações de nível de serviço mais altas, incluindo arquiteturas baseadas em fachadas e orientadas a serviços (SOA). Ao longo do caminho, esperamos transmitir algumas boas práticas importantes que podem ser aplicadas para incorporar técnicas de controle de versão em vários níveis do projeto.
Comecemos por analisar a importância dos esquemas XML.
A Importância dos Esquemas XML no Versioning.
O controle de versão para serviços da Web deve primeiro considerar como os esquemas XML que estão sendo usados são versionados. Uma série de abordagens podem ser tomadas para a versão XML Schemas, incluindo o uso de um atributo de versão de esquema, alterando a localização física do esquema e alavancando Namespaces XML.
Os Namespaces XML fornecem um mecanismo de escopo para XML, onde os elementos definidos nesse espaço de nomes podem ser identificados de forma exclusiva. Namespaces geralmente são usados para reduzir colisões de nomes entre esquemas, mas também podem ser usados como um mecanismo de controle de versão. Aqui está um exemplo simples que mostra como Namespaces podem ser usados para versões:
Um serviço da Web referenciando um esquema de versão seria necessário para ter conhecimento da versão, porque ele foi construído no targetNamespace. O benefício desta abordagem é que, uma vez que o TargetNamespace seja atualizado, todos os clientes que fazem referência são necessários para fazer algo. Isto aplica automaticamente um nível de controle de versão, exigindo alguma ação por parte do cliente.
A desvantagem dessa abordagem é que qualquer alteração incremental exigiria que o cliente também mudasse. Claramente, uma alteração não compatível, como a remoção de uma operação WSDL que está sendo usada pelo cliente, requer modificação do cliente. Mas, uma alteração, como a adição de um atributo opcional ao esquema, ainda seria compatível com o código existente. Uma questão-chave que deve ser abordada no seu projeto é: quais mudanças devem constituir uma nova versão de serviços da Web? Se você tomar a abordagem de que qualquer alteração resulte em um novo Espaço de nome, isso colocará um grande fardo para os desenvolvedores usando os esquemas.
Uma solução híbrida proposta é usar uma combinação de Namespace e IDs de versão. O targetNamespace só seria atualizado para alterações não compatíveis. Para qualquer alteração incremental e compatível, o atributo ID da versão pode ser usado para identificar a nova revisão. A seguinte abordagem pode reduzir significativamente a quantidade de manutenção exigida pelo desenvolvedor quando as novas versões de um serviço da Web são lançadas.
A compatibilidade de versão pode ser uma coisa muito difícil de determinar. Sem ferramentas de desenvolvimento robustas disponíveis para isso, é responsabilidade da equipe de desenvolvimento determinar se uma nova versão mantém a compatibilidade. Nesta seção, apresentamos uma série de abordagens para os XML Schemas de versão. Se você estiver considerando o controle de versão neste nível de sua arquitetura, recomendamos o uso de namespaces XML em uma capacidade limitada para indicar atualizações de versão principais para o XML. Mas é uma boa prática testar completamente seus serviços para verificar a compatibilidade da versão.
Convenções de nomeação para versão.
Ter um nome para cada lançamento de um serviço da Web é essencial para simplificar o gerenciamento dos lançamentos. A estratégia de nomeação deve facilitar o reconhecimento de múltiplas versões de um serviço da Web, incluindo interfaces existentes e novas. Diferentes estratégias podem ser implementadas aqui, incluindo o uso de uma estratégia de nomeação seqüencial ou selos de data.
Quando você está seqüencialmente nomeando sua versão, você pode usar uma convenção de "vMajor #.Minor # / SERVICE_NAME, onde Major # é o lançamento principal da versão e Menor # é a versão do número menor. Uma versão importante provavelmente exigiria uma mudança na código do cliente para usar a nova versão, enquanto uma versão menor tentaria manter a compatibilidade com o cliente. Uma versão menor poderia constituir uma modificação em um serviço da Web que afetaria apenas o sistema interno.
O nome do método padrão para um serviço da Web tem "_v # _ #" anexado ao final do seu nome. Assim, para o serviço getProductCatalog, podemos definir a operação como "getProductCatalog_v1_1". Ou, se você estiver aplicando isso em namespaces XML, pode parecer:
Outra maneira de nomear versões é usar selos de data como parte do namespace. A data ajuda a determinar o seqüenciamento da versão. Esta convenção de nomenclatura não mostra uma versão maior ou menor. Veja como isso pode parecer na nossa definição do esquema:
O importante a lembrar é que não há uma solução melhor na forma como você nomeia as versões. Sua abordagem dependerá da estratégia de implantação que você usa e dos requisitos específicos que seus clientes possam ter para distinguir as versões e manter a compatibilidade.
Também deve ser evidente que essas técnicas podem tornar-se muito incontroláveis se você tiver que aplicá-las a cada componente em seu projeto.
Para abordar isso, vamos recorrer a algumas práticas de design importantes para a construção de serviços mais grosseiros com padrões de design e arquiteturas orientadas para serviços.
Usando fachadas de serviços da Web.
À medida que as organizações criam, implantam e organizam serviços da Web, torna-se evidente que um nível mais alto de controle de versão e gerenciamento é necessário. Você deve começar a pensar sobre os serviços de um nível comercial, em vez de as interfaces técnicas serem expostas. No entanto, muitas organizações que investiguem serviços da Web ainda estão olhando para eles como extensões para paradigmas orientados a objetos. Eles cometem o erro de levar seus objetos existentes e de os expor diretamente com uma interface de serviços da Web. Isso provavelmente irá fornecer serviços da Web que são finos e difíceis de usar. Também pode dificultar a incorporação de uma abordagem consistente ao controle de versão de serviços da Web.
Em vez disso, pense a partir da perspectiva do WSDL primeiro, e faça um mapa para uma implementação back-end mais tarde. Essa abordagem fornece uma arquitetura mais vinculada, minimizando dependências em implementações específicas. Você também deve procurar padrões de design, como a Fachada de serviços da Web, para auxiliar na criação de componentes de grãos grosseiros. Esse padrão tira a complexidade das interfaces que estão sendo expostas. Ao invés de ter vários pontos de interface para uma coleção de serviços, os serviços Web compostos podem ser projetados com interfaces de negócios mais simples e bem compreendidas.
Como mostra a Figura 1, a fachada pode ser usada para simplificar as etapas necessárias para colocar uma solicitação de ordem de mudança. Embora essa imagem mostre que a fachada usada da perspectiva do fornecedor, um consumidor também poderia projetar fachadas para simplificar o acesso aos serviços.
O uso deste padrão pode oferecer uma série de benefícios, incluindo a minimização do nível de acoplamento entre consumidor e serviço, criando um ponto de controle para gerenciabilidade e melhorando o desempenho geral, reduzindo o número de chamadas de rede. O padrão de fachada também pode fornecer uma estrutura para gerenciar a complexidade inerente ao suporte de várias versões de serviços da Web simultaneamente.
Uma implementação deste padrão, mostrada na Figura 2, cria níveis de abstração, separando o código em três níveis distintos de classes: classes de manipuladores de solicitação, classes de fluxo de negócios de fachada e classes de objeto de negócios.
A classe de gerenciamento, a classe de fachada da sessão, é responsável por encadear as classes menores de objeto comercial. Cada classe de objeto de negócios contém uma subunidade de lógica de processamento e o encadeamento de todas essas classes de objetos de negócios fornece a lógica de negócios principal. Cada classe de fachada de sessão, por si só, não contém lógica de processamento, mas, ao concatenar objetos comerciais juntos, implementa a lógica de negócios desejada.
Essa arquitetura desacopla os processos uns dos outros, permitindo a reutilização de componentes. Também ajuda a gerenciar a complexidade dos serviços da Web à medida que as necessidades de negócios mudam em diferentes versões do serviço. Processos alavancados para executar os requisitos de negócios são abstraídos em partes individuais de código de software que um gerenciamento de cadeias de classes se juntam para executar em seqüência. Ao encadear esses pedaços de código juntos, os processos de negócios necessários são implementados para aderir a um fluxo de processo comercial específico. Assim, criando várias classes de gerenciamento, diferentes fluxos de negócios podem ser implementados e mantidos simultaneamente.
Importância das arquiteturas orientadas a serviços.
O design de serviços de grãos grosseiros é um aspecto importante de uma estratégia de controle de versão, simplificando as interfaces do cliente e maximizando a reutilização. Projetar fachadas no nível de implementação pode ajudar, mas ainda requer uma mudança significativa na infra-estrutura subjacente em vários níveis que alguém precisa lidar. O que realmente é necessário é uma plataforma baseada em SOA que pode auxiliar no gerenciamento de todo o ciclo de vida dos serviços da Web.
Uma abordagem baseada em SOA oferece componentes de software como uma coleção de serviços comerciais distribuídos. Um serviço de negócios desempenha o papel de uma única entidade que representa um aplicativo de negócios e pode incluir vários recursos de TI, plataformas e componentes. O modelo, simplificado na Figura 3, separa as funções de consumidor, provedor e registro. Um provedor registra os serviços disponíveis em um registro que o consumidor pode mais tarde descobrir e invocar. Os consumidores não estão diretamente conscientes de um ponto final de serviço específico ou os detalhes de implementação. A SOA oferece um maior grau de separação entre o provedor eo consumidor, e como mudanças são feitas para um serviço, a SOA pode ajudar a minimizar o impacto no consumidor.
Uma SOA geralmente requer algum tipo de estrutura ou plataforma que possa atuar como intermediário entre provedores e consumidores. Sem este intermediário no local, os consumidores teriam que construir uma integração mais fortemente acoplada com um ponto de extremidade do serviço. Esse intermediário poderia ser implementado como um proxy, um gateway ou um corretor, lidando com problemas como segurança, roteamento, gerenciamento de SLA e gerenciamento de ciclo de vida.
Os recursos de gerenciamento do ciclo de vida oferecidos pela plataforma são fundamentais para nossa discussão sobre o controle de versão. Algumas plataformas de gerenciamento de serviços da Web e SOA no mercado hoje oferecem suporte para o gerenciamento do ciclo de vida. Isso pode incluir: A capacidade de lidar com várias versões de um serviço ao mesmo tempo Desativar ou retirar serviços de forma graciosa Solicitações de roteamento para o ponto final do serviço apropriado com base em uma solicitação Transformando solicitações e respostas para manter a compatibilidade com versões anteriores (por exemplo, usando o XSLT) Implementação automatizada de novas versões sem necessidade de desligamento do sistema Gerenciando dependências que existem entre diferentes serviços da Web O gerenciamento do ciclo de vida também é muito mais do que apenas gerenciar a implantação de serviços da Web. Do ponto de vista de um serviço de negócios, o gerenciamento do ciclo de vida pode incluir muitas plataformas, servidores de aplicativos e instâncias de banco de dados. Para gerenciar verdadeiramente esse nível de serviço, você deve considerar como todos os componentes de aplicativos dependentes e elementos de infraestrutura são implantados e gerenciados.
Vejamos um exemplo que mostra um problema comum de versão. Na Figura 4, um provedor ofereceu uma versão inicial de um serviço da Web, V1.0. A plataforma encaminhou automaticamente os pedidos para este serviço para um ponto final de serviço apropriado. O roteamento pode ser determinado com base nas informações colocadas em um registro UDDI, ou o modelo de gerenciamento subjacente pode gerenciar isso (por exemplo, através de interfaces WSDM).
Em algum momento, uma segunda versão do serviço é implantada que mantém a compatibilidade com versões anteriores. Dentro da SOA, o novo serviço é identificado como suporte ao serviço de negócios original e ao novo serviço de negócios. Os pedidos feitos para o serviço de negócios original podem ser negociados para o ponto final do serviço. Os consumidores que desejam acessar a nova funcionalidade terão que fazer as mudanças programáticas apropriadas.
Essa abordagem para o controle de versão permite que uma organização de TI se adapte melhor às mudanças exigidas pelo negócio. Várias versões de um serviço podem ser mantidas simultaneamente sem impacto para o consumidor. As versões antigas podem ser aposentadas graciosamente, e os consumidores podem atualizar em seu próprio horário, ao invés de ser forçado a quando novas versões são lançadas.
Mesmo com um design sólido e uma arquitetura robusta para o controle de versão, ainda existe um fator humano que deve ser considerado neste processo. Compreender o ciclo de vida do controle de versão irá ajudá-lo a implementar novas versões e depreciar as versões antigas de forma eficaz. O primeiro passo nesse processo é o de colocar juntos um plano sólido descrevendo o ciclo de vida dos serviços da Web que são suportados. Este plano pode incluir as seguintes etapas:
1. Determine a frequência com que as versões devem ser lançadas. Ao considerar a freqüência, você deve considerar quantas versões do serviço da Web você deseja suportar em paralelo.
2. Compreenda o prazo dentro do qual você espera que os consumidores se movam para uma nova versão de um serviço. A plataforma de gerenciamento de serviços da Web pode fornecer orientação sobre o uso do serviço para determinar o tempo apropriado para eliminar as versões antigas.
3. Considere lançar um piloto ou uma versão inicial de uma nova versão. Dê aos consumidores a oportunidade de testar a compatibilidade e determinar possíveis impactos do código.
4. Aproxime o controle de serviços da Web da mesma forma em que os pacotes de software podem ser lançados. Mudanças em seu serviço, como resultado de correções de bugs, solicitações de parceiros ou atualizações de especificações, devem seguir um ciclo de liberação específico.
5. Comunique claramente a sua estratégia de controle de serviços da Web aos usuários do seu serviço da Web.
Uma vez que a estratégia de versão for apresentada para cada lançamento, você deve considerar as seguintes etapas:
1. Depois de fazer as mudanças apropriadas em seus serviços, faça testes unitários e funcionais do serviço.
2. Implemente o novo serviço através do esquema apropriado, WSDL e alterações no serviço. Esta etapa pode incluir registro em um registro UDDI ou na plataforma de serviços da Web.
3. Notificar os consumidores do seu novo serviço e pilotar as novas versões com um de seus consumidores.
4. Execute as versões novas e antigas em paralelo para o período de tempo que você alocou em seu plano de versão.
5. Notificar os consumidores do seu serviço da data em que você espera desumir versões antigas.
6. Remova versões antigas de descrições WSDL e registros UDDI para evitar que novos consumidores descubram e usem as versões antigas.
7. Remova a funcionalidade do serviço antigo e adicione a funcionalidade adequada para que os consumidores existentes sejam devidamente notificados (por exemplo, através de uma falha SOAP) que a versão antiga não é mais suportada.
Uma abordagem à implantação é mostrada na Figura 5. O calendário é mostrado nos trimestres do calendário financeiro de uma empresa. A nova versão pode ser introduzida no início de um quarto (por exemplo, Q1 de 2003). É válido por quatro trimestres e depois é o pôr-do-sol no início do primeiro trimestre de 2004. Neste caso, o consumidor do serviço poderia ter seis meses para se converter para a nova versão. Você também pode ter versões menores lançadas entre as principais versões. Esses lançamentos menores podem então ser dobrados para o serviço da Web versão 2.0 quando ele for lançado.
Este artigo apresentou uma série de considerações ao controlar os serviços da Web. Se está desenvolvendo uma abordagem de versão para esquemas ou criando um sistema de controle de versão em grande escala usando uma abordagem SOA, há alguns dos principais pontos que gostaríamos de deixar com você.
Primeiro, esperamos que seja óbvio que o controle de versão pode se tornar um pesadelo ao implantar mais e mais versões do seu serviço, especialmente se o serviço for oferecido a diferentes consumidores. O objetivo do seu projeto deve ser a criação de componentes reutilizáveis que possam ser alavancados e reutilizados nas versões que estão sendo gerenciadas. A longo prazo, isso reduzirá os custos de manutenção e implantação.
Em segundo lugar, não subestime o impacto que essas mudanças podem ter sobre o consumidor. Embora o design que você introduza pode reduzir seus custos de desenvolvimento, você também deve considerar como essas mudanças afetam o consumidor final. A compatibilidade do serviço é fundamental para isso e, se os novos serviços mantenham a compatibilidade com versões anteriores, os consumidores que desejam usar a funcionalidade existente não devem ser obrigados a mudar. A arquitetura deve fornecer um caminho fácil de migração e atualização para eles.
Terceiro, você quer se esforçar para isolar a implementação técnica e fornecer uma separação clara entre o consumidor e o provedor. Isso pode ser implementado usando padrões de design como a Fachada, ou pode exigir uma abordagem baseada em SOA. Either way, the notion of coarse-grained business services offers a more loosely coupled architecture where consumers and providers can change without impacting the other party.
The last piece of advice we could offer is to not attempt to build the entire versioning infrastructure yourself. If you look at the requirements for manageability, they include a wide range of features such as routing, transformation, versioning, and security. Leveraging a vendor offering, especially one that provides a service-oriented approach IT management, can go a long way toward offering an architecture that can truly adapt to the changing needs of the business.
Published April 5, 2004 Reads 53,759.
Direitos autorais e cópia; 2004 SYS-CON Media, Inc. — Todos os direitos reservados.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Chris Peltz.
Chris Peltz is a senior architect within HP's.
Developer Resources Organization (devresource. hp), providing technical and architectural consulting to enterprise customers in the areas of J2EE, Web services, and.
More Stories By Anjali Anagol-Subbarao.
Anjali Anagol-Subbarao works in HP's IT organization as an IT architect. She has 12 years of IT experience, the last five in Web services. Her book on J2EE Web services on BEA WebLogic was published in October 2004.
Click this link to view as XML.
ADD THIS FEED TO YOUR ONLINE NEWS READER.
Cloud Expo.
Toda a Cloud está na Cloud Expo!
Containers - Microservices - WebRTC - DevOps.
Junte-se ao Centro Javits em Nova York, NY, 6-8 de junho.
• Dados importantes | Analítica.
• Internet das Coisas.
Registrar agora!
Salve em seu "Passe de Ouro"! Ligue para 201.802.3020.
Ou clique aqui para registrar.
Envie sua proposta de fala para a próxima Cloud Expo em Nova York.
Ligue para 201.802.3021.
eventos (em) sys-con.
carmen (at) sys-con.
Todos os direitos reservados. Todas as marcas são marcas registradas da Ulitzer, Inc.
É proibida a reprodução total ou parcial de qualquer forma ou meio sem autorização expressa por escrito da Ulitzer, Inc.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Estratégias para atualização ou versão de serviços da Web?
Estou interessado em ouvir as melhores práticas sobre como as diferentes versões dos serviços da Web são tratadas.
Para esclarecer, se você tiver alguns métodos da Web expostos como um serviço da Web, então você deseja adicionar uma característica / funcionalidade e, assim, alterar a assinatura dessas chamadas de método, como você lida com isso de uma maneira que não quebra tudo dos seus clientes que atualmente chamam de serviço?
Você implanta o serviço em um URL diferente?
Você coloca uma versão no próprio nome do método (MyMethod, MyMethodv2 etc. - ugh ..)
Você passa uma versão como parte da chamada do método junto com uma lista de parâmetros?
Alguém sabe como o Google ou o Amazon lidam com esse cenário com sua extensa biblioteca de serviços da Web?
EDIT: Até agora, encontrei algumas informações boas neste artigo da Oracle. Também esta entrada de blog em alguns detalhes do Java foi útil. Ainda estou curioso para ver algumas das outras abordagens.
A maneira típica de versionar um serviço da Web é ter clientes especificando a versão desejada. Você pode permitir restrições simples, como "> 2.0", "& lt; 1.5", ou "= 1.1". Naturalmente, você deseja minimizar o número de versões suportadas para sua própria sanidade. Se um cliente não especificar uma versão, você assume o mais recente.
As técnicas para fornecer a versão variam. Alguns defendem o uso do URL, outros encorajam cabeçalhos, alguns podem incluí-lo como um parâmetro da chamada api. Quase nenhum mudaria o nome do método, no entanto. Isso é equivalente ao "pacote" ou "namespace" que controla o link do OSGi. Isso tornará a atualização muito difícil e impedirá as pessoas de atualizar mais do que quaisquer alterações ao serviço real.
Também depende da forma como você acessa seus serviços na web. Se você estiver usando o REST, manter o URL limpo e usando cabeçalhos faz mais sentido (e seria trivial cortá-lo como um parâmetro de consulta, se necessário). Se você estiver usando SOAP / XMLRPC / o que for, o RPC, então, colocá-lo no URL geralmente é bom.
Como o cliente especifica a versão geralmente é bastante fácil. O que é mais complicado é como você executa todas as versões simultaneamente. A maioria dos idiomas não tem uma maneira de carregar várias versões da mesma biblioteca / módulo / classe / função no mesmo ambiente de tempo de execução (seja uma VM, processo ou o que você tem). O link OSGi fornecido é a solução de Java para permitir isso.
Na prática, a OSGi será superada para a maioria das situações. Normalmente, é mais fácil enviar solicitações obsoletas para outro servidor ou processo.
A melhor maneira de "versão" de seus serviços, no entanto, é criar extensibilidade e flexibilidade para eles, de modo que permaneçam compatíveis e compatíveis. Isso não significa que todas as versões devem ser compatíveis entre si, mas as versões consecutivas devem ser compatíveis entre si.
Posso dizer-lhe que a solução de criar doAPIFunction, doAPIFunctionV2 e doAPIFunctionV3, etc, produziu apenas dores de cabeça no local em que trabalho. Adicione a isso a falta de nomes de funções claramente descritivos significa todo tipo de loucura.
Você quer nomes claros da função da API e, se uma api estiver mudando, o objetivo seria tentar fazê-lo de forma compatível com versões anteriores. Eu sugeriria a versão de seus pontos de entrada para que cada ponto de entrada ofereça suporte a API e doFunction estáveis em example. org/api-1.0/ pode ser diferente de example. org/api-2.0 se existisse uma boa razão para mudar a semântica.
Não tenho certeza se eu entendi sua pergunta corretamente. Mas meus 2 centavos. Se a assinatura do método muda como outro novo parâmetro, por que não pode ser feito opcional? Mas se um tipo de dados de parâmetro existente for alterado, não será aplicável.
Vote para isso se está errado. :)
Ele costumava ser mais simples quando você poderia ter o mesmo nome do método de serviço na web, e diferentes parâmetros, há anos. :)
Uma vez que você escreve um serviço na web, você está fazendo um contrato com os clientes que é isso que você apoiará.
Para métodos mais antigos, sugiro iniciar sessão para ver se eles estão sendo usados e por quem, para ver se você pode fazê-los atualizar.
Além disso, é melhor você simplesmente escrever um novo método, então você pode ter vários nomes de funções similares que diferem por uma versão.
O problema com a passagem de um número de versão é que você deve garantir que os clientes sempre passem num número válido, o que, se você gerar os talões, funcionará, mas, se não o fizer, isso é muito frágil.
Colocar um número de versão no nome parece funcionar melhor para mim, pois torna óbvio o que é antigo e você pode usar o AOP para registrar mais facilmente versões antigas dos métodos de serviço na web.
Versão de serviços da Web.
por Gabriel Bechara.
Introdução.
Os serviços da Web são obrigados a mudar e evoluir ao longo do tempo. Os princípios de acoplamento solto da arquitetura orientada a serviços (SOA) implicam que os provedores de serviços podem lançar uma nova versão de um serviço compartilhado sem esperar que os consumidores se adaptem e que os consumidores do serviço devem testar e certificar em uma nova versão do serviço compartilhado antes de mudar. Consequentemente, talvez seja necessário que várias versões de um serviço compartilhado sejam executadas ao mesmo tempo e simultaneamente acessíveis por diferentes consumidores de serviços. Alguns consumidores de serviços podem precisar continuar usando uma versão antiga de um serviço até a migração do código do consumidor ocorrer. Portanto, o controle de serviços da Web é um assunto importante que deve ser considerado cuidadosamente em todas as abordagens SOA da empresa.
Os padrões atuais para serviços da Web não possuem suporte explícito para versões, exigindo arquitetos e desenvolvedores para resolver o problema através da aplicação de padrões. Este artigo:
Identifique os tipos de mudanças que podem ocorrer nos serviços.
No final deste artigo, você deve ter uma boa compreensão dos principais aspectos que devem ser tratados ao construir sua própria estratégia de controle de serviços da empresa.
Tipos de mudanças.
Uma mudança na implementação de um serviço da Web pode afetar seus consumidores, dependendo de vários fatores:
Uma alteração nos parâmetros de operação de um serviço da Web. Isso pode envolver a adição de novos parâmetros (isso afetará os consumidores atuais) ou uma alteração nos parâmetros existentes, como uma alteração em um documento XML que pode ser usado como um parâmetro de mensagem em um serviço da Web. As alterações em um documento XML podem envolver a adição de elementos ou atributos opcionais (isso pode afetar os consumidores atuais) ou de elementos obrigatórios (isso afetará os consumidores atuais).
Portanto, uma tipologia de mudanças nos serviços da Web pode ser criada em relação ao impacto nos consumidores atuais desses serviços. Uma abordagem é qualificar uma mudança que não afetará os consumidores atuais como uma versão menor e uma mudança que afetará os consumidores atuais como uma versão importante.
Menor lançamento.
Uma versão menor pode ser um dos dois tipos. A primeira é uma correção de um bug ou um aprimoramento de desempenho. Esse tipo não afetará o WSDL (Web Services Description Language) do serviço da Web. O segundo tipo consiste em adicionar novos métodos a um serviço da Web, onde o WSDL é alterado sem impacto nos consumidores de serviços. Uma distinção pode ser feita entre esses dois tipos ao rotular essas versões. Por exemplo, para o primeiro tipo, você pode alterar a segunda casa decimal do número da versão (1.0X), enquanto que para o segundo tipo você altera a primeira casa decimal do número da versão (1.Y0).
Major Release.
Um lançamento importante envolve uma mudança que quebrará a compatibilidade com versões anteriores. Neste caso, os consumidores devem ser modificados. Um lançamento que afeta somente as funcionalidades de um serviço da Web, sem afetar o WSDL, também é considerado uma versão importante. Isso ocorre porque os consumidores atuais não podem invocar a nova versão sem considerar as funcionalidades modificadas do serviço da Web. Agora que identificamos os vários tipos de mudanças e seu impacto nos consumidores atuais, vamos dar uma olhada em padrões diferentes para o controle de versão de serviços da Web.
Os padrões.
Padrão de consolidação do consumidor.
Quando uma nova versão de um serviço da Web é lançada - seja uma versão maior ou menor - os consumidores são notificados sobre a mudança e são responsáveis por mudar o código para acessar a nova versão. O novo WSDL é publicado - em um registro UDDI, por exemplo - e uma notificação é enviada aos consumidores para que eles possam encontrar o novo serviço e estabelecer vinculação com o novo provedor de serviços. Uma prática para usar um registro UDDI envolve a associação de uma determinada versão de um tipo de porta a um tModel exclusivo. Um WSDL está associado a um tModel. Este tModel deve conter uma referência ao número da versão para uma versão principal porque duas versões principais implicarão dois WSDLs diferentes. O tModel pode conter uma referência à versão secundária se duas versões menores precisam ser acessadas ao mesmo tempo. Um consumidor desse portType / version poderia fazer uma pesquisa UDDI de páginas verdes para serviços que anunciam conformidade associando-se ao tModel da versão correspondente.
Este método pode impor mudanças no código do consumidor, pelo menos na pesquisa realizada no registro para acessar uma versão (maior ou menor) de um serviço, mesmo para lançamentos menores. E se você precisar ter duas versões menores executando ao mesmo tempo? Por exemplo, você pode querer implantar uma nova versão menor em um site de teste para ser usada por um número limitado de consumidores, mantendo a versão antiga para o resto. Os consumidores do serviço implantado no site de teste precisarão mudar o ponto final do serviço, mesmo que o WSDL não seja modificado (porque é uma versão menor). Neste caso específico, pode ser útil ter uma camada de indireção entre os consumidores e os provedores, para impulsionar a migração de diferentes consumidores de forma graciosa.
Figura 1. Padrão de ligação ao consumidor.
Nota: O padrão de vinculação do consumidor não implica o uso de UDDI; refere-se ao fato de que a decisão vinculativa é feita pelo lado do consumidor. Vamos discutir os usos interessantes deste padrão em um momento.
Padrão de camada de indutor.
Quando uma nova versão menor de um serviço da Web é lançada, o consumidor pode migrar de forma transparente para a nova versão. Essa capacidade é fornecida pela camada de indireção através de um mecanismo de roteamento que garante roteamento baseado em conteúdo ou roteamento baseado em usuário (com base no IP do solicitante, por exemplo, ou no principal do solicitante na propagação de funções de segurança) para chamar as diferentes versões de um serviço da Web.
O uso de uma camada de indireção permite que duas liberações menores coexistam sem alterar o código dos consumidores e ajuda a garantir uma migração graciosa para uma nova versão.
Figura 2. Camada do Padrão de Indireccional.
Mas no caso de uma versão importante, os consumidores precisarão mudar seu código. E se, por algum motivo organizacional, precisamos migrar para uma nova versão importante sem alterar o código atual dos consumidores, chamando o novo serviço com o cliente antigo? Isso pode acontecer se, por exemplo, algum motivo regulatório implique uma mudança acessível apenas através do uso da nova versão principal de um serviço, fornecida por um parceiro comercial externo à sua organização. Isso leva a usar um adaptador para permitir o uso de uma nova versão principal para consumidores atuais até que todo o código dos consumidores seja modificado.
Padrão do Adaptador.
O padrão do adaptador consiste em adaptar a solicitação e a resposta do cliente para poder consumir uma nova versão importante de um serviço. O uso deste padrão oferece uma migração mais suave, no caso de o uso de uma nova versão principal de um serviço ser obrigatório por algum motivo comercial, regulamentar ou organizacional.
Figura 3. Padrão do Adaptador.
Soluções para a aplicação dos padrões.
Os diferentes padrões podem ser aplicados de diferentes maneiras. Isso pode ser feito no código dos consumidores, mas isso raramente é o caso porque pode causar atrasos de codificação e aumentar a complexidade do código que gerencia o controle de versão. Uma alternativa é usar uma camada de mediação para desacoplar o consumidor do provedor e aplicar esses padrões na camada de mediação. O uso do Oracle Service Bus como camada de mediação fornecerá as funcionalidades do padrão Layer of Indirection associado ao Pattern Adapter, aliviando o código dos consumidores dessas preocupações. Veja a Figura 4.
Figura 4. Aplicando os padrões usando o Oracle Service Bus.
A utilização desta abordagem baseada no Oracle Service Bus oferece estas vantagens:
Uma mudança de lançamento menor pode ser abordada sem modificar os consumidores, e os sites de teste podem ser abordados através de roteamento baseado em conteúdo ou baseado em usuário.
A mediação no Oracle Service Bus é configurada principalmente usando proxies para acessar serviços empresariais. No meio há pipelines, consistindo em estágios, ações, ramos e nós de roteamento. A mensagem é adaptada dentro dessas encanamentos, roteando as solicitações nos nós de roteamento. A configuração dos proxies e dos serviços empresariais pode ser organizada com referência aos números de versão. Os proxies no Oracle Service Bus podem incluir no seu caminho uma referência ao lançamento principal e o serviço comercial pode incluir a versão maior e menor. Por exemplo, para um importante v1.XX, teremos um proxy, um ou mais serviços empresariais (um por lançamento menor) e um WSDL:
. e para o V2.XX principal:
Nota: Como os proxies eo WSDL são os mesmos para versões menores, o caminho que contém esses não precisa incluir uma referência à versão menor.
Nós abordamos o acesso a diferentes serviços através do Oracle Service Bus. Mas há outras questões a serem tratadas, como a implantação de duas versões diferentes de um provedor de serviços provenientes do mesmo ambiente de desenvolvimento. Esses serviços podem ter o mesmo caminho de contexto do módulo da Web Java Platform, Enterprise Edition (Java EE), porque eles podem ter sido desenvolvidos usando as mesmas ferramentas de desenvolvimento. Portanto, a menos que você forneça um script de compilação que adicione referência de versão no contexto do módulo Java EE Web, você pode querer considerar a implantação de diferentes versões do mesmo serviço em diferentes destinos. (Um alvo é um cluster ou um servidor gerenciado). Veja a Figura 5.
Figura 5. Implantando fornecedores de serviços em diferentes destinos.
Nota: algumas estruturas e ferramentas de desenvolvimento, incluindo o Oracle JDeveloper, automatizam a versão de alguns provedores de serviços. Essa capacidade foi estendida no Oracle JDeveloper 11 Technical Preview 4 para lidar com a versão de componentes de arquitetura de componentes de serviço (SCA) (vários serviços em um composto).
Serviços de apresentação e serviços de orquestração (serviços de processos de negócios) beneficiarão da transparência desta abordagem ao consumir outros serviços pertencentes à camada de serviços empresariais ou à camada de serviços de acesso a dados. Mas e os consumidores de serviços de apresentação? Um portal composto pode consumir serviços de apresentação usando Web Services para Portlets Remotos (WSRP) para consumir portlets remotos. O padrão Layer of Indirection, juntamente com o Adapter Pattern usando o Oracle Service Bus, também pode ser aplicado neste caso, mas podemos usar uma abordagem mais adaptada com base nas capacidades do portal. Os portais geralmente vêm com ferramentas de administração para configurar o acesso a portlets (serviços de apresentação reutilizáveis). O uso das regras e direitos baseados em funções dos usuários para exibir alguma parte do portal composto, dependendo das propriedades do usuário, pode ser mais apropriado para os serviços de apresentação. Isso é mais uma preocupação com um mecanismo de portal composto do que com o Oracle Service Bus.
Portanto, o controle de camada de serviços de apresentação é melhor acomodado usando o padrão de consolidação do consumidor. Nesse contexto, o padrão não é aplicado usando um registro UDDI para escolher o serviço. Neste caso, a aplicação deste padrão depende dos direitos ou do mecanismo de personalização fornecido pelo portal composto. Um aspecto importante deste uso específico deste padrão é que a escolha da versão é feita através da configuração, na ferramenta de administração do portal. Assim, não implicará qualquer modificação ou manutenção de código.
A figura abaixo mostra como um portal composto pode consumir portlets através do WSRP em diferentes versões do mesmo aplicativo. A seleção da versão do portlet a ser exposta é feita no mecanismo do portal composto.
Figura 6. O Padrão de Encadernação do Consumidor aplicado aos serviços de apresentação.
Isso permite que duas versões do mesmo aplicativo sejam executadas simultaneamente, expondo novas funcionalidades somente para usuários finais selecionados com base em atributos de perfil de usuário.
Conclusão.
O controle de versão dos serviços da Web pode ser gerenciado de várias maneiras, dependendo das restrições comerciais e da camada a que o serviço pertence. Neste artigo, abordamos práticas que podem ser aplicadas a uma variedade de tarefas de controle de versão:
Acessando e implantando várias versões de um provedor de serviços ao mesmo tempo.
Alguns fatores adicionais devem ser levados em consideração, incluindo o controle de XML Schemas e o gerenciamento de dependências entre serviços e os esquemas XML usados por esses serviços. No nível organizacional, isso se tornará muito difícil de lidar sem as ferramentas adequadas para gerenciar dependências e para dirigir as mudanças de forma adequada e holística.
Gabriel Bechara trabalhou com pré-vendas e serviços de consultoria Oracle-BEA desde 2003. Um veterano de 15 anos da indústria de software, Gabriel atuou como arquiteto e assessor em grandes projetos, proporcionando experiência prática e feedback sobre conceitos que podem constituir uma base para construindo novos sistemas de informação. Seus interesses incluem metodologias para a definição de software e arquiteturas empresariais, com foco em integração empresarial e SOA.
Комментариев нет:
Отправить комментарий