nacos注册机制:
客户端向注册服务器发起注册请求,服务器对注册表进行写时复制(copy on write),获取注册表副本,将改变的信息添加到注册表副本中,再替换注册表;为保障数据准确性,Nacos异步接收处理注册信息,同步更新注册表数据(使用blockingQueue内存队列保证注册表更新的原子性)。
Nacos注册表结构:Map<namespace,Mapgroup::serviceName,Service>
为什么使用双重Map结构?
单一的Map结构虽然可以实现注册表,但使用的场景单一,不利于不同场景下业务应用的扩展,使用双重Map提高了注册表的可扩展性,从而适用于更多的应用场景。
Eureka注册机制:
Eureke通过实现二级缓存(读写缓存、只读缓存)来更新注册表,客户端发起请求更新注册信息,服务器接收到请求修改注册表,服务器定时将注册表数据更新到读写缓存,再更新到只读缓存中,最后客户端从只读缓存中获取注册信息。
sentinel: 做限流、降级、熔断 sentinel使用滑动窗口算法来对服务进行限流。 (可以下载jar包,通过服务端进行服务配置。)
seata: 做分布式事务管理(可以下载jar包,通过服务端进行服务配置。)
主要使用AT模式
利用数据库undo日志(回滚日志),当业务异常,seata会通过undo日志找到成功添加的数据进行数据删除。
关于分布式事务模式,seata可分为如下几种:
- AT:Auto Transaction,基于支持本地ACID事务的关系型数据库,对业务无侵入;
- MT:Manual Transaction,不依赖于底层数据资源的事务支持,需自定义prepare/commit/rollback操作,对业务有侵入;
- XA:基于数据库的XA实现,目前最新版seata已实现该模式。
- TCC:TCC模式,对业务有侵入。
由于目前seata场景中使用AT模式较多,因此本文主要分析AT模式流程。
AT模式的前提是基于支持本地 ACID 事务的关系型数据库和Java应用基于JDBC访问数据库。AT模式是二阶段提交协议的演变:
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:commit异步化快速完成;rollback通过一阶段的回滚日志进行反向补偿。
Ribbon与Nginx区别:
Ribbon是本地负载均衡,nginx为客户端负载均衡;
Ribbon:通过轮询、权重等算法实现负载均衡算法。
OpenFegin:底层调用Ribbon负载均衡代理。