1.服务注册发现:
    目的:服务注册与发现就是保证当服务上下线发生变更时,服务消费者和服务提供者能够保持正常通信。最大的用处就是解决需要在网关或者 LB 中,手动配置服务地址的问题。你可以无须手动配置,自动地让调用端服务发现被调用端服务的机器节点。
    健康检查设计方案:
    服务主动探活:要求服务节点主动向注册中心续约,续约时要携带服务信息。缺点:注册中心写操作多,如果节点变化大,注册中心压力大,还会产生大量通知事件。如果注册中心无法响应续约请求,大量节点会失效。节点发起续约也不一定代表节点是健康的。
    注册中心主动检查节点:服务注册时向注册中心表明自己的健康检查接口,注册中心定时访问。一定程度上解决探活不能反应健康度的问题。缺点是k8s有ip重用问题(一个服务停了,起另一个服务,可能用的还是那个旧的IP),直接访问而没有其他保障机制会有问题。
    调用方负载均衡器检查,注册中心不检查:也有ip重用问题。
    注册中心选型:
    image.png
    一般来说,AP的选择好于CP的选择。
    注册中心有关问题与方案:
    注册中心挂了,服务能不能正常访问:缓存是注册中心的一个必然选择,所以仍然会访问缓存的服务节点。但是服务注册是失效的,扩容也不能进行。容器ip重用等会导致异常。
    注册中心由于高负载,推送了异常数据,服务还能不能正常访问:客户端有自我保护机制,节点数量下降过快过多,会放弃使用新推送的注册信息。这种故障的场景是服务过多,注册中心压力大,处理不了续约和注册。如果节点接受这样的信息,部分服务就会因为压力过高被打挂。
    新添加的节点与注册中心连接正常,但不能连接到其他服务,会怎么处理:客户端负载均衡有被动健康检查(熔断器)和主动健康检查剔除失效节点。
    服务该不该信任注册中心的数据:Envoy不信任,更多的看本地信息。
    节点频繁变更造成广播风暴,怎么办:按批次广播,产生信息后等100ms,如果没新的信息再发。有新的信息就更新组合,再等100ms。
    service mesh会怎么做服务注册:
    无需自身注册,sidecar代理注册。主要是减少信息不一致性,减轻服务负担,更好的维护metadata。
    控制面聚合多种、多个注册中心。降低注册中心读写压力,方便水平扩展。
    通过 sidecar 提供服务正确性 check 功能。解决ip重用问题,通过header中增加服务名实现。
    2.负载均衡器:
    主要分为硬件负载均衡(冢中枯骨),DNS负载均衡(实时性差,用的多),软件负载均衡(如nginx、LVS等),程序内负载均衡(微服务套件),service mesh负载均衡(sidecar负载均衡)。
    常见算法:简单轮询、权重轮询、权重随机、二次择优(当权重一致,两次随机拿到两个节点,选择一个最优节点)、会话保持(实际成为有状态的服务,不推荐)
    负载均衡的职责:
    主动健康检查:本来是注册中心的职责,由于上文所述原因,成为负载均衡的一个可选的实现。Envoy就在负载均衡中实现了这个功能。但是总是ping会增加服务负担,提高负载,一般只有可选节点少的时候才主动检查。
    被动健康检查:指的是断路器。通过状态码判断服务是否可用,一个滑动窗口内达到预设的失败比例触发熔断。