在ribbon中使用断路器
在第二节原有基础上添加依赖:
<!-- 熔断器依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
完整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.klose</groupId>
<artifactId>springcloud-study</artifactId>
<version>0.0.1-SNAPSHOT</version> <!-- lookup parent from repository -->
</parent>
<groupId>com.klose</groupId>
<artifactId>custom-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>custom-ribbon</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- 熔断器依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类:
在启动类上增加@EnableHystrix注解,以开启熔断功能。
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class CustomRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(CustomRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
在需要熔断的方法添加@HystrixCommand注解并指定处理异常的方法
代码如下:
@RestController
public class HelloController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
@HystrixCommand(fallbackMethod = "obtainFailure")
public String getPort(String name){
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
}
private String obtainFailure(String name){
return "sorry "+name+", server error";
}
}
测试:
同时开启18012、18013服务:
关闭其中的一个服务:
成功进入的处理异常的方法里。
在feign中使用断路器
feign集成了ribbon,所以自己就能够熔断,不需要导入其它依赖。需要在配置文件中加上开启熔断功能的配置。
添加配置信息:
feign:
hystrix:
enabled: on
完整配置文件:
#指明注册中心的位置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:18011/eureka/
#当前项目部署的端口
server:
port: 18015
#当前项目的名称
spring:
application:
name: custom-feign
feign:
hystrix:
enabled: on
配置熔断器处理类:
@FeignClient(value = "eureka-client",fallback = ErrorClass.class)
public interface HelloService {
@RequestMapping("hi")
String getPort(@RequestParam String name);
}
编写熔断器处理类:
使用@Component注解并实现原有处理类
@Component
public class ErrorClass implements HelloService {
@Override
public String getPort(String name) {
return "do something to handle error";
}
}
测试:
正常情况:
关闭一个服务:
源码下载地址:
https://github.com/kloseS/springcloudstudy