为什么要使用熔断器?
当我们使用负载均衡的时候,我们也知道Ribbon默认是通过轮询的方式对服务进行调用,现在有两个服务提供者,而当我们其中一个服务提供者挂掉了就会出现这样的情况。
我们通常不会希望将服务端错误展示给用户看到。那么对于这个问题,Spring Cloud中最重要的解决方案就是熔断器Hystrix
在服务消费者中配置熔断器
pom.xml中的依赖
<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>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>
启动类
/**
* Ribbon测试服务启动入口
*
* @author Aaron
* @date 2020/1/1 16:37
*/
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class TestRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(TestRibbonApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
@EnableCircuitBreaker:表示开启熔断器
创建TestServer类
/**
* @author Aaron
* @date 2020/1/1 17:42
*/
@Service
public class TestService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "error")
public String selfIntroduction(String name) {
return restTemplate.getForEntity("http://SERVER-USER/user/self?name=" + name, String.class).getBody();
}
public String error(String name) {
return "【>.<】 出现错误咯~" + name;
}
}
1.养成一个良好的习惯,RestTemplate统一放在一个地方,根据服务的不同,用不同的service来进行管理。
2.@HystrixCommand中的error表示请求失败之后回调的方法,也就是error方法(PS:方法的参数要一致)。
至此,我们的的熔断器配置就算是大功告成了。