SpringCloud
SpringCloud
- 框架集
- 提供了一整套微服务解决方案(全家桶)
- 基于http调用, Rest API
eureka
微服务治理,服务注册和发现
eureka和zookeeper区别
eureka:
- 强调AP(可用性)
- 集群结构:对等结构
zookeeper:
- 强调CP(一致性)
- 集群结构:主从结构
eureka注册和发现
1、注册
服务提供者启动时,向eureka一次次反复注册,直到注册成功为止
2、拉取注册表
服务发现者每30秒拉取一次注册表(刷新注册表)
3、心跳
服务发现者每30秒发送一次心跳数据
eureka连续3次收不到一个服务的心跳,会删除这个服务
4、自我保护模式
特殊情况
如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式
在保护模式下,所有服务都不删除
网络恢复后,可以自动退出保护模式,恢复正常
开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式
搭建eureka服务器
1、添加eureka server依赖
2、yml配置
1、主机名
2、禁用保护模式
3、针对单台服务器,配置不向自己注册,也不从自己拉取注册表
spring:
application:
name: eureka-server
server:
port: 2001 #默认8761
eureka:
instance:
hostname: eureka1 #主机名,集群中区分不同服务器
server:
enable-self-preservation: false #开发期间禁用保护模式
client:
register-with-eureka: false #单台服务器不向自己注册
fetch-registry: false #单台服务器不从自己拉取
3、启动类注解@EnableEurenaServer,通过注解触发自动配置
单台eureka服务器启动后报错:Connect to localhost:8761 timedout
这是自动配置的一个默认集群服务器,但是这个默认服务器不存在,所以出错
后面自己搭建了集群服务,默认服务器就不会再自动配置
RestTemplase
SpringBoot提供的远程调用工具
类似于HttpClient,可以发送http请求,并处理响应,RestTemplate简化了RestAPI调用,只需要使用它一个方法,就可以完成请求、响应、json转换
方法:
- getForObject(url,转换的类型.class,提交的参数)
- postForObject(url,协议体数据,转换的类型.class)
RestTemplate和Dubbo远程调用的区别:
RestTemplate:
- http调用
- 效率低
Dubbo:
- RPC调用,java的序列化
- 效率高
Ribbon
负载均衡、请求重试
负载均衡
Ribbon对RestTemplate做了封装,增强了RestTemplate的功能
1、获取地址表
2、轮询一个服务的主机地址列表
3、RestTemplate负责执行最终调用
添加负载均衡
1、ribbon依赖
2、@LoadBalanced注解,对RestTemplate进行功能增强@LoadBalanced
负载均衡注解
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
//设置调用超时时间,超时后认为调用失败
SimpleClientHttpRequestFactory f=new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000); //建立连接等待时间
f.setReadTimeout(1000); //连接建立后,发送请求后,等待接收响应的时间
return new RestTemplate(f);
}
3、修改调用地址,使用服务ID,而不是具体主机地址
Ribbon重试
一种容错机制,当调用远程服务失败,可以自动重试调用
添加重试:
1、添加spring-retry依赖
2、配置重试参数
1、在yml中配置
- MaxAutoRetries:单台服务器的重试次数
- MaxAutoRetriesNextServer:更换服务器的次数
2、在java代码中设置
- Connecttimeout:与远程服务建立网络连接的超时时间
- ReadTimeout:连接已建立,请求已发送,等待响应的超时时间
# 配置 Ribbon 重试次数
ribbon:
# 次数参数没有提示,并且会有黄色警告
# 重试次数越少越好,一般建议用 0, 1 MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
Hystrix
断路器,服务降级、熔断
系统容错工具
- 降级
调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
快速失败 - 熔断
当访问量过大,出现大量失败,可以过热保护,断开远程服务不再调用
限流
防止故障传播,雪崩效应
降级
1、hystrix依赖
2、启动类添加注解@EnableCircuitBreaker
3、添加降级代码
//当调用远程服务失败,跳转到指定的方法,执行降级代码
@HystrixCommand(fallbackMenthod="方法名")
远程调用方法(){
restTemplate.getForObject(url...);
}
Hystrix超时
Hystrix有默认的超时时间:1秒
Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效
Hystrix熔断
断路器打开的条件:
- 10秒内20次请求(必须首先满足)
- 50%失败,执行了降级代码
断路器打开后,所有请求直接执行降级代码
断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用
如果调用成功,断路器可以自动关闭,恢复正常
如果调用仍然失败,继续保持打开状态几秒钟
Actuator
springboot提供的日志监控工具,可以暴露项目中多种监控信息
- 健康状态
- 系统环境变量
- Spring容器中所有的对象
- SpringMVC映射的所有路径
- ...
添加actuator
1、添加actuator依赖
2、yml配置暴露监控数据
management:
endpoints:
web:
exposure:
include: "*"
#"*" 暴露所有的监控
#health 只暴露健康状态
#["health","beans","mappings"] 暴露指定的多个监控
Hystrix Dashboard
仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
1、Hystrix dashboard依赖
2、@EnableHystrixDashboard(启动类加入)
3、yml - 允许对那台服务器开启监控
server:
port: 4001
#允许对那台服务器开启监控
hystrix:
dashboard:
proxy-stream-allow-list: localhost
#调整Ribbon的重试参数
#针对所有服务的通用配置
ribbon:
MaxAutoRetries: 1
#只针对item-service这一个服务有效
#对其他服务不应用这个配置
item-service:
ribbon:
MaxAutoRetries: 2
Feign
微服务应用中,ribbon 和 hystrix 总是同时出现,feign 整合了两者
集成工具
- 远程调用:声明式客户端
- ribbon负载均衡和重试
- hystrix降级和熔断
声明式客户端接口
只需要声明一个抽象接口,就可以通过接口做远程调用,不需要再使用调用RestTemplate
//调用远程的商品服务,获取订单的商品列表
//通过注解,配置:
//1、调用那个服务
//2、调用服务的那个路径
//3、向路径提交什么参数数据
@FeignClient(name="item-service")
public interface ItemClient(){
@GetMapping("/{orderId}")
JsonResult> getItems(@PathVariable String orderId);
}
在这里使用@GetMapping("/{orderId}"),指定的是向远程服务调用的路径
Feign继承Ribbon
无需额外配置,已经启用了负载均衡和重试
默认重试参数:
- MaxAutoRetries: 0
- MaxAutoRetriesNextServer: 1
- ReadTimeout: 1000
feign 启用 hystrix
feign 默认没有启用 hystrix,添加配置,启用 hystrix
1、yml配置
feign:
hystrix:
enabled: true