Introdução
O Spring Cloud fornece à biblioteca Hystrix tolerante a falhas para implementar uma estratégia de rebaixamento para métodos configurados com disjuntores quando o serviço estiver indisponível e chama temporariamente os métodos alternativos. Este artigo criará um microsserviço de produto, registrará o Centro de Registro de Serviços Eureka e, em seguida, usamos a API de acesso/produtos do Web Client para obter a lista de produtos e, quando o serviço de produto falhar, o método local de espera é chamado para rebaixar, mas fornecerá o serviço normalmente.
Ambiente básico
Git: código -fonte do projeto
Adicionar serviços de produto
Crie um novo projeto Maven em Intellij, usando a seguinte configuração
Em seguida, adicione o seguinte código em pom.xml:
<? xml versão = "1.0" coding = "utf-8"?> <Projeto xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.ww3.org/2001/xmlschaMance xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/Maven-4.0.0.xsd"> <modelVersion> 4.0.0 </Groupversion> <pursion> cn.zxuQuQuq. <Versão> 1.0-SNAPSHOT </Version> <Dor> <PuerpId> org.springframework.boot </groupiD> <stifactId> primavera-boot-starter-parent </stardifactId> <Versão> 2.0.1.release </versão <relativa/> </parentleghty </siperies> 2.0.1.release </versão> <RelityPath/> </parentina </SIGEM>> <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> <nava.version> 1.8 </java.version> </properties> </dependências> <pendency> <voundId> org.springframework.cloud </proupid> <credency> <vplactId> primavera de primavera </GroupId> springflumpta. </dependency> <pendency> <puperid> org.springframework.cloud </foupiD> <TRATIFACTID> Spring-cloud-starter-config </artifactId> </dependency> <pendência> <purpId> org.springframework.boot </grupo> <TifactId> Spring-Blootstar <GrupID> org.springframework.boot </frupiD> <TRARFACTID> Spring-Boot-Starter-test </ArtifactId> <cope> Test </schope> </dependency> </dependency> </dependency> <pendencyManagement> <pendence> <pendency> <puadeid> org.springfamework. <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M9</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependency> </dependencyManagement> <build> <plugins> <groupId>org.springframework.boot</groupId> </ArtifactId> </plugin> </plugins> </fuild> <positórios> <pository> <dd> spring-milestones </dod> <name> Milests Spring.Ilibs </name> <url> https:/repo.spring.iolibs </name> <inabled> false </itilabed> </snapshots> </positório> </positório> </positórios> </jé
Continuamos a usar o Spring-Cloud-Starter-Netflix-eureka-client para permitir que o produto e o serviço sejam automaticamente registrados nos serviços Eureka. Em seguida, o Spring-Cloud-Starter-Config também é usado para ler o arquivo de configuração do Centro de Serviço de Configuração. Este projeto é apenas um projeto simples da Spring Web.
Crie um arquivo bootstrap.yml em SRC/Main/Recursos e adicione o seguinte conteúdo:
Primavera: Aplicação: Nome: Product-Service Cloud: Config: URI: http: // localhost: 8888
Crie o arquivo Product Service.yml no repositório Git no Centro de Configuração e adicione a seguinte configuração e envie:
Servidor: Porta: 8081
Esta configuração especifica que a porta de serviço do produto é 8081. Em seguida, crie a classe de aplicativo e adicione o seguinte código:
pacote cn.zxuqian; importar org.springframework.boot.springApplication; importar org.springframework.boot.autoconfigure.springbooTApplication; importpliativeblIclIntCrovernk.cloud.clouby.discovery.enabilabedcouscLient; void main (string [] args) {springApplication.run (application.class, args); }}A anotação @Enablediscoveryclient instruirá a Spring Cloud a registrar automaticamente esse serviço com Eureka. Por fim, crie o controlador CN.ZXUQIAN.Controllers.ProductController, fornece a API /Produtos e retorne os dados da amostra:
pacote cn.zxuqian.controllers; importar org.springframework.web.bind.annotation.requestmapping; importar org.springframework.web.bind.annotation.restcontroller; @restControlllerpublic Classe ProductCrolller (@RestlestMaping (@RestControlliRPublic PRODUTROTCLER (@ReLestMapMapp (@RestClistsn) Suéter, camiseta "; }}
Configure o cliente da web
Abra o projeto da web que criamos anteriormente e adicione uma nova dependência do Hystrix ao POM.XML:
<Depencency> <PuerpId> org.springframework.cloud </frupiD> <TRATIFACTID> Spring-cloud-starter-Netflix-hystrix </artifactId> </dependency>
Em seguida, atualize o código da classe de aplicativo:
pacote cn.zxuqian; importar org.springframework.boot.springApplication; importar org.springframework.boot.autoconfigure.springbootApplication; importação org.springframework.boot.web.client.resttemplatebuilder; org.springframework.cloud.client.circuitbreaker.enableCecircuitbreaker; importar org.springframework.cloud.client.discovery.enablediscoveryclient; importar org.springframework.context.annotation.bean; importação org.springframework.web.client.resttemplate;@EnableCircuitbreaker@Enablediscoveryclient@springbooTapplicationPublic Classe Application {public static void main (string [] args) {springApplication.run (application.class, args); } @Bean public Resttemplate Rest (RestTemplateBuilder Builder) {return Builder.build (); }}Aqui, @enableCircuitbreaker é usado para ativar a função do disjuntor e, em seguida, é adicionado um método de repouso e a anotação @Bean é usada. Esta parte pertence à função de injeção de dependência da mola. O método usando a tag @Bean informará como inicializar esses objetos. Por exemplo, neste exemplo, usando RestTemplateBuilder para criar um objeto Resttemplate, que será usado posteriormente no serviço usando um disjuntor.
Crie a classe CN.ZXUQIAN.SERVICE.PRODUCTSERVICE e adicione o seguinte código:
pacote cn.zxuqian.services; import com.netflix.hystrix.contrib.javanica.annotation.hystrixCommand; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.client.ServiceNStance; org.springframework.cloud.client.discovery.discoveryclient; importar org.springframework.tereotype.service; importar org.springframework.web.client.resttemplate; import java.util.list; @ServicePublic ProductsReads {private; @Autowired Private Discoveryclient Discoveryclient; public ProductsVice (RestTemplate RestTemplate) {this.resttemplate = RestTemplate; } @HystrixCommand (FallbackMethod = "backupProductList") public String ProductList () {List <VowerInstance> instâncias = this.discoveryclient.getInstances ("Product-Service"); if (instâncias! = null && instâncias.size ()> 0) {return this.resttemplate.getForObject (instâncias.get (0) .geturi () + "/produtos", string.class); } retornar ""; } public string backupProductList () {return "Jack, suéter"; }} O motivo da criação de uma classe de serviço é que o Hystrix só pode ser usado em classes marcadas com @service ou @component, para que a API fornecida pelo contexto da primavera possa ser usada normalmente. Isso será explicado mais tarde, quando você for aprofundado na primavera.
Depois de usar a anotação @hystrixCommand, o Hystrix monitorará o método anotado, a saber, a lista de produtos (a camada subjacente envolve esse método para obter o monitoramento). Uma vez que os erros desse método se acumulem para um determinado limite, o disjuntor será iniciado. Todas as solicitações subsequentes para ligar para o método da lista de produtos falharão, e o método especificado pelo FallbackMethod será temporariamente chamado backupProductList () e, quando o serviço retornar ao normal, o disjuntor será fechado.
Nesta classe, também usamos o Discoveryclient para encontrar o endereço URI do serviço de produto, usar o valor do item de configuração do Spring.Application.name do serviço de produto, ou seja, o serviço de produto é passado para o método Discoveryclient.getInstances () como o serviço e, em seguida, uma lista será retornada. Como temos apenas um serviço de produto, precisamos apenas tomar o endereço URI da primeira instância.
Em seguida, usamos o Resttemplate para acessar a API do serviço de produto. Observe que a injeção do construtor da primavera é usada aqui, ou seja, o método que anotamos com @Bean será usado para inicializar a variável RestTemplate sem que a inicialize manualmente. A classe RestTemplate fornece o método getForObject () para acessar outras APIs REST e envolver os resultados em um formulário de objeto. O primeiro parâmetro é o endereço URI da API a ser acessado e o segundo parâmetro é o tipo de resultado obtido. Aqui retornamos a string, então passamos para String.class.
O método backupProductList () retorna as informações da lista de produtos rebaixados.
Por fim, crie um controlador CN.ZXUQIAN.Controllers.ProductController e adicione o seguinte código:
pacote cn.zxuqian.controllers; importar cn.zxuqian.services.productService; importar org.springframework.beans.factory.annotation.autowired; importação org.springframework.web.bind.annotation.requestMapping; importar; org.springframework.web.bind.annotation.restcontroller; @restcontrollerpublic Classe ProductController {@AUTOWIRED PrivateService ProduckerService; @RequestMapping ("/Products") public String ProductList () {return ProduckService.ProductList (); }} Aqui, use o ProductService para fornecer dados para o caminho /Produtos.
teste
Primeiro, usamos o Spring-Boot: Execute o plug-in para iniciar o serviço de centro de configuração, config-sever e iniciar o Eureka-Server, depois inicie o serviço de produto e, finalmente, inicie o cliente da web. Aguarde um tempo antes que o serviço Eureka seja registrado com sucesso e visite http: // localhost: 8080/produtos. Em circunstâncias normais, obteremos o resultado de jaqueta, jaqueta, suéter e camiseta. Em seguida, fechamos o serviço de produto e depois acessamos o mesmo caminho, e teremos o resultado de rebaixar: jaqueta, suéter
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.