Java Chassis3注册中心分区隔离技术解密

 更新时间:2024年01月17日 09:14:35   作者:liubao68  
这篇文章主要为大家介绍了Java Chassis3注册中心分区隔离技术解密,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Java Chassis 3技术解密:注册中心分区隔离

注册中心负责实例的注册和发现,对微服务可靠运行起到举足轻重的作用。实例变更感知周期是注册中心最重要的技术指标之一。感知周期代表提供者的实例注册或者下线后,消费者感知实例注册或者下线的周期。影响实例变更感知周期的技术因素有很多。

  • 数据一致性。一致性指实例在注册中心的一个节点注册,从注册中心的不同节点能否同时读取到实例的注册信息。这个技术因素对于实例变更感知周期有一定影响,比如最终一致性的感知速度会慢,强一致性的感知速度会快。但多数场景,这个技术指标不是核心因素。
  • 变更通知机制。变更通知机制指消费者获取最新实例列表的方式,通常有几种方式:定期Pull的方式,消费者周期性的从注册中心查询实例列表;注册中心Push的方式,注册中心通过长连接、WebSocket等协议,将实例变化通知消费者。定期Pull的方式感知周期相对较长,工作机制比较可靠,容错效率高,对于网络要求低,更加安全;注册中心Push的方式感知周期很短,容易出现事件错乱或者堆积,对于网络规划有一定要求。
  • 注册中心检测实例状态的方式。注册中心检测实例状态的方式表示如何判断实例的状态是正常还是异常。比如Service Center需要实例定期的发送心跳,如果在3个心跳周期未检测到心跳,那么认为实例异常;比如Nacos则根据微服务实例与注册中心的长连接状态判断实例是否异常。

此外,实例管理规模、支持元数据管理等也是注册注册中心比较常见的功能特性。比如Java Chassis 2要求注册中心必须支持契约的注册和管理。

Java Chassis 3的设计目标之一,就是降低对于注册中心功能的依赖,能够支持尽可能多的注册中心,而不降低微服务自身的可靠性。 在描述 Java Chassis 3的实例管理机制之前,先讨论一个典型的问题:注册中心分区隔离。

注册中心分区隔离是指如下场景

微服务提供者与注册中心之间的网络发生故障,而服务消费者与注册中心之间的网络是正常的,即产生分区隔离。在发生分区隔离的场景下,现有的保活机制都会认为微服务提供者下线,进而导致微服务消费者访问微服务提供者出现大规模失败。分区隔离通常会发生在注册中心在多AZ部署/容灾的场景,微服务提供者和微服务消费者连接的是不同AZ的注册中心实例。在微服务提供者和消费者跨AZ部署的时候,也可能发生。

注册中心分区隔离故障会造成大面积的应用调用失败,是注册中心有关故障中,最严重的故障之一。

注册中心有关故障解决方案

Ribbon的解决方案

Ribbon在客户端提供了 IPing 接口来检测实例故障,以检测注册中心错误下线实例,而实例实际可以工作的场景。 该机制在多数场景工作良好,然而在容器场景下,可能长期保留错误的实例。因为微服务提供者不是由于分区隔离错误,而是重启的场景下,如果原来的端口被其他服务占用,则会导致微服务消费者始终保留错误的实例。

public interface IPing {
    boolean isAlive(Server server);
}

Spring Cloud的解决方案

Spring Cloud的机制和Ribbon类似,提供了 HealthCheckServiceInstanceListSupplier ,并允许开发者定义实例监控状态检测方式。

Java Chassis的解决方案

Java Chassis结合实例是否在注册中心查询到(History)、实例状态(Status)、Ping状态(Ping)、隔离状态(Isolation)将实例分组,并给不同的组分配不同的优先级。

在 Java Chassis 3技术解密:负载均衡选择器 中,解密了Java Chassis分组实例使用的机制。当出现注册中心分区隔离的情况,实例在注册中心查询不到,仍然被保留到了 History 分组,只要实例 Ping 状态正常, 这个实例仍然会被使用, 从而防止了实例被错误下线。

Java Chassis还设计了新的Ping机制,解决容器场景下,可能长期保留错误的实例的问题。 Ping机制的核心逻辑包含如下几个部分:

  • 微服务提供者向注册中心注册的时候,生成实例ID。实例ID需要保证进程的每次重启,都是唯一的。
  • 微服务消费者通过PING消息检测微服务提供者的存活状态。PING消息包含微服务提供者的实例ID。
  • 微服务提供者检测PING消息里面的实例ID,如果实例ID与自己的实例ID相同,则返回健康,否则返回异常。

Java Chassis提供了新的健康检查接口

@RestSchema(schemaId = ManagementEndpoint.NAME, schemaInterface = ManagementEndpoint.class)
public class ManagementEndpointImpl implements ManagementEndpoint {
  private RegistrationManager registrationManager;
  @Autowired
  public void setRegistrationManager(RegistrationManager registrationManager) {
    this.registrationManager = registrationManager;
  }
  @Override
  public boolean health(String instanceId, String registryName) {
    String mySelf = registrationManager.getInstanceId(registryName);
    if (StringUtils.isEmpty(mySelf)) {
      return false;
    }
    return mySelf.equals(instanceId);
  }
}

Java Chassis 2结合Service Center的功能设计,共同保障了注册发现的可靠性。Java Chassis 3通过应用客户端技术,降低了对于注册中心的依赖,使得 Java Chassis 3使用不同的注册中心都能够取得很高的可靠性。 内置的实例状态分组管理和创新的Ping机制设计,使得 Java Chassis 3在注册中心分区隔离故障条件下也能稳定的工作。

客户故事:注册中心推空故障是 Nacos 的经典故障,对于系统可靠性运行产生了非常大的影响。推空故障的影响机制和分区隔离故障的影响机制类似。借助于Java Chassis 3,能够将业务影响的时间和范围降到最低。

以上就是Java Chassis3注册中心分区隔离技术解密的详细内容,更多关于Java Chassis3注册中心分区隔离的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Spring Security和JWT实现安全认证机制

    使用Spring Security和JWT实现安全认证机制

    在现代 Web 应用中,安全认证和授权是保障数据安全和用户隐私的核心机制,Spring Security 是 Spring 框架下专为安全设计的模块,具有高度的可配置性和扩展性,而 JWT则是当前流行的认证解决方案,所以本文介绍了如何使用Spring Security和JWT实现安全认证机制
    2024-11-11
  • SpringBoot POST请求接收多个参数值为null问题

    SpringBoot POST请求接收多个参数值为null问题

    SpringBoot接口中POST请求接收JSON数据时,使用简单类型接收会报null,需要封装成实体类或使用Map(并注明泛型)接收,并且使用@RequestBody注解
    2025-02-02
  • 浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及Spr

    这篇文章主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java之StringBuffer常见使用方法解析

    java之StringBuffer常见使用方法解析

    这篇文章主要介绍了java之StringBuffer常见使用方法解析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 一文详解如何通过Java实现SSL交互功能

    一文详解如何通过Java实现SSL交互功能

    这篇文章主要为大家详细介绍了如何通过Java实现SSL交互功能,文中的示例代码讲解详细,对我们的学习或工作有一定的帮助,需要的可以参考一下
    2023-04-04
  • Java Assert.assertEquals案例详解

    Java Assert.assertEquals案例详解

    这篇文章主要介绍了Java Assert.assertEquals案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 全面分析Java方法的使用与递归

    全面分析Java方法的使用与递归

    在java中,方法就是用来完成解决某件事情或实现某个功能的办法;程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。但是如果没终止条件会造成死循环,所以递归代码里要有结束自调自的条件,本篇接下来讲解一下方法与递归
    2022-04-04
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis关于项目工程化与常规操作流程
    2021-10-10
  • Java基于JNDI 实现读写分离的示例代码

    Java基于JNDI 实现读写分离的示例代码

    本文主要介绍了Java基于JNDI 实现读写分离的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java开发完整短信验证码功能的全过程

    Java开发完整短信验证码功能的全过程

    利用短信验证码进行身份验证是目前互联网众多产品常用的一种方式,那么这种短信验证功能是如何实现的呢,下面这篇文章主要给大家介绍了关于Java开发完整短信验证码功能的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论