1.组件
2.服务注册与发现
注册中心的主要功能如下:
(1)服务注册表维护:此功能是注册中心的核心,用来记录各个服务提供者实例的状态信息。注册中心提供Provider实例清单的查询和管理API,用于查询可用的Provider实例列表,管理Provider实例的上线和下线。
(2)服务健康检查:注册中心使用一定机制定时检测已注册的Provider实例,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。
服务提供者的主要功能如下:
(1)服务注册:是指Provider微服务实例在启动时(或者定期)将自己的信息注册到注册中心的过程。
(2)心跳续约:Provider实例会定时向注册中心提供“心跳”,以表明自己还处于可用的状态。当一个Provider实例停止心跳一段时间后,注册中心会认为该服务实例不可用了,就会将该服务实例从服务注册表中剔除。如果被剔除掉的Provider实例过了一段时间后又继续向注册中心提供心跳,那么注册中心会把该Provider实例重新加入服务注册表中。
(3)健康状况查询:Provider实例能提供健康状况查看的API,注册中心或者其他的微服务Provider能够获取其健康状况。
服务提供者的服务注册和心跳续约一般都会通过注册中心客户端组件来完成。注册中心客户端组件还有如下功能:
(1)服务发现:从注册中心查询可用Provider实例清单。
(2)实例缓存:将从注册中心查询的Provider实例清单缓存到本地,不需要在每次使用时都去注册中心临时获取。
Spring Cloud Netflix Eureka
Eureka 服务端的三级缓存模型
● a. registry :存储服务实例信息 (服务上下线实时更新)
● b. readWriteCacheMap :读写缓存 (实时从 registry 中更新,过期时间 180s )
● c. readOnlyCacheMap :只读缓存,默认从这里获取服务信息 (每隔 30s 从 readWriteCacheMap 更新)
- Eureka 消费端每隔 30s 请求 Eureka 服务端获取增量更新,然后更新本地服务列表
Ribbon 客户端每隔 30s 从 Eureka 客户端的本地服务列表中
自我保护模式
如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
详解Eureka缓存机制
Spring Cloud Consul
- 应用内/外:属于外部应用,侵入性小
- CAP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。
- 版本迭代:目前仍然进行版本迭代
- 集成支持:支持SpringCloud K8S集成
- 访问协议:HTTP/DNS
- 雪崩保护:不支持雪崩保护
- 界面:英文界面,不符合国人习惯
- 上手:复杂一点
Spring Cloud Zookeeper
zookeeper作注册中心缺点:
- 当注册中心的服务规模超过一定数量的时候,zk不能很好的工作,不能支持很高的tps和TCP长连接
- zk的写请求是不是可扩展的
- zk提供的Service Health Check功能很弱,基于zk的session活性检查和临时节点监听机制上,不能真正反应服务的健康状态
- zk原生客户端没有提供数据缓存机制,当注册中心宕机的时候,会造成服务不可用
- zk原生客户端不好用,难以掌握Client/Session状态机,zk的客户端和服务端交互协议不简单,比如:TCP长连接Session管理,Ephemeral Znode(临时节点),Event&Notification(事件订阅通知),ping(心跳检测)
- 复杂的异常处理,ConnectionLossException和Disconnected事件
- 集群会短暂的不可用 CP
Spring Cloud Alibaba Nacos
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
对比
| | Zookeeper | Eureka | Consul | Nacos | | —- | —- | —- | —- | —- | | 一致性协议 | CP | AP | CP | CP+AP | | 健康检查 | Keep Alive | Client Beat | TCP/HTTP/gRPC/Cmd | 权重/metadata/Selector | | 负载均衡策略 | 无 | Ribbon | Fabio | 有 | | 雪崩保护 | 无 | 有 | 无 | 有 | | 自动注销实例 | 支持 | 支持 | 支持 | 支持 | | 访问协议 | TCP | HTTP | HTTP/DNS | HTTP/DNS | | 监听支持 | 支持 | 支持 | 支持 | 支持 | | 多数据中心 | 不支持 | 支持 | 支持 | 支持 | | 跨注册中心同步 | 不支持 | 不支持 | 支持 | 支持 | | SpringCloud集成 | 支持 | 支持 | 支持 | 支持 | | Dubbo集成 | 支持 | 不支持 | 支持 | 支持 | | K8S集成 | 不支持 | 不支持 | 支持 | 支持 |
3.服务调用
客户端负载均衡器
- Spring Cloud Netflix Ribbon
-
RPC调用
-
Feign与OpenFeign区别
Feign超时机制
https://blog.csdn.net/zjj2006/article/details/109628470
OpenFeign 客户端默认等待1秒钟,但是如果服务端业务超过1秒,则会报错。为了避免这样的情况,我们需要设置feign客户端的超时控制。
办法:由于OpenFeign 底层是ribbon 。所以超时控制由ribbon来控制。在yml文件中配置 Dubbo
https://doocs.gitee.io/advanced-java/#/./docs/distributed-system/dubbo-operating-principle
Dubbo工作原理
https://doocs.gitee.io/advanced-java/#/./docs/distributed-system/dubbo-operating-principle