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.