Introducción
Spring Cloud proporciona una biblioteca tolerante a fallas de Hystrix para implementar una estrategia de rebajado para los métodos configurados con los interruptores de circuitos cuando el servicio no está disponible y llame temporalmente métodos alternativos. Este artículo creará un microservicio de producto, se registrará en el Centro de registro de servicios Eureka y luego utilizamos la API de acceso/productos del cliente web para obtener la lista de productos, y cuando el servicio del producto falla, el método de espera local se llama de rebaja pero proporciona el servicio normalmente.
Entorno básico
GIT: código fuente del proyecto
Agregar servicios de productos
Cree un nuevo proyecto Maven en IntelliJ, utilizando la siguiente configuración
Luego agregue el siguiente código en pom.xml:
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion> 4.0.0 </modelversion> <grupo> cn.zxuqian </groupid> <arifactid> <versión> 1.0-snapshot </versión> <parent> <grupoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 2.0.1.release </versión> <relativePath/> </parent> <propiades> <Project.Build.SourceEncoding> UTF-8 </project.build.sourceEncoding> <java.version> 1.8 </java.version> </propine> <epartents> <epardency> <proupid> org.springframe.cloud </groupid> <AtifiFact> spring-cloud-starter-netflix-eeurekekerkekerkerkerworkwork </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <cope> test </pope> </pependency> </pepertency> </spertency> <pepersmanementsementsion> <epardency> <epardency> <epardency> <uproupid> org.pringFrameWork.cloud </groupid> <artifactid> Spring-Cloud-Dependencies </artifactid> <versever> finchley.m9 </versewer> <proy> pom </pype> <cope> import </cope> </pependency> </pepertency> </pertency> </pendencyManagement> <Scopt> <glugins> <uproupid> org.pringframework.Boot </groupid> <artifactid> spring-boot-maven-plugin </artifactid> </glugin> </glugins> </bield> <repositories> <Repository> <id> spring-Milestones </did> <name> spring hitos </name> <url> https://repo.spring.io/libs-milestone </url> <sape> <saps> <Dabled> falso </sepable> </stapshots> </ Repository> </ Repository> </ Repositories> </Project>
Continuamos utilizando Spring-Cloud-Starter-Netflix-eureka-Client para permitir que el producto y el servicio se registren automáticamente con los servicios eureka. Luego, Spring-Cloud-Starter-Config también se usa para leer el archivo de configuración del Centro de servicio de configuración. Este proyecto es solo un simple proyecto web de primavera.
Cree un archivo bootstrap.yml en src/main/recursos y agregue el siguiente contenido:
Spring: Aplicación: Nombre: Producto Servicio Cloud: Configuración: Uri: http: // localhost: 8888
Cree el archivo de producto-service.yml en el repositorio de git en el centro de configuración y agregue la siguiente configuración y envíe:
servidor: puerto: 8081
Esta configuración especifica que el puerto de servicio del producto es 8081. Luego cree la clase de aplicación y agregue el siguiente código:
paquete cn.zxuqian; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; importar org.springframework.cloud.client.discovery.enabledScovericlient; Main (String [] args) {SpringApplication.run (Application.Class, Args); }}La anotación @EnableScoveryClient instruirá a Spring Cloud que registre automáticamente este servicio con Eureka. Finalmente, cree el controlador cn.zxuqian.controllers.productController, proporcione la API /Products y devuelva los datos de muestra:
package cn.zxuqian.controllers;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController { @RequestMapping("/products") public String productList() { return "Coat, Jacket, Sweater, Camiseta"; }}Configurar el cliente web
Abra el proyecto web que creamos anteriormente y agregue una nueva dependencia de Hystrix a pom.xml:
<Spendency> <MoupRoMID> org.springframework.cloud </groupid> <artifactId> spring-ncloud-starter-netflix-hystrix </artifactid> </dependency>
Luego actualice el código de la clase de aplicación:
paquete cn.zxuqian; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.boot.web.client.resttemplateBuider; importar; importación; org.springframework.cloud.client.circuitbreaker.enablecircuitbreaker; import org.springframework.cloud.client.discovery.enabledScuberyClient; importar org.springframework.context.annotation.bean; importación; org.springframework.web.client.resttemplate;@enableCircuitbreaker@habilitados en la aplicación de la clase SpringBootApplicationPublic {public static void main (string [] args) {springApplication.run (Application.Class, Args); } @Bean public RestTemplate REST (RestTemplateBuilder Builder) {return Builder.Build (); }}Aquí, @enablecircuitbreaker se utiliza para habilitar la función del interruptor de circuito, y luego se agrega un método de descanso y se usa la anotación @Bean. Esta parte pertenece a la función de inyección de dependencia de primavera. El método que usa la etiqueta @Bean le dirá cómo inicializar dichos objetos. Por ejemplo, en este ejemplo, utilizando ResttEmplateBuilder para crear un objeto RestTemplate, que se usará más adelante en el servicio utilizando un interruptor de circuito.
Cree la clase cn.zxuqian.service.productService y agregue el siguiente código:
paquete cn.zxuqian.services; import com.netflix.hystrix.contrib.javanica.annotation.hystrixcommand; import org.springframework.beanss.factory.annotation.aUtowired; import org.springframework.cloud.client.serviceinstance; importación; org.springframework.cloud.client.discovery.discoveryclient; import org.springframework.stereotype.service; import org.springframework.web.client.resttemplate; import java.util.list; @ServicePublic Class Productservice {RESTTEPLEPLATA DE RESTAPLATA PRIVADO; @Autowired Private DiscoveryClient DiscoveryClient; Public Productservice (RestTemplate RestTemplate) {this.restTemplate = RestTemplate; } @HystrixCommand (fallbackmethod = "backupproductList") public string productList () {list <serviceInstance> instancias = this.discoveryclient.getInstances ("producto-servicio"); if (instances! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instancias.get (0) .geturi () + "/productos", string.class); } devolver ""; } public String BackupProductList () {return "Jack, Sweater"; }} La razón para crear una clase de servicio es que Hystrix solo se puede usar en clases marcadas @Service o @Component, de modo que la API proporcionada por el contexto de Spring se puede usar normalmente. Esto se explicará más tarde cuando profundice en la primavera.
Después de usar la anotación de @HystrixCommand, Hystrix monitoreará el método anotado, a saber, ProductList (la capa subyacente envuelve este método para lograr el monitoreo). Una vez que se acumulan los errores de este método para un cierto umbral, se iniciarán el interruptor de circuito. Todas las solicitudes posteriores para llamar al método ProductList fallarán, y el método especificado por FallbackMethod se llamará temporalmente backupproductList (), y luego, cuando el servicio regrese a la normalidad, el interruptor de circuito se cerrará.
En esta clase, también utilizamos DiscoveryClient para encontrar la dirección URI del servicio del producto, utilizar el valor del métode Spring.Application.Name Configuration del servicio del producto, es decir, el servicio del producto se pasa al método DiscoveryClient.getInstances () como el servicio, y luego se devolverá una lista. Debido a que solo tenemos un servicio de producto iniciado, solo necesitamos tomar la dirección de URI de primera instancia.
Luego usamos RestTemplate para acceder a la API del servicio de producto. Tenga en cuenta que la inyección del constructor de Spring se usa aquí, es decir, el método que anotamos con @Bean se usará para inicializar la variable RESTTemplate sin que la inicialicen manualmente. La clase RestTemplate proporciona el método getForObject () para acceder a otras API REST y envolver los resultados en un formulario de objeto. El primer parámetro es la dirección URI de la API a acceder, y el segundo parámetro es el tipo de resultado obtenido. Aquí devolvemos la cadena, así que la pasamos a String.class.
El método BackupRoductList () devuelve la información de la lista de productos rebajada.
Finalmente, cree un controlador cn.zxuqian.controllers.productController y agregue el siguiente código:
paquete cn.zxuqian.controllers; import cn.zxuqian.services.productService; import org.springframework.beans.factory.annotation.auTowired; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restController; @RestControllerPublic ProductController {@aUtowired Productservice Productservice; @RequestMapping ("/Products") public String productList () {return Productservice.productList (); }} Aquí, use Productservice para proporcionar datos para la ruta /productos.
prueba
Primero, usamos el complemento Spring-Boot: Ejecutar para iniciar el servicio del centro de configuración, configurar-servidor, luego iniciar eureka-server, luego iniciar el servicio del producto y finalmente iniciar el cliente web. Espere un tiempo antes de que el servicio Eureka se registre con éxito y visite http: // localhost: 8080/productos. En circunstancias normales, obtendremos el resultado de la chaqueta, la chaqueta, el suéter y la camiseta. Luego cerramos el servicio de productos, y luego accedemos al mismo camino, y obtendremos el resultado de degradación: chaqueta, suéter
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.