swqww## 服务熔断和降级
1. 服务雪崩
在多个服务调用时 如 a调用b2调用c3 服务之间 出现一个问题(超时 或者不可用)就会导致服务通信返回异常 导致后面的信息 全盘崩盘 导致全部雪崩
我们要实现弃车报帅 我们要做出备份 容灾
2. hystrix
在多个服务出现崩盘时 能够保证 不会出现多米诺效应导致 服务与服务之间层层崩盘
向调用放返回一个 备选响应
3. 能做什么
服务熔断
服务降级
4. 服务熔断是什么
针对服务雪崩的一种链路保护机制 从而熔断 返回备选响应
5. 设置选择备选项
- 注解为 @HystrixCommand(fallbackMethod = “hystryixCes” ) 在当前法方法上面添加 在服务失败时 会自动调用fallbackMethod = " " 选择的方法
- 在主启动类上添加@Enable注解
@EnableCircuitBreaker
小贴士(在yml中配置 如下信息 能在 点击服务时 查看该eureka 的真实 ip)
eureka:
prefer-ip-address: true
服务降级
- 服务降级是跟客户端相关的 服务熔断和降级的区别是 一个是实现错误回调方法 一个是继承接口 实现返回一个类
- 继承接口 实现接口 方法
@Component
public class EmployeeFeignHystrixService implements FallbackFactory {
@Override
public Object create(Throwable throwable) {
return new EmployeeFeignService() {
@Override
public Object get(int id) {
return "当前服务出现问题 暂时关闭 敬请期待再次开启"; //返回结果是当前访问失败后产生的结果 不要用null
}
};
}
}
- 然后在 api model 接口处开启服务降级
@FeignClient(value = "EUREKA", fallbackFactory = EmployeeFeignHystrixService.class)
- 然后在客户端开启服务
feign:
hystrix:
enabled: true
- 区别 服务融断是在服务端方法超时~错误 服务降级是在客户端 为了更好的调用资源
- 在服务降级后 如果中途关闭其中的一个服务 在 访问该服务时就会返回我们当时继承接口方法时 return 的值
监控
- 创建监控model
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 开启服务
@enableHystrixDashboard //开启监控 - 要保证每个服务里面都有监控信息的maven的导入 和启动项中有这个@Bean导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
-
-
解析
-
监控可视化 就是方便
-
导入zuul
-
能干什么
隐藏服务信息 关闭过滤掉直接去往服务器的请求实现统一管理现在的过程变成 请求------》 zuul----》负载均衡-----》真实服务
10.开启步骤
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
zuul:
routes:
myemp.serviceId: eureka #将这个路径访问变成新的样子
myemp.path: /user/**
host:
connect-timeout-millis: 15000 #HTTP连接超时大于Hystrix的超时时间
socket-timeout-millis: 60000 #socket超时
ignore-services: "*" #过滤该路径访问的请求
prefix: /user #带该请求头的才能访问
ribbon: #设置ribbon的超时时间小于zuul的超时时间
ReadTimeout: 10000
ConnectTimeout: 10000
@EnableZuulProxy // 开启Zuul网关