Na pilha Spring Cloud Netflix, cada microsserviço expõe seus próprios serviços na forma de uma interface HTTP; portanto, um cliente HTTP deve ser usado ao chamar um serviço remoto. Podemos usar o URLConnection nativo do JDK, o cliente HTTP da Apache, o cliente HTTP assíncrono da Netty e o Resttemplate da Spring. No entanto, a coisa mais conveniente e elegante a ser fingida.
Introdução ao Feign
Feign é um cliente http declarativo e modificado. Usando o FEIGN no Spring Cloud, podemos obter a mesma experiência de codificação que chama os métodos locais ao solicitar serviços remotos usando HTTP. O desenvolvedor não pode perceber completamente que esse é um método remoto, nem pode ser visto que essa é uma solicitação HTTP. por exemplo:
@AutowiredPrivate AdvergroPremoTerService Service; // Serviço remoto public anunciougvo foo (grupo inteiro) {return Service.findbygroupId (groupID); // Ligue para o serviço remoto via http} Os desenvolvedores podem concluir o processo de envio de solicitações HTTP, decodificando retorna HTTP e encapsulando -as em objetos através service.findByGroupId() .
Definição de Feign
Para que Feign saiba qual endereço enviar uma solicitação ao ligar para um método e a quais parâmetros receber para a solicitação, precisamos definir uma interface:
@FeignClient (name = "ea") // [a] interface pública anúncios publicGrouPremoteService {@RequestMapping (value = "/group/{groupId}", método = requestmethod.get) // [b] advergroupVo findbygroupid (@PathVariable ("grupo") integro) "/group/{groupId}", método = requestmethod.put) void update (@pathvariable ("groupId") integer groupId, @requestparam ("groupName") string groupName)R: @FeignClient é usado para notificar os componentes FEIGN para proxy a interface (não é necessário gravar uma implementação de interface), e o usuário pode injetar -o diretamente através do @Autowired.
B: @RequestMapp significa que, ao chamar esse método, você precisa enviar uma solicitação GET para /group/{groupId} .
C: @PathVariable tem o mesmo significado que a anotação correspondente no SpringMVC.
Quando o aplicativo Spring Cloud for iniciado, o Feign digitalizará a interface marcada com a anotação @FeignClient, gera um proxy e o registrará no contêiner de mola. Ao gerar um proxy, o Feign criará um objeto RequetTemplate para cada método de interface. Este objeto encapsula todas as informações necessárias para solicitações HTTP. O nome do parâmetro de solicitação, o método de solicitação e outras informações são determinadas neste processo. A modelo de Feign é refletida aqui.
Neste exemplo, usamos o Feign em combinação com Eureka e Ribbon ,@FeignClient(name = "ea") significa notificar o Feign para consultar Eureka para um serviço chamado EA ao chamar esse método de interface, para obter o URL de serviço.
Codificador, decodificador e errdordecoder de Feign
O processo de Feign de serializar o objeto do parâmetro do método na assinatura do método nos parâmetros de solicitação e colocá -lo em uma solicitação HTTP é concluído pelo codificador (codificador). Da mesma forma, os dados de resposta HTTP dessertantes nos objetos Java é feita por um decodificador (decodificador).
Por padrão, o FEIGN converterá parâmetros marcados com a anotação @RequestParam em strings e os adicionará ao URL, e converter parâmetros sem anotações em JSON através de Jackson para colocá -los no corpo da solicitação. Observe que, se o método no @RequetMapping especificar o método de solicitação como postagem, todos os parâmetros não serem ignorados, por exemplo:
@RequestMapping (value = "/group/{groupId}", método = requestMethod.get) void update (@pathvariable ("groupId") integer groupID, @requestparam ("groupName") string groupName, dataObject obj);No momento, como a solicitação GET não possui órgão de solicitação, o parâmetro OBJ será ignorado.
No ambiente da nuvem de primavera, o codificador do Feign* será usado apenas para codificar parâmetros que não foram adicionados à anotação. Se você personalizar o codificador, seu codificador só será chamado ao codificar o parâmetro OBJ. Para o decodificador, os delegados padrão da classe Mappingjackson2httpmessageConverter no SpringMVC para decodificar. O ErrordeCoder será chamado apenas quando o código de status não estiver entre 200 e 300. A função do ErrorDecoder é retornar uma exceção com base nas informações de resposta HTTP, que podem ser capturadas onde a interface Feign é chamada. Atualmente, estamos usando o ErrorDecoder para fazer com que a interface Feign lançasse uma exceção de negócios para o chamador lidar.
Cliente HTTP da Feign
Por padrão, o Feign usa o JDK Native UrlConnection para enviar solicitações HTTP. Não há pool de conexão, mas uma conexão longa será mantida para cada endereço, ou seja, a conexão de persistência do HTTP é usada. Podemos substituir o cliente HTTP original da Feign pelo cliente HTTP da Apache, obtendo assim os recursos de controle intimamente relacionados ao desempenho como pools de conexão, tempo limite, etc. A Cloud Spring suporta essa substituição desde a versão Brixtion.sr5, declara primeiro o projeto HTTP e feign-httpclient Dependências no projeto:
<!-Substitua o nativo httpclient por apache httpclient-> <pendency> <puperid> org.apache.httpcomponents </groupiD> <TRARFACTID> httpclient </artifactId> </dependency> <proupid> com.netfix.feigid </GrupoIdid> <versão> $ {Feign-httpClient} </versão> </dependency>Em seguida, adicione o aplicativo.properties:
Feign.httpclient.enabled = true
Resumir
Através da Feign, podemos tornar as chamadas remotas HTTP completamente transparentes para os desenvolvedores e obter uma experiência de codificação consistente com os métodos locais. Isso é semelhante à maneira como os serviços remotos são expostos no Alibaba Dubbo. A diferença é que o Dubbo é baseado em um protocolo binário privado, enquanto o Feign é essencialmente um cliente HTTP. Se você estiver usando o Spring Cloud Netflix para criar microsserviços, o Feign é sem dúvida a melhor opção.
O acima é o método (recomendado) para usar o Spring Cloud Feign como um cliente HTTP para chamar os Serviços HTTP remotos (recomendados). Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!