Hystrix--学习笔记(4)
目录
一、参考SpringCloud的官方文档
--1、断路器:Hystrix客户端
--2、如何加入Hystrix
--3、如何包含Hystrix仪表板
二、实操
--1、代码准备
--2、ribbon-demo具体配置
--3、运行结果
三、在feign中加入hystrix
--1、代码准备
--2、feign-demo的具体配置
--3、运行结果
一、参考SpringCloud的官方文档
1、断路器:Hystrix客户端
在微服务架构中,通常有多层服务调用。
较低级别的服务中的服务故障可能导致用户级联故障。当对特定服务的呼叫达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通话。在错误和开路的情况下,开发人员可以提供后备。
开放式电路会停止级联故障,并允许不必要的或失败的服务时间来愈合。回退可以是另一个Hystrix保护的调用,静态数据或一个正常的空值。回退可能被链接,所以第一个回退使得一些其他业务电话又回到静态数据。
2、如何加入Hystrix
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
example
@SpringBootApplication
@EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
@Component
public class StoreIntegration {
@HystrixCommand(fallbackMethod = "defaultStores")
public Object getStores(Map<String, Object> parameters) {
//do stuff that might fail
}
public Object defaultStores(Map<String, Object> parameters) {
return /* something useful */;
}
}
3、如何包含Hystrix仪表板
要在项目中包含Hystrix仪表板,请使用组org.springframework.cloud
和工件ID spring-cloud-starter-hystrix-dashboard
的启动器。
要运行Hystrix仪表板使用@EnableHystrixDashboard
注释您的Spring Boot主类。然后访问/hystrix
,并将仪表板指向Hystrix客户端应用程序中的单个实例/hystrix.stream
端点。
二、实操
1、代码准备
- 注册中心euraka-demo-server(参考Eureka--学习笔记(1))
- 在原先的ribbon-demo基础上修改(参考Ribbon--学习笔记(2))
2、ribbon-demo具体配置
启动类
@EnableCircuitBreaker
@EnableHystrixDashboard
@SpringBootApplication
public class RibbonDemoApplication {
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonDemoApplication.class, args);
}
}
降级服务配置
@RestController
@RequestMapping("/call")
public class CallController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hello")
@HystrixCommand(fallbackMethod = "hasError")
public String hello(){
return restTemplate.getForObject("http://EUREKA-DEMO-CLIENT-1/",String.class);
}
@GetMapping("/hi/{name}")
public String hi(@PathVariable("name") String name){
return restTemplate.getForObject("http://EUREKA-DEMO-CLIENT-1/test/say/hello/" + name,String.class);
}
public String hasError(){
return "哎呀!出错了!";
}
}
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
HystrixConfig.java
@Configuration
public class HystrixConfig {
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
3、运行结果
ui的监控界面
在浏览器中输入localhost:8082/call/hello
在浏览器中输入localhost:8082/hystrix
,之后再输入http://localhost:8082/hystrix.stream
按下网页按钮Monitor Stream
,之后回到哎呀!出错了
的网页刷新4次,再切换回本网页
三、在feign中加入hystrix
1、代码准备
- 注册中心euraka-demo-server(参考Eureka--学习笔记(1))
- 在原先的feign-demo基础上修改(参考Feign--学习笔记(3))
2、feign-demo的具体配置
pom.xml
<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-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8083
spring:
application:
name: feign-demo-consumer
feign:
hystrix:
enabled: true
降级配置
@Component
public class HystrixClientFallback implements HelloClient {
@Override
public String sayHello() {
return "哎呀!出错了!!!";
}
}
设置回调
@FeignClient(name = "eureka-demo-client-1",fallback = HystrixClientFallback.class)
public interface HelloClient {
@GetMapping("/")
String sayHello();
}
3、运行结果
ui界面的监控
在浏览器中输入http://localhosst:8083/hello