[TOC]
## **1. 分布式微服务架构面临的问题**
在微服务架构中,根据业务来拆分成一个个的服务,而**服务与服务之间存在着依赖关系**(比如用户调商品,商品调库存,库存调订单等等),在Spring Cloud中多个微服务之间可以用 RestTemplate+Ribbon 和 Feign 来调用
![](https://img.kancloud.cn/fa/96/fa96850078423095e72b853ee76f2d01_664x540.png)
1. 在服务之间调用的链路上由于网络原因、资源繁忙或者自身的原因,服务并不能保证100%可用
2. **如果单个服务出现问题,调用这个服务就会出现线程阻塞,** 导致响应时间过长或不可用,此时若有大量的请求涌入,容器的线程资源会被消耗完毕,**导致服务瘫痪**。
3. **服务与服务之间的依赖性,故障会传播**,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 **“雪崩”效应** 。 为了解决这个问题,业界提出了熔断器模型。
## 2. Hystrix 作用
Hystrix 是Netflix公司开源项目( https://github.com/Netflix/Hystrix),实现了熔断器模型,Spring Cloud 对这一 组件进行了整合。
* 服务熔断
* 服务监控
### 2.1 什么是服务熔断
1. 熔断机制**是应对雪崩效应的一种微服务链路保护机制。** 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:
![](https://img.kancloud.cn/b1/2c/b12c7b328dfe48ca474777836558a0d5_477x303.png)
2. 当服务之间调用的链路上某个微服务不可用或者响应时间太长时,会导致连锁故障。**当失败的调用到一定阈值(缺省是5秒内20次调用失败) 就会启动熔断机制。**
3. 在 SpringCloud 框架里熔断机制通过Hystrix实现,Hystrix会监控微 服间调用的状况。熔断机制的注解是 @HystrixCommand
![](https://img.kancloud.cn/79/13/7913d2bc3c6c4debbfb36475938fd7f4_631x420.png)
* **熔断器打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。这样其他调用者就不用等待(阻塞),不至于拖垮整个系统!**
### **2.2 服务端熔断**
**1. 服务提供端引入熔断相关依赖**
```
<!-- 导入hystrix依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
```
**2. 修改 ProductController**
出现异常后如何处理?
使用` @HystrixCommand` 注解 ,一旦调用服务方法失败并抛出了错误信息后,会自动调用 @HystrixCommand 注解中 fallbackMethod 属性指定的当前类中的方法
![](https://img.kancloud.cn/df/25/df25e620e4b284e9cada037f87cb246d_824x530.png)
* 如果不报错(返回null),也不超时就不会调用fallback方法
**3. 修改启动类,开启Hystrix**
@EnableHystrix //开启Hystrix的熔断机制
~~~
@EnableHystrix //开启Hystrix的熔断机制
@EnableEurekaClient
@MapperScan("com.tuna.springcloud.server.mapper")
@SpringBootApplication
public class ProductProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(ProductProvider_8001.class, args);
}
}
~~~
![](https://img.kancloud.cn/17/43/174376cd483cfeb513b218a23900bccc_866x491.png)
没有异常时
![](https://img.kancloud.cn/7d/97/7d971d6f42cf2b73eb039e4bbd55ef7e_505x104.png)
当id=7,发生异常时
![](https://img.kancloud.cn/71/ae/71aece776d6e655a6839b38366679a34_836x127.png)
### **2.3 Feign 客户端服务熔断**
**1. 修改yml,开启Feign自带的熔断**
Feign 是自带断路器的,也就是针对**消费者(客户端)**进行服务熔断,需要在配置文件中开启它,在配置文件加以下代码
```
feign:
hystrix:
enabled: true # 开启服务熔断器
```
**2. 指定熔断处理类**
Service 接口上的 @FeignClient 注解中,加上 fallback 指定熔断处理类即可: ProductClientServiceFallBack.class
~~~
@FeignClient(value = "microservice-product", fallback = ProductClientServiceFallBack.class)
~~~
~~~
//@FeignClient(value = "microservice-product") //指定调用的微服务名称
// fallback 作用,指定熔断处理类,如果被调用的方法处理异常,就会交给熔断处理类中的方法进行处理
@FeignClient(value = "microservice-product", fallback = ProductClientServiceFallBack.class) //指定调用的微服务名称
public interface ProductClientService {
@RequestMapping(value = "/product/add", method = RequestMethod.POST)
boolean add(@RequestBody Product product);
@RequestMapping(value = "/product/get/{id}", method = RequestMethod.GET)
Product get(@PathVariable("id") Long id);
@RequestMapping(value = "/product/list", method = RequestMethod.GET)
List<Product> list();
}
~~~
**3. 创建熔断处理类**
需要继承对应的service
~~~
@Component //一定要加上它,将它纳入到容器中
public class ProductClientServiceFallBack implements ProductClientService{
@Override
public boolean add(Product product) {
return false;
}
@Override
public Product get(Long id) {
return new Product(id, "id=" + id + "无数据--@feignclient&hystrix", "无有效数据库");
}
@Override
public List<Product> list() {
return null;
}
}
~~~
**4. 测试**
[http://localhost/consumer/product/get/6](http://localhost/consumer/product/get/6)
![](https://img.kancloud.cn/d6/0e/d60e2308c0be7c4fa52397b0cd8e1d5f_494x140.png)
当关闭服务提供端
![](https://img.kancloud.cn/7f/22/7f226e40875046f4468844f679b652d9_609x192.png)
### **2.4 Hystrix Dashboard监控平台搭建**
#### **2.4.1 创建 Hystrix Dashboard模块**
![](https://img.kancloud.cn/f4/4a/f44af44e278ec68b966f6a15367c0064_286x262.png)
**2.4.1.1 修改pom加入 Hystrix Dashboard启动器**
~~~
<!--导入 hystrix 与 hystrix-dashboard 依赖-->
<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>
~~~
**2.4.1.2 配置application.yml文件**
~~~
server:
port: 9001
~~~
**2.4.1..3 创建启动类 **
创建一个启动类 HystrixDashboard_9001,添加 @EnableHystrixDashboard 注解开启服务监控
~~~
@EnableHystrixDashboard //开启服务监控
@SpringBootApplication
public class HystrixDashboard_9001 {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboard_9001.class, args);
}
}
~~~
**2.4.1.4 启动微服务** 访问[http://localhost:9001/hystrix](http://localhost:9001/hystrix)
![](https://img.kancloud.cn/97/47/97478552c0dd2b48441cb4f05db65cf5_1056x607.png)
#### 2.4.2 服务端搭建
在需要监控的服务 pom.xml 中的 dependencies 节点中新增 spring\-boot\-starter\-actuator 监控依赖,
以开启监控相关的端点,并确保已经引入断路器的依赖 spring\-cloud\-starter\-netflix\-hystrix
**1. 服务端pom加入熔断监控依赖**
```
<!--hystrix监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
```
**2. 在需要监控的服务 application.yml 配制中添加暴露端点**
在服务提供者 microservice-cloud-server 的application.yml配置文件添加如下配置:
~~~
# hystrix 在被监控服务上添加暴露端点
management:
endpoints:
web:
exposure:
include: hystrix.stream
~~~
**3. 启动服务提供者、Eureka、hystrix服务测试**
1\. 启动监控服务: microservice-cloud-hystrix-dashboard-9001
2\. 启动2个Eureka
3\. 启动 microservice-cloud-08-provider-product-8001
先访问:http://localhost:8001/product/get/1
![](https://img.kancloud.cn/c0/50/c050e49c06f1ea136565dae7d7daccae_533x113.png)
再访问:http://localhost:8001/actuator/hystrix.stream 看效果
![](https://img.kancloud.cn/53/3a/533a8f6b82c7e7187ba4ce67693dd3a6_1177x672.png)
每隔2秒进行ping获取json格式数据(9001 监控 8001),但是阅读性不好,如果数据可以图形化显示效
果就更完美
**4. Hystrix Dashboard**
![](https://img.kancloud.cn/ed/5d/ed5d126cab5e7abedcb2ee6fcb9d8113_1170x649.png)
第一个输入框填写监控地址: http://localhost:8001/actuator/hystrix.stream
Delay:控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客
户端的网络和CPU消耗。
Title:可以通过配置该信息来展示更合适的标题,默认会使用具体监控实例的URL
**监控结果**
![](https://img.kancloud.cn/07/9c/079c35608eca741880055b8fb13c06a1_1035x458.png)
如果没有请求会一直显示 “Loading…”
这时访问一下 http://localhost:8001/product/get/1,可以看到出现了上图的效果:
**如何查看监控页面 **
7色 :右上角 1圈
实心圆:共有两种含义。
它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越
大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。
1线
曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
- springcloud
- springcloud的作用
- springboot服务提供者和消费者
- Eureka
- ribbon
- Feign
- feign在微服务中的使用
- feign充当http请求工具
- Hystrix 熔断器
- Zuul 路由网关
- Spring Cloud Config 分布式配置中心
- config介绍与配置
- Spring Cloud Config 配置实战
- Spring Cloud Bus
- gateway
- 概念讲解
- 实例
- GateWay
- 统一日志追踪
- 分布式锁
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安装
- 1.2 特性
- 1.3 实例
- 1. 整合nacos服务发现
- 2. 整合nacos配置功能
- 1.4 生产部署方案
- 环境隔离
- 原理讲解
- 1. 服务发现
- 2. sentinel
- 3. Seata事务
- CAP理论
- 3.1 安装
- 分布式协议
- 4.熔断和降级
- springcloud与alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服务框架付费
- SkyWalking
- 介绍与相关资料
- APM系统简单对比(zipkin,pinpoint和skywalking)
- server安装部署
- agent安装
- 日志清理
- 统一日志中心
- docker安装部署
- 安装部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定时清理数据
- index Lifecycle Management
- 没数据排查思路
- ELK自身组件监控
- 多租户方案
- 慢查询sql
- 日志审计
- 开发
- 登录认证
- 链路追踪
- elk
- Filebeat
- Filebeat基础
- Filebeat安装部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安装
- rpm安装
- docker安装Logstash
- grok调试
- Grok语法调试
- Grok常用表达式
- 配置中常见判断
- filter提取器
- elasticsearch
- 安装
- rpm安装
- docker安装es
- 使用
- 概念
- 基础
- 中文分词
- 统计
- 排序
- 倒排与正排索引
- 自定义dynamic
- 练习
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- kibana
- 安装
- docker安装
- rpm安装
- 整合
- 收集日志
- 慢sql
- 日志审计s
- 云
- 分布式架构
- 分布式锁
- Redis实现
- redisson
- 熔断和降级