Hystrix 容错机制
在不改变各个微服务调用关系的前提下,针对错误情况进行预先处理。
设计原则
1、服务隔离机制(防止一个服务失败导致所有服务宕机)
2、服务降级机制(返回fallback方法给用户)
3、熔断机制(当服务消费者请求失败率达到某一个 特定数值时,会迅速启动熔断机制,并对错误进行修复)
4、提供实时的监控和报警功能
5、提供实时的配置修改功能
Hystrix 数据监控需要结合Spring Cloud Actuator来使用,Actuator提供了对服务的健康监控、数据统计、可以通过hystrix.steam 节点获取监控的请求数据,提供了 可视化的监控界面。
1、创建maven ,pom.xml 添加相关依赖。
org.springframework.cloud spring-cloud-starter-netflix-eureka-client 2.0.2.RELEASE
org.springframework.cloud spring-cloud-starter-openfeign 2.0.2.RELEASE org.springframework.boot spring-boot-starter-actuator 2.0.2.RELEASE org.springframework.cloud spring-cloud-starter-netflix-hystrix 2.0.2.RELEASE
org.springframework.cloud spring-cloud-starter-netflix-hystrix-dashboard 2.0.2.RELEASE
2、创建配置文件application.yml
server:
port: 8060
spring:
application:
name: hystrix
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
management:
endpoints:
web:
exposure:
include: 'hystrix.stream'
3、创建启动类
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class HystrixApplication {
public static void main(String[] args){
SpringApplication.run(HystrixApplication.class,args);
}
}
注释说明:
@EnableCircuitBreaker:声明启用数据监控
@EnableHystrixDashboard:声明启用可视化数据监控
4、添加controller 方法
因为要继续使用feign 声明式接口调用,所以直接把上一篇文章的feign 的接口复制过来
FeignProviderClient 代码如下:
package com.southwind.feign;
import com.southwind.entity.Student;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Collection;
//这里就体现了Feign 的声明式调用,都是接口,
//value = provider是因为提供者在注册中心的名字叫做 provider
@FeignClient(value = "provider")
public interface FeignProviderClient {
/* 需要调用提供者的controller 里面的方法,直接就行(有
* 点相当于它自己就会把provider 替换成IP地址,然后把Mapping 里面的值给拼接
* 到后面,实现模块间的调用。)
*/
@GetMapping("/student/findAll")
public Collection<Student> findAll();
@GetMapping("/student/index")
public String index();
}
Student 代码如下:
package com.southwind.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class Student {
private long id;
private String name;
private int age;
}
HystrixHandler 代码如下:
package com.southwind.controller;
import com.southwind.entity.Student;
import com.southwind.feign.FeignProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;
@RestController
@RequestMapping("/hystrix")
public class HystrixHandler {
@Autowired
private FeignProviderClient feignProviderClient;
@GetMapping("/findAll")
public Collection<Student> findAll(){
return feignProviderClient.findAll();
}
@GetMapping("/index")
public String index(){
return feignProviderClient.index();
}
}
4、开始测试,启动注册中心,启动服务提供者,启动hystrix 工程
浏览器输入:http://localhost:8060/actuator/hystrix.stream
这里的 ping 就是在实时刷新,空是因为没有服务调用
现在开始使用 hystrix 访问服务提供者
浏览器输入:localhost:8060/hystrix/index
访问成功,ping 就有数据显示了。
这个显示不直观,现在访问可视化的地址,能更直观显示服务被调用情况
浏览器输入:http://localhost:8060/hystrix
出现这个界面,标号1的位置,输入需要监控的 访问地址,标号2 是给该访问地址命个名字 ,然后点击标号 3
出现以下界面:
再次调用index 和findAll 接口
可以看到,调用那个接口,哪个接口的信息 就会有变化,已经实现Hystrix 实现数据监控