使用场景
在微服务架构中,如果某个节点提供者出现错误.会让调用它的服务消费者出现联级错误,导致整个服务不可用.熔断器就可以让其快速失败,不再远程访问.从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续
执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时.
准备工作
- 框架以及版本号
框架 | 版本号 |
---|---|
Spring Boot | 1.4.0.RELEASE |
Spring Cloud | Brixton.SR5 |
- 实例准备
实例 | 端口 | 功能 |
---|---|---|
eureka-server | 8761 | 注册发现服务器(单节点) |
user-server | 9090、9091 | 用户管理服务器(多节点,演示均衡负载) |
eureka-client | 8090 | 服务消费者,调用用户管理接口(演示用本身不提供服务) |
Hystrix的使用
- pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
- 启动类
使用注解@EnableCircuitBreaker开启Hystrix
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class ExampleSpringCloudEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleSpringCloudEurekaClientApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- feign整合Hystrix
@FeignClient(name = "user-server", fallback = HystrixUserClientFallback.class)
public interface UserServerFeign {
@RequestMapping(value = "/user", method = RequestMethod.GET)
String getUser();
}
- fallback配置类
fallback的作用是当调用的服务器出现错误时,指定回调方法来处理
@Component
@Slf4j
public class HystrixUserClientFallback implements UserServerFeign {
@Override
public String getUser() {
log.info("调用用户接口出现了异常");
return "get user 1 error";
}
}
为了方便测试,指定一个返回值
测试
- 启动注册中心
eureka-server
- 启动服务提供者
user-server
- 启动服务调用者
eureka-client
- 关闭
user-server
应用 -
eureka-client
调用user-server
显示日志
2018-09-03 14:23:47.791 INFO 1978 --- [ HystrixTimer-2] c.e.s.c.e.c.h.HystrixUserClientFallback : 调用用户接口出现了异常
示例代码
https://github.com/gbKidCoding/spring-cloud-example-discovery-eureka.git
参考资料
Spring Cloud与Docker微服务架构实战 周立 著