SpringCloud Learning Series -Hystrix circuit breaker (2)

Service fuse

1. What is

Services blown
fuse mechanism is to respond to a micro service link protection mechanism avalanche effect.
When a micro-fan-out link service is unavailable or response time is too long, it will downgrade the service, and then blown call the micro-node service, the quick return "wrong" response information. After detecting the micro-node service call response call resume normal link. Hystrix implemented in the framework of SpringCloud by fusing mechanism. Hystrix will monitor the situation between micro service calls, failed calls when a certain threshold value, the default is the call fails 20 times within five seconds will start fusing mechanism. Notes fuse mechanism is @HystrixCommand.

2. Experiment Code

  1. Reference microservicecloud-provider-dept-8001 New microservicecloud-provider-dept-hystrix-8001

   2. Modify pom

  

 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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>
 
  <parent>
   <groupId>com.atguigu.springcloud</groupId>
   <artifactId>microservicecloud</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </parent>
 
  <artifactId>microservicecloud-provider-dept-hystrix-8001</artifactId>
 
 
  <dependencies>
   <!--  hystrix -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-hystrix</artifactId>
   </ dependency> 
   <-! introduced its own definition of api generic package, you can use the Dept department the Entity -> 
   < dependency > 
     < groupId > com.atguigu.springcloud </ groupId > 
     < artifactId > microservicecloud-api </ artifactId > 
     < Version > $ {project.version} </ Version > 
   </ dependency > 
   <-! micro registered into the service provider side Eureka -> 
   < dependency > 
     < the groupId > org.springframework.cloud </groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>
   <!-- actuator监控信息完善 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
   </dependency>
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
   </dependency>
   <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
   </dependency>
   <dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-core</artifactId>
   </dependency>
   <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jetty</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
   </dependency>
   <!-- 修改后立即生效,热部署 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
   </dependency>
  </dependencies>
 
</project>
 

3. Modify yml

server:
  port: 8001
  
mybatis:
  config-location: classpath: mybatis / the path mybatis.cfg.xml #mybatis
  type-aliases-package: com.atguigu.springcloud.entities #entity别名类
  mapper-locations:
  - classpath:. Mybatis / mapper / ** / * xml #mapper mapping file
    
spring:
   application:
    name: microservicecloud-dept 
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloudDB01
    username: root
    password: 123456
    dbcp2:
      min-idle: 5
      initial-size: 5
      max-total: 5
      max-wait-millis: 200
      
eureka:
  client: # client registration into the list of services within eureka
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001-hystrix # custom service name information
    prefer-ip-address: true # display IP address can access path
      
info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$
      
      
      
 

4. Modify DeptController

  How to deal with once the call service method fails with an error message after @HystrixCommand reported abnormal, it will automatically call the specified method @HystrixCommand good fallbackMethod call class mark

  

package com.atguigu.springcloud.controller;
 
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
 
@RestController
public  class DeptController
{
  @Autowired
  private DeptService service = null;
  
  @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
  public Dept get(@PathVariable("id") Long id)
  {
   Dept dept =  this.service.get(id);
   if(null == dept)
   {
     the throw  new new a RuntimeException ( "the ID:" + id + "there is no corresponding information" );
   }
   return dept;
  }
  
  public Dept processHystrix_Get(@PathVariable("id") Long id)
  {
   return new Dept().setDeptno(id)
           .setDname ( "the ID:" + id + "there is no corresponding information, null - @ HystrixCommand" )
           .setDb_source("no this database in MySQL");
  }
}
 

5. Modify the master boot DeptProvider8001_Hystrix_App class and add new annotations @EnableCircuitBreaker

package com.atguigu.springcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 
@SpringBootApplication
@EnableEurekaClient // After this service starts automatically registered into the eureka of services 
@EnableCircuitBreaker // to hystrixR fuse mechanism to support 
public  class DeptProvider8001_Hystrix_App
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);
  }
}
 
 
 

3. Test

 3 eureka first start

Master Boot class DeptProvider8001_Hystrix_App

 

 

Consumer启动microservicecloud-consumer-dept-80

http://localhost/consumer/dept/get/112

 

 

   If the corresponding ID: 112, a database which does not have this record, we unified return an error.

Guess you like

Origin www.cnblogs.com/XiangHuiBlog/p/12100962.html