Spring Cloud
- Spring Cloud 是什么
集成了多个框架工具,来解决微服务终于到的各种问题:
- 远程调用(RPC)
- 负载均衡
- 重试(容错)
- 降级
- 熔断
- 监控
- 配置中心
Spring Cloud 是一个框架集,微服务全家桶
-
Spring Cloud 不是什么
不是一个独立框架
Spring Cloud 和 Dubbo 区别
-
Dubbo 只解决远程调用,不能解决其他问题
如果遇到其他问题,需要自己研发,或自己集成其他工具。
-
Spring Cloud 是微服务全家桶,结合Spring Boot来实现“开箱即用”
eureka
Spring Cloud 支持多款注册中心工具:eureka,zookeeper,consul.......
eureka运行机制:
-
注册
应用启动时,会连接注册中心进行注册。
如果无法连接注册中心,它会一次一次的反复进行注册,直到成功为止。
-
拉取
每个服务都会从注册中心拉取注册表,每30秒会重新拉取一次注册表进行更新。
-
心跳
客户端会每30秒向 eureka 注册中心发送一次心跳数据,eureka 连续3次收不到心跳,认为服务已经死掉,会从注册表删除服务。
-
自我保护模式
是一种特殊情况
由于网络不稳定,造成 85%以上的服务器出现心跳异常,这时会进入自我保护模式,在保护模式下,所有服务都不删除,直到网络恢复,会自动退出自我保护模式。
eureka 和 zookeeper 区别
-
eureka
- 强调 AP - 可用性、分区容错性
- 集群 - 对等结构
-
zookeeper
- 强调 CP - 一致性、分区容错性
- 集群 - 主从结构
RestTemplate
Spring Cloud 使用的一个远程调用工具
(服务之间相互调用)
RestTemplate 是Springboot提供的一个远程调用工具
- getForObject("url", 转换类型, 提交的参数)
- postForObject("url", 协议体数据, 转换类型)
Ribbon
Ribbon 的作用,解决的问题:
-
负载均衡(微服务系统必须功能)
访问压力可以分散到多态服务器
-
重试(不是必须功能)
当第一次请求失败或等待超时,可以自动发起重试请求
Ribbon 负载均衡
- ribbon依赖(在 eureka client 中已经包含)
- 添加 @LoadBalanced注解,用Ribbon封装 RestTemplate 对象,对 RestTemplate功能进行增强
Ribbon 重试
容错
当调用后台服务失败,可以自动重试,如果重试成功,可以向客户端正常返回结果。
添加Ribbon重试:
-
添加 pring-retry 依赖
-
设置重试参数:
- MaxAutoRetries - 单台服务器的重试次数
- MaxAutoRetriesNextServer - 更换服务器的次数
- OkToRetryOnAllOperations - 是否对所有类型请求都重试,默认只对 get 重试,如果要对所有请求重试设置成 true
下面两个超时设置不能在 yml 中配置,需要在 java 代码中设置
- connectTimeout - 建立连接超时时间
- readTimeout - 已建立连接并发送了请求,等待响应的超时时间
Hyxtrix
容错工具
Hystrix提供的容错功能:
- 降级
- 熔断
降级
当调用后台服务失败,或超时,可以向客户端返回降级结果 。
快速失败:
- 客户端不必长时间阻塞等待后台服务结果,超时后可以快速获得反馈。
- 防止雪崩、防止错误传播
熔断
熔断就像家里的电箱,有一个总闸,如果访问量过大(过热),触发熔断,家里的电路会被断开。
当系统访问量过大,出现大量的失败情况时,会触发熔断,断路器打开后,所有的请求直接执行降级代码返回降级结果。
触发熔断的条件:
- 10秒内20次请求(必须首先满足)
- 50%失败,执行了降级代码
添加 Hystrix 降级
-
hystrix 依赖
- 添加主程序注解@EnalbleCircuitBreaker,启用 hystrix 断路器,触发断路器自动配置
- 添加降级代码
@HystrixCommnad(fallbackMethod="降级方法") public void a() { restTemplate.getForObject("http://....."); }
hystrix 的超时
默认超时时长是1秒
hystrix dashboard
hystrix仪表盘,对hystrix出现错误的情况进行监控
actuator
Springboot 提供的一个项目监控工具,可以监控项目的各种运行数据,hystrx利用actuator,可以添加hystrix的监控数据。
添加 actuator:
-
actuator依赖
-
暴露监控数据:
m.e.w.e.i="*" # 暴露所有的监控数据 m.e.w.e.i=health # 暴露健康状态数据 m.e.w.e.i=health,beans,env,hystrix.stream # 暴露多种监控数据 m.e.w.e.i=hystrix.stream
搭建仪表盘项目
hystrix仪表盘是一个完全独立的项目,启动后,需要在它的界面上指定监控数据的路径。
- 新建 hystrix-dashboard 项目
- 添加 hystrix dashboard 依赖
- yml 配置选择端口 4001
- 主程序添加注解,启用 hystrix dashboard:@EnableHystrixDashboard
Feign
- 声明式客户端
只需要定义一个抽象的接口,就可以通过接口调用远程服务,不需要写具体调用代码。
例如调用后台商品服务,接口可以这样定义:
@FeignClient(name="item-service") public interface ItemFeignClient { @GetMapping("/{orderId}") JsonResult<List<Item>> getItems(@PathVarible String orderId); }
-
通过注解,配置以下三点:
- 服务id - 确定调用哪个远程服务
- 路径 - 调用一个服务的哪个路径
- 参数 - 向这个路径提交什么参数数据
- 集成 Ribbon
Feign集成了Ribbon,提供了Ribbon的默认配置。
默认已经启用了负载均衡和重试,0配置就可以使用Ribbon。
重试的默认配置:
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
ReadTimeout: 1000
- 集成 Hystrix
Feign可以集成Hystrix,默认不启用Hystrix,Feign不推荐启用Hystrix(后面再进行分析)。
启用Hystrix,添加基础配置:
- 添加 Hystrix 完整依赖
- yml 配置在Feign中启用hystrix:feign.hystrix.enabled=true
- 主程序添加 @EntalbeCircuitBreaker
添加降级代码
添加一个单独的降级类,需要实现声明式客户端接口
@Component public class ItemFeignClientFB implements ItemFeignClient { 实现降级方法,返回降级响应 }在接口上,还需要指定降级类:
@FeignClient(name="item-service",fallback=降级类) interface ItemFeignClient { }
- 添加Hystrix监控
- actuator依赖
- 配置暴露 hystrix.stream 监控端点
m.e.w.e.i=hystrix.stream
访问 http://localhost:3001/actuator/hystrix.stream
访问仪表盘,访问上面的监控数据
全部评论
(0) 回帖