(十一)微服务专项

1、微服务CAP

 

一致性C:所有节点在同一时间,数据完全一致;

可用性A:服务可用,且能正常响应;

容错性P:某节点有故障,仍能对外提供可用性和一致性的服务;

分析:提高容错,需要多节点;节点增多,难保一致性,需要更多时间同步;确保多节点一致性同步耗时增多,节点可用性下降

我们的希望:注册中心的注册信息可以是几分钟前的旧数据,而不是注册中心直接挂掉,即:可用性>一致性;金融业界希望CP,根据实际业务取舍;

CA权衡的base理论:基本可用(但功能性能有影响)、软状态(存在中间状态的数据,不同节点数据有延迟)、最终一致性(无新更新下数据最终都是一致的)

 

2、zk、nacos、Eureka

ZK:强调CP(一致性和容错性),可用性低;当master发生故障时,剩余节点会重新选举leader,选举耗时30-120s,期间服务不可用;

Eureka:强调AP(可用性和容错性),一致性低;各个节点平等;

nacos:AP+CP混合制,默认是AP,但可以设置成CP;

Eureka、nacos 都有防雪崩逻辑,且都是http协议,zk是tcp;

 

ZK:zab协议:分布式一致性算法,崩溃恢复和消息广播;发现、同步、广播;选举leader并维护follower列表,同步数据到follower,新的数据广播到follower;

  Raft协议:日志复制,记录命令为日志,强调leader和follower的执行日志保持一致,从而达到一致性;

  选举流程:初始轮次+投票,接收投票 轮次和pk票,变更投票 统计,更改状态;  Observer不参与投票和事务提交,提高读性能;新节点/宕机不影响,leader挂了才影响会重选;非观察者全转LOOKING状态;

         初始流程-服务器LOOKING状态下,每个服务投票vote(sid服务器ID/服务器编号, ZID事件发生时间戳/节点创建最新修改时间戳)和自己的self()比较,先value后key取大发出去;Leader变Leading,Follower变Following状态;

  选举代码详解:选举类quorumPeer.start()磁盘读数据+上下文+选举;run方法有makeLeader()/makeFollower()创建;leader.lead()创建StateSummary标记最新事务和提交次数+与Learner单线程长连接+LearnerHander监控新节点;

  followLeader方法-Follower.registerWithLeader()建立长链接5次+syncWithLeader()去同步数据-清空/删除无效;

Eureka:Client向Server注册服务ip端口url,消费者向注册中心获取提供者地址缓存到本地,从缓存读取调用;注册中心向订阅者提供宕机信息;节点每30s向注册中心发送心跳续约服务;90S无心跳剔除注册列表;  

  自我保护:统计15分钟内的失败比例,大于85%则不剔除防误杀,等待恢复心跳;

  工作流程:等待注册或集群复制;注册/心跳续约/自我保护;获取服务到本地缓存;缓存无服务去注册中心刷新再缓存;缓存获取地址调用;

Nacos和Eureka:负载均衡Feign:

 

Nacos = Spring Cloud注册中心 + Spring Cloud配置中心

 

Spring cloud Alibaba

JDK版本分:功能版(9、10,半年就不维护)和稳定版(8、11)

 

分布式服务 Dubbo Spring cloud
应用场景 zookeeper + dubbo + springmvc/springboot SpringCloud Spring Alibaba Cloud
通信方式 rpc http restful http restful
服务发现注册 zookeper/redis/nacos eruka nacos
配置中心 nacos config nacos
断路器-限流降级   hystrix sentinel
网关   zuul/gateway gateway
路径跟踪   sleuth+zipkin
服务调用   Feign、Ribbon
说明  

zuul、eureka、hystrix已不再更新;

两个cloud已经整合可相互支持;

 

rpc和restful:rpc是基础TCP协议实现的,性能好;restful是基于http协议实现的,类似于调用方法一样远程调用,易于测试。灵活度高;

nacos:

sleuth:链路跟踪;(应用名称,链路ID,本单元ID,是否输出到zipkin服务展示收集);

zipkin:服务性能监控;用于展示和存储链路跟踪数据;

sentinel:流量监控、限流等;监控访问,被访问才会发现;监控流量或并发线程数,设置拒绝或排队;

gateway:路由转发(匹配路由规则)、过滤限流;

Ribbon:负载均衡,@LoadBalanced注解:实际是调用RibbonLoadBalance类的集成的父类BaseLoadBalance的chooseServer()方法,父类实现内容是:调用Rule对象的choose()方法;Rule对象是根据规则选择不同类生成的(轮训类、权重、固定);

Feign:默认集成了了ribbon,写起来更更加思路路清晰和⽅方便便,采⽤用注解⽅方式进⾏行行配置,配置熔断等⽅方式⽅便,

posted on 2021-05-18 14:31  奇天异下  阅读(80)  评论(0编辑  收藏  举报

导航