spring cloud介绍
spring cloud 是一系列框架的集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。spring cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 spring boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
spring cloud 对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用 spring cloud 一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和 docker 容器概念的火爆,也会让 spring cloud 在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、一站式的技术方案,意义可能会堪比当年 servlet 规范的诞生,有效推进服务端软件系统技术水平的进步。
- eureka 微服务治理,服务注册和发现
- ribbon 负载均衡、请求重试
- hystrix 断路器,服务降级、熔断
- feign ribbon + hystrix 集成,并提供声明式客户端
- hystrix dashboard 和 turbine hystrix 数据监控
- zuul API 网关,提供微服务的统一入口,并提供统一的权限验证
- config 配置中心
- bus 消息总线, 配置刷新
- sleuth+zipkin 链路跟踪
spring colud功能介绍
- eureka: 微服务治理,服务注册和实现
- ribbon:负载均衡、请求重试
Spring Cloud与Dubbo对比
- Dubbo
Dubbo只是一个远程调用(RPC)框架
默认基于长连接,支持多种序列化格式
- Spring Cloud
框架集
提供了一整套微服务解决方案(全家桶)
基于http调用, Rest API
Eureka的运行机制
- 注册:提供者一次次反复连接eureka,直到注册成功为止
- 拉取:每隔30秒拉取一次注册信表,更新注册信息
- 心跳:每30秒发送搜一次心跳,当出现3次收不到心跳eureka会删除这个服务
- 自我保护模式-特殊情况:当出现网络状态不稳定的情况时,15分钟之内85%的服务器出现心跳异常时:1.保护所有的注册信息不会删除 2.网络恢复后,可以自动的退出保护模式 3.在程序开发测试期间可以将保护模式关闭。
Eureka与Zookeeper的区别
- Eureka:AP原则,提供服务功能。集群是对等关系
- Zookeeper:CP原则,提供一致性功能。集群是主从关系。
RestTemplate
springboot中提供了远程调用工具,例如HttpClient,但是调用比较麻烦,配置比较繁琐。
RestTemplate 对Http Rest API的调用进行了高度的封装,只需要调用一个封装好的方法就可以完成客户端请求、服务端的响应、json的转换。基本格式如下:
- getForObject(url,转换的类型.class,提交的参数数据)
- postForObject(url,提交的协议体的数据,转换的类型.class)
Ribbon
Ribbon是springcloud提供的对RestTemplate进行增强和封装的一个工具,Ribbon提供了负载均衡的重试的功能。
Ribbon的负载均衡
- 从eureka获取地址表
- 使用多个地址进行来回的调用
- 当拿到一个地址的时候,使用restTemplate执行远程调用
添加ribbon负载均衡的一般化步骤:
- 添加ribbon依赖(如果已经添加过eureka依赖,则不需要单独添加,其中已经包含了ribbon依赖)
- 在启动类中添加@LoadBalanced注解,对RestTemplate进行增强
- 用restTemplate调用的地址,改为注册中心注册的服务名
Ribbon重试
一种容错的方式,当调用远程服务失败(异常、超时)的时候,可以进行重试调用
添加重试的一般化步骤
- 添加spring-retry依赖
- 配置重试相关的参数
- MaxAutoRtries - 单台服务器的重试次数
- MaxAutoRtriesNextServer - 更换服务器的次数
- OkToRetryOnAllOperations -是否对所有类型请求都进行重试,默认只对get重试
- ConnectTimeout - 和远程服务建立连接的等待超时时长
- ReadTimeout - 建立连接并发送请求后,等待响应的超时时长 两个超时设置,不能在yml中配置,而是要在java代码中设置
Hystrix断路器
添加hystrix起步依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
修改yml配置文件
spring:
application:
name: hystrix
主启动程序添加注解
@EnableCircuitBreaker
关于hystrix的超时设置
hystrix等待超时后, 会执行降级代码, 快速向客户端返回降级结果, 默认超时时间是1000毫秒。当进行测试 hystrix 降级的时候,我们把 hystrix 等待超时设置得非常小(500毫秒)
此设置一般应大于 ribbon 的重试超时时长,例如 10 秒
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500
hystrix dashboard断路器仪表盘
hystrix对请求的降级和熔断,可以产生相关的监控信息,hystrix dashboard进行监控端点
actuator是springboot提供的服务监控工具,提供了各种监控信息的监控端点
添加actuator依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改yml配置文件
management:
endpoints:
web:
exposure:
include: hystrix.stream
include的属性可以修改,监控自己需要的数据。
dashboard仪表盘
关于hystrix熔断
整个链路达到一定的阈值,默认情况下,10秒内产生超过20次请求,则符合第一个条件。
满足第一个条件的情况下,如果请求的错误百分比大于阈值,则会打开断路器,默认为50%。
Hystrix的逻辑,先判断是否满足第一个条件,再判断第二个条件,如果两个条件都满足,则会开启断路器
断路器打开 5 秒后,会处于半开状态,会尝试转发请求,如果仍然失败,保持打开状态,如果成功,则关闭断路器
Feign
在微服务的部署中,ribbon和hystrix总是同时出现的,feign整合了两者,并且提供了声明式消费者客户端接口进行远程调用。feign利用了我们熟悉的spring mvc注解对接口方法进行设置,降低了我们的学习成本。通过这些设置feign可以拼接后台服务的访问路径和提交的参数。
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
ribbon 重试和 hystrix 超时这里一般不进行设置,采用默认值
主启动程序添加注解
@EnableFeignClients//使用feign
如果启动hytrix还需要添加注解
@EnableCircuitBreaker//配置启动hystrix
feign默认情况下已经启用了ribbon的负载均衡和重试机制,如果有需要可以通过配置对参数进行调整。
ribbon:
ConnectTimeout: 1000
ReadTimeout: 1000
item-service:
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
ConnectTimeout: 1000
ReadTimeout: 500
feign默认情况下没有启用hytrix,如果需要可以在yml文件中进行配置启用。
feign:
hystrix:
enabled: true
feign添加降级,测试期间可以减小降级超时时间,一遍对降级进行测试
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500
feign在远程接口中指定降级类
例如:
@FeignClient(name="item-service", fallback = ItemFeignServiceFB.class)
feign远程调用过程如下
zuul API网关
zuul API网关,向微服务提供了统一的对外访问接口,并且zuul还提供了过滤器功能,对所有的微服务提供统一的请求校验。
配置
zuul路由配置可以省略,缺省以服务id作为访问路径。例如
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
主程序添加注解
@EnableZuulProxy
@EnableDiscoveryClient
zuul同样整合了ribbon,hytrix。默认情况下zuul已经实现了负载均衡,不开启重试。
添加依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
配置yml文件,开启重试
zuul:
retryable: true
zuul过滤器
zuul过滤器无需多余的配置,只要创建指定的类,并且继承自ZuulFilter,添加@component注解即可
feign默认不启用hytrix和zuul默认不启用ribbon重试说明
feign默认不启用hytrix,是因为feign主要是在服务和服务之间进行使用,当服务之间出现出现问题的时候无法确定在那两个服务之间进行降级和熔断。
zuul默认不启用ribbon重试,是因为zuul主要在服务之前使用,当服务发送问题的时候,如果zuul持续进行重试就会加大服务之间的压力,在高并发的情况下更加致命。