spring-cloud-Hystrix
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xiecongcong</groupId>
<artifactId>spring-cloud-Hystrix</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>
<modules>
<module>spring-cloud-eureka-server-9090</module>
<module>spring-cloud-order-server-8081</module>
<module>spring-cloud-user-server-8082</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注册中心:spring-cloud-eureka-server-9090
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xiecongcong</groupId>
<artifactId>spring-cloud-Hystrix</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.xiecongcong</groupId>
<artifactId>spring-cloud-eureka-server-9090</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-eureka-server-9090</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
配置文件
spring.application.name=spring-cloud-eureka-server-9090
server.port=9090
eureka.client.service-url.defaultZone=http://localhost:9090/eureka
启动类
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServer9090Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServer9090Application.class, args);
}
}
order服务:spring-cloud-order-server-8081
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring-cloud-Hystrix</artifactId>
<groupId>com.xiecongcong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-order-server-8081</artifactId>
<packaging>pom</packaging>
<modules>
<module>order-server-api</module>
<module>order-server-provider</module>
</modules>
<dependencies>
</dependencies>
</project>
-
order-server-api
pom文件<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>spring-cloud-order-server-8081</artifactId> <groupId>com.xiecongcong</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>order-server-api</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
接口
public interface IOrderServer { @GetMapping("/order") String getOrder(); }
@FeignClient("order-server-provider") public interface IOpenFeigenIOrderServer extends IOrderServer { }
-
order-server-provider
pom文件<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.xiecongcong</groupId> <artifactId>spring-cloud-order-server-8081</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>order-server-provider</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>com.xiecongcong</groupId> <artifactId>order-server-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
配置文件
spring.application.name=order-server-provider server.port=8081 eureka.client.service-url.defaultZone=http://localhost:9090/eureka
实现类
@RestController public class OrderServerImpl implements IOrderServer { @Override public String getOrder() { return "这是order"; } }
启动类
@EnableEurekaClient @SpringBootApplication public class OrderServerProviderApplication { public static void main(String[] args) { SpringApplication.run(OrderServerProviderApplication.class, args); } }
user服务:spring-cloud-user-server-8082
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring-cloud-Hystrix</artifactId>
<groupId>com.xiecongcong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-user-server-8082</artifactId>
<packaging>pom</packaging>
<modules>
<module>user-server-api</module>
<module>user-server-provider</module>
</modules>
<dependencies>
</dependencies>
</project>
-
user-server-api
pom文件<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>spring-cloud-user-server-8082</artifactId> <groupId>com.xiecongcong</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-server-api</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
-
user-server-provider
配置文件<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>spring-cloud-user-server-8082</artifactId> <groupId>com.xiecongcong</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>user-server-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
配置文件
spring.application.name=user-server-provider server.port=8082 eureka.client.service-url.defaultZone=http://localhost:9090/eureka
启动类
@EnableCircuitBreaker @SpringBootApplication public class UserServerProviderApplication { public static void main(String[] args) { SpringApplication.run(UserServerProviderApplication.class, args); } }
熔断触发降级
user-server-provider中添加两个类
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate getRestTemplate(RestTemplateBuilder restTemplateBuilder){
return restTemplateBuilder.build();
}
}
@RestController
public class HystrixController {
@Autowired
RestTemplate restTemplate;
// 10秒内最小线程数为4(最小请求数为4,从4开始启动),失败率达到百分之60以上,触发熔断降级
// 熔断时间为5秒(5000毫秒)
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "4"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
},fallbackMethod = "fallback")
@GetMapping("/hystrix/order/{num}")
public String queryOrder(@PathVariable("num") int num){
if (num % 2 == 0){
return "这是没有熔断降级的正常访问";
}
return restTemplate.getForObject("http://localhost:8081/order",String.class);
}
public String fallback(int num){
return "这是参数"+num+"!!!!!"+"系统繁忙";
}
}
启动配置中心 —> 启动order服务 —> 启动user服务 根据配置在10s内请求超过4次,失败率达到百分之60以上,触发熔断降级,降级时间5s。 当触发降级后5s内,所有的请求都会进入fallback()方法,5s后重新开始正常请求。
验证方法:
- 关闭order服务。
- 访问http://localhost:8082/hystrix/order/1,一定失败
- 访问http://localhost:8082/hystrix/order/2,返回这是没有熔断降级的正常访问
- 不断刷新http://localhost:8082/hystrix/order/1,触发熔断降级
- 访问http://localhost:8082/hystrix/order/2,直接进入fallback方法返回系统繁忙
请求超时触发降级
添加方法
// 请求超时时间为3秒触降级(默认1s),进入timeoutFallback方法
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
},fallbackMethod = "timeoutFallback")
@GetMapping("/hystrix/timeout")
public String queryOrderTimeout(){
return restTemplate.getForObject("http://localhost:8081/order",String.class);
}
public String timeoutFallback(){
return "请求超时";
}
启动配置中心 —> 启动user服务 —> order服务是关闭的
访问http://localhost:8082/hystrix/timeout,3s后触发降级,直接进入timeoutFallback方法。
资源隔离触发降级
··todo