Eureka
Register服务注册
- Eureka Client在第一次心跳时间向Eureka Server注册
- 注册时会提供诸多自身元数据:主机名、端口、健康指标URL等
Renew服务续约
- Eureka Client通过发送心跳进行续约
- 默认每30秒发送一次心跳
- 如90秒内Eureka Server未收到续约,则提出该服务
Cancel服务下线
- Eureka Client优雅退出时发送cancel命令
- Eureka Server收到cancel命令时会删除该节点
获取注册表信息
-
Eureka Client会缓存由Server获取的注册表信息
-
Eureka Client会定期更新注册表信息,默认30秒
-
Eureka Client会处理注册表合并等内容
Eureka与Zookeeper
-
分布式基础:CAP理论
- 一致性:Consistency
- 可用性:Availability
- 分区容错性:Partition tolerance
-
Eureka主要保证AP
-
Zookeeper是典型的CP
Eureka注册慢问题
- 注册慢的根本原因在于Eureka的AP特性
- Eureka Client延迟注册,默认30秒
- Eureka Server的响应缓存,默认30秒
- Eureka Server的缓存刷新,默认30秒
Eureka的自我保护
- Eureka Server会自动更新续约更新阈值
- Eureka Server续约更新频率低于阈值时进入保护模式
- 自我保护模式下Eureka Serve不会剔除任何注册信息
Ribbon
- Ribbon客户端负载均衡器
- Ribbon核心功能
- 服务发现
- 服务选择规则
- 服务监听
哪些内容能被负载均衡:ServerList
怎么负载均衡:负载均衡算法
IPing:探测服务存活状态
Ribbon与Eureka整合
- Ribbon天然与Eureka无缝整合
- 通过@LoadBalanced提供负载均衡支持
- 通过ribbon.eureka.enabled=false禁用Eureka
Ribbon核心之IRule
-
IRule通过特性算法选取要访问的服务
-
IRule常用BestAvallableRule和WeightedResponseTimeRule
IRule算法 | 算法描述 |
---|---|
RoundRobinRule | 轮询规则 |
RandomRule | 随机规则 |
AvailabilityFilteringRule | 可用过滤规则 |
WeightedResponseTimeRule | 根据平均响应时间计算所有服务的权重 |
RetryRule | 遵循RoundRobin规则处理,但是会对失败的服务进行重试 |
BestAvailableRule | 结合了可用过滤规则和响应时长规则 |
ZoneAvoidanceRule | 复合判断server所在区域性能和可用性选择服务器 |
Ribbon自定义规则
Ribbon核心之IPing
- IPing是Ribbon保证服务可用的基石
- 常见实现:NIWSDiscoveryPing、PingUrl
IPing算法 | 算法描述 |
---|---|
NIWSDiscoveryPing | 不执行Ping操作,根据Eureka Client的反馈判断存活 |
PingUrl | 使用HttpClient对服务进行Ping操作 |
DummyPing | 默认返回true |
NoOpPing | 永远返回true |
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule iRule(){
return new RoundRobinRule();
// return new MyRule();
}
@Bean
public IPing iPing(){
// return new PingUrl(false,"/abc");
return new NIWSDiscoveryPing();
}
}
Ribbon参数配置
-
默认参数配置:DefaultClientConfigImpl
-
Ribbon Key定义:CommonClientConfigKey
-
Ribbon参数分为全局配置和指定客户端配置
-
参数格式:.ribbon.=
ribbon: MaxAutoRetuies:3 hello-service-provider: ribbon: MaxAutoRetries:3
Ribbon核心之ServerList
- ServerList是Ribbon存储的可用服务列表
- ServerList可以手动设置
- ServerList常见应用是从Eureka中自动获取
Hystrix
执行流程:
- 调用“main”方法,command、abservable command
- 判断有没有缓存
- 熔断有没有开启
- 限流有没有触发
- 业务执行有没有失败
- 业务执行有没有超时
- 所有的失败都会触发fallback
- 业务直接返回
-
Hystrix是用于处理延迟和容错的开源库
-
Hystrix主要用户避免级联故障,提高系统弹性
-
Hystrix解决了由于扇出导致的"雪崩效应"
-
Hystrix核心是“隔离术“和熔断机制
扇出&雪崩
Hystrix主要作用
- 服务隔离和服务熔断
- 服务降级、限流和快速失败
- 请求合并和请求缓存
- 自带单体和集群监控
Feign
- Feign是一个非常好用的HTTP客户端
- Feign很大程度上简化了HTTP调用方式
- Feign很好的弥补了SpringCloud的HTTP调用缺陷
Feign的特性
- Feign实现了可插拔注解支持,包括Feign和JAX-RS注解
- Feign支持可插拔的HTTP编码器和解码器
- Feign支持HTTP请求和响应的压缩
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = "hello-service-provider",
primary = true,
path = "/provider",
fallbackFactory = FallbackFactory.class
// fallback = ProviderFallbackAPIImpl.class
// configuration = FeignHelloConf.class,
// url = "http://localhost:7101"
)
public interface ProviderApi {
@RequestMapping(value = "/sayhello",method = RequestMethod.GET)
String invokerProviderController(@RequestParam("message") String message);
// @RequestLine("GET /sayhello?message={message}")
// String invokerProviderController(@Param("message") String message);
// @RequestMapping(value = "/{providerId}/sayhello",method = RequestMethod.POST)
// String providerPost(
// @RequestHeader("author") String author,
// @PathVariable("providerId")String providerId,
// @RequestBody UserModel userModel);
}
Feign基础参数
- name和value
- url:手动指定Http调用地址
- Path:接口统一前缀
- primary:多实现制定优先级
- configuration:自定义Feign配置
- FallbackheFallbackfactory:降级统一处理
Feign的配置
配置类型 | 默认配置 |
---|---|
feignDecoder | ResponseEntityDecoder |
feignEncoder | SpringEncoder |
feignLogger | Slf4jLogger |
feignContract | SpringMvcContract |
feignBuilder | HystrixFeign.Builder |
feignClient | LoadBalancerFeignClient/feignClient |
Feign多组件集成
-
Feign可以集成Ribbon实现负载均衡
-
Feign可以集成Hystrix实现命令封装
-
Feign可以集成Hystrix实现业务降级
Gateway
-
SpringCloud Gateway是Spring官方提供的API网关
-
Gateway是基于Spring5和SpringBoot2开发的
-
Gateway是基于Netty开发的异步调用网关
Gateway特性
- 提供路由和限流等措施
- 易于编写的Predicate和Filter,提供了良好的扩展性
- 提供了Discovery和Hystrix集成
Predicate使用
- Predicate是路由匹配规则,满足条件即可触发路由
- Predicate可以进行自定义,满足个性化要求
- SpringCloud Gateway预置了许多Predicate
类型 | 作用 | 入参 |
---|---|---|
After | 在该日期之后发生的请求都讲被匹配 | 日期时间 |
Before | 在该日期之前发生的请求都讲被匹配 | 日期时间 |
Between | DateTime1和DateTime2 | 日期时间,日期时间 |
Cookie | 请求包含次cookie名称且正则表达式为真的将会被匹配 | cookie名称和正则表达式 |
Header | 请求包含次header名称且正则表达式为真的将会被匹配 | header名称和正则表达式 |
Host | 使用Ant路径匹配规则,“.“作为分隔符 | host name列表 |
Method | 需要匹配的HTTP请求方式 | HTTP Method字符串 |
Path | 判断请求路径是否满足要求 | Path表达式和可选标识 |
Filter使用
- Filter可以对Request进行请求过滤处理
- Gateway的Filter分为全局和局部两种
- Filter除了过滤还可以对请求内容进行增强处理
全局Filter
类型 | 作用 |
---|---|
LoadBalancerClientFilter | 负载均衡过滤器 |
Netty Routing Filter | 默认使用netty的底层 |
RouteToRequestUrlFilter | 新的请求路由 |
Websocket Routing Filter | websocket路由 |
Gateway Metrics Filter | 路由监控,配合spring-boot-ostarter-actuator |
局部Filter
类型 | 作用 |
---|---|
AddRequestHeader | 添加请求header |
AddRequestParameter | 添加请求参数 |
AddResponseHeader | 添加响应header |
DedupeResponseHeader | 响应头去重 |
Hystrix GatewayFilters | 断路器的开关 |
PrefixPath | 路径匹配 |
PreserveHostHeader | 发送原始host |
RequestRateLimiter | 限流 |
RedirectTo | 重定向 |