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<List<Item>> 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