背景
IPv4 协定(后文简称 IPv4)为互联网的倒退与遍及做出了重要奉献,但近年来,随着应用程序、数据和 IT 服务的爆炸式增长。当初协定设计过程中用来形容 IP 地址所采纳的 32 位二进制数格局的 IPv4 地址曾经于 2011 年 [1] 被申请耗尽,从那时起,全世界都曾经处于无新地址可用的场面。
IPv6 协定(后文简称 IPv6)作为 IPv4 之后被采纳的下一代互联网协议,相比 IPv4 协定中采纳 32 位来示意 IP 地址,其地址示意位数裁减到了 128 位,地址数量是 IPv4 所能提供的 2 的 96 次方倍。简略看数字可能显得不太直观,换成一句形容 IPv6 地址之多更直观和经典的话:“采纳 128 位示意地址的 IPv6 能够为地球上的每一粒沙子都调配一个 IP 地址”!此外,IPv6 协定其不仅能够解决 IPv4 协定中的地址短缺问题,同时也能为互联网提供更高效、更平安的网络通信。IPv6 协定在网络通信中提供了许多新的性能和劣势。例如,在数据传输和路由方面,其通过新的设计进步了效率和可靠性,缩小了网络拥挤和数据包失落的状况。此外,在平安畛域,其内置对 IPSec 的反对,能够更好地爱护网络中的数据传输平安,避免黑客攻击和窃取数据。
作为下一代互联网协议,向 IPv6 迁徙是将来的大势所趋。在我国,从 2014 年开始相干机构曾经逐渐进行向新用户和利用调配 IPv4 地址,开始全面商用 IPv6 协定 [2]。在政府疏导测,近年来,陆续也出台了一系列相干领导文件例如:2017 年国务院公布的《推动互联网协议第六版(IPv6)规模部署行动计划》[3]、2021 年工业与信息化部公布的《IPv6 流量晋升三年专项行动计划(2021-2023 年)》[4]、2021 年网信办公布的《对于推动 IPv6 规模部署的领导意见》[5] 等一直地在疏导企业从 IPv4 协定向 IPv6 协定迁徙。
但因为以后互联网中 IPv4 协定的利用规模十分大,对于用户来说,没方法通过规定一个工夫日期,从那一刻开始,所有互联网上的设施全副应用 IPv6,这是不事实的。一次性迁徙不仅在基础设施层面不可行,对企业用户来说,就算基础设施都能筹备结束,让其将少则上百,多则成千上万的利用实例在一段时间内一次性停机进行协定栈迁徙,无论是在危险上,还是老本上,对企业用户来说都是难以承受的!既然无奈一步到位,渐进式的 IP 地址迁徙成为以后的支流抉择。接下来本文将介绍一些支流渐进式的 IP 地址迁徙办法。
迁徙计划
尽管 IPv6 协定具备许多劣势,然而其推广和利用依然面临许多挑战。IPv6 的遍及须要寰球范畴内的配套根底措施和反对,包含网络设备的更新、人员培训和政策法规的推动等等。同时,IPv6 与 IPv4 之间的兼容性也是一个重要的问题,须要通过技术手段和过渡机制来解决。
常见的 IP 协定渐进式迁徙共存计划,次要有双栈(Dual Stack)、隧道(Tunneling)等技术。其中,双栈技术是目前业界利用较为宽泛的一种 IPv4/IPv6 共存的一种技术,其目标是在互联网齐全适度到 IPv6 之前,通过为设施装置 IPv4 和 IPv6 双协定栈。具备双栈的设施能够实现与单 IPv4、单 IPv6 或者双栈的设施进行通信。通过让各种协定栈能共存,渐进式地进行 IP 协定栈的迁徙。像 Kubernetes 很早也曾经对双栈性能 [6] 进行了反对。
隧道技术是一种把 IPv6 地址封装到 IPv4 数据报中的办法,当数据从 IPv6 单协定栈收回后,在通过 IPv4 单栈网络环境的过程中,将 IPv6 地址封装到 IPv4 数据报作为 IPv4 数据报内容后,通过 IPv4 协定栈进行传输。在通过 IPv4 单栈环境后,来到 IPv6 单栈环境时,再将数据报中的 IPv6 数据段内容解析进去,结构新的 IPv6 数据报在 IPv6 协定栈环境中进行传输。
微服务双栈迁徙计划
上文介绍的计划更多的是一般化的方法论。但具体到微服务零碎中,近程调用过程如何实现多协定栈共存以便帮忙企业用户平滑进行协定栈的迁徙呢?
上图是以后业界微服务零碎中服务之间广泛采纳的近程调用过程架构图,本文接下来介绍如何基于双栈技术实现微服务利用的协定栈平滑迁徙的罕用形式。
双注册双订阅实现协定栈平滑
迁徙在微服务零碎中,相比于单栈环境下,只有一个 IP 地址,微服务的注册与发现过程都基于该地址实现服务近程调用。在多协定栈共存的环境中,其本质就是要解决服务注册和发现过程怎么应用 IP 地址的问题。
梳理分明了问题,就不难发现基于双注册双订阅的办法能够较好地解决微服务零碎中多协定栈共存的问题,以便实现微服务零碎协定栈的平滑迁徙。该计划的服务注册和订阅过程能够被形容为下图所示:
采纳双注册双订阅实现微服务零碎平滑进行 IP 协定栈迁徙的过程能够被大抵形容为以下步骤:
- 在新的利用降级或者发版之前,对相干微服务利用所在宿主机进行 IP 地址协定栈降级革新,让其同时反对 IPv4 和 IPv6 双协定栈。
- 通过步骤 1 革新的微服务利用,在微服务框架层面,通过一个双栈地址提取模块提取利用宿主机中无效的 IPv4 和 IPv6 地址,并通过服务注册模块,将双栈地址都注册到注册核心。
- 消费者订阅注册核心中的某个服务的 IPv4 和 IPv6 双栈地址,通过应用服务框架层面的双栈地址解析模块,比对宿主机所反对的协定栈类型,如果宿主机仅反对 IPv4 协定,则应用提供者的 IPv4 地址发动服务调用;如果仅反对 IPv6 或同时反对双栈,则用提供者的 IPv6 地址发动服务调用;
- 当零碎中的所有微服务都实现反对 IPv6 协定栈的反对后,逐渐对所有利用宿主机敞开 IPv4 协定栈,从而平滑实现大规模微服务零碎从 IPv4 协定栈到 IPv6 协定栈的迁徙。
基于 DNS 技术实现协定栈平滑迁徙
双注册双订阅的办法尽管很天然和清晰,然而其因为服务注册过程中针对双栈环境中的利用会多注册一条 IP 地址对应的记录,会升高注册核心的服务承载量。
因而,也能够基于 DNS 技术实现多协定栈共存,解决微服务零碎协定栈迁徙的办法。其本质是将原来的注册服务实例地址过程变成注册服务实例域名(这里域名更多是实例标识作用),可实现在注册核心所注册服务实例记录数量不变的状况下,通过额定的 DNS 域名零碎存储服务域名所对应的双栈 IP 地址,从而实现多协定栈的共存。采纳该计划的服务注册和订阅过程如下图所示:
基于 DNS 技术实现微服务零碎平滑进行 IP 地址迁徙的过程能够被大抵形容为以下步骤:
- 在新的利用降级或者发版之前,对相干微服务利用进行 IP 地址协定栈革新,让其同时反对 IPv4 和 IPv6 双协定栈。革新后的利用须要将本机的双栈 IP 地址信息和本利用实例特点的域名注册到零碎的 DNS 服务上。
- 实现域名注册后,利用实例将本地域名注册到注册核心。
- 消费者订阅注册核心中的某个服务所有实例的域名,通过利用框架层面的域名解析模块,向零碎中的 DNS 服务发动基于域名解析申请,在通过 DNS 获取到示例域名对应的 IP 地址后,比对宿主机所反对的协定栈类型,如果宿主机仅反对 IPv4,则应用 IPv4 地址发动服务调用;如果仅反对 IPv6 或同时反对双栈,则优先应用 IPv6 地址发动服务调用;
- 当零碎中的所有微服务都实现反对 IPv6 协定栈的反对后,逐渐对所有利用宿主机敞开 IPv4 协定栈,从而平滑实现大规模微服务零碎从 IPv4 协定栈到 IPv6 协定栈的迁徙。
相比于双注册双订阅形式,基于 DNS 的办法能够较好地解决双注册双订阅过程中带给注册核心的多余压力,但 DNS 的高可用也是企业用户须要特地留神的点。
实际
Spring Cloud Alibaba 作为利用宽泛的微服务框架,目前在 2021.0.5.0 版本中曾经提供了微服务场景下的不同协定栈利用互通共存计划,以便帮忙企业用户实现大规模微服务零碎的协定栈迁徙能力。社区计划基于双注册双订阅实现,利用启动后会默认将微服务的 IPv4 地址和 IPv6 地址注册到注册核心中,其中 IPv4 地址会寄存在 Nacos 服务列表中的 IP 字段下,IPv6 地址在 Nacos 的 metadata 字段中,其对应的 Key 为 IPv6(能够解决一般双注册双订阅过程中的同一个服务实例有两条记录,对注册核心造成压力的问题)。当服务消费者调用服务提供者时,会依据本身的 IP 协定栈反对状况,抉择适合的 IP 地址类型发动服务调用。具体规定:
1. 服务消费者自身反对 IPv4 和 IPv6 双协定栈或仅反对 IPv6 协定栈的状况下,服务消费者会应用服务提供的 IPv6 地址发动服务调用;
2. 服务消费者自身仅反对 IPv4 单协定栈的状况下,服务消费者会应用服务提供的 IPv4 地址发动服务调用。
利用配置
相比于个别应用 Spring Cloud Alibaba 构建微服务,要应用协定栈共存迁徙性能须要对利用减少如下配置:
服务注册
目前,应用反对协定栈共存迁徙性能的 Spring Cloud Alibaba 版本当前,服务提供者在进行服务注册过中,不须要做任何配置,会默认查看以后利用所反对的协定栈状况,如果默认是单 IPv6 或 IPv4 协定栈,则仅注册相应的地址。如果利用反对双栈,则会主动获取利用的 IPv6 地址,而后,将 IPv6 地址作为利用实例的服务示例元数据注册到注册核心上。
服务生产
如果利用是采纳 Spring Cloud Alibaba 2021.0.5.0 版本,默认应用 Spring Cloud LoadBalancer 负载平衡策略,须要在消费者利用 application.properties 配置文件中减少如下配置开启协定栈共存迁徙性能:
spring.cloud.loadbalancer.ribbon.enabled=false
spring.cloud.loadbalancer.nacos.enabled=true
成果演示
为了便于演示,本文间接基于阿里云容器服务 ACK[7]构建了一个双栈环境,来进行双栈环境的服务注册与生产演示。
服务注册
如下本文演示用的服务提供者实例 Pod 信息:
基于 Spring Cloud Alibaba 协定栈共存迁徙性能,其在注册核心上的服务实例列表信息:
服务生产
单栈环境服务消费者:
服务调用胜利当前,服务提供者会打印调用消费者的调用 IP 地址:
从上述返回后果来看,IPv4 单栈环境中的消费者因为仅反对单栈,所以始终通过 IPv4 协定栈向双栈服务提供者发动申请。
双栈环境服务消费者:
服务调用胜利当前,服务提供者会打印调用消费者的调用 IP 地址,能够看到打印的是消费者的 IPv6 地址:
从上述返回后果来看,IPv4/IPv6 双栈环境中的消费者因为反对 IPv6,为了实现协定栈向 IPv6 的迁徙,所以默认始终通过 IPv6 协定栈向双栈服务提供者发动申请。
社区近期动静
新版本公布
社区近期公布了反对上述 IPv6 平滑迁徙能力的 Spring Cloud Alibaba 2021.0.5.0 版本,是在 Spring Cloud 2021.0.5、Spring Cloud 2.6.13 的根底上对其中包含注册配置核心、分布式事务等在内的泛滥组件进行了降级,属于一个组件降级与 Bug 批改的版本。本次公布的 Spring Cloud Alibaba 2021.0.5.0 版本对以下组件版本进行了降级或者优化:
- Seata
降级到了 1.6.1 版本[8],该版本相比于之前的 1.5.x 版本,曾经实现 MySQL updatejoin,PostgreSQL & Oracle 多主键等性能反对,在 InsertOnDuplicateUpdate 上做了肯定优化。
- Sentinel
降级到了 1.8.6 版本[9],该版本调整了 Sentinel 规定类中的个别属性,修复了 SpiLoader#closeResources 中抛出异样后无奈记录异样对象。
- Nacos
降级 Nacos 客户端到 2.2.0 版本[10],该版本新增了包含批量服务注册与登记、数据源插件化等相干能力。
除了组件降级,另外也修复和优化了一些之前版本所存在的问题。例如,解决 Nacos 客户端日志打印被重定向到规范输入、重构 Seata 客户端 XID 传递实现形式解决与内部局部组件一起应用过程中存在的潜在抵触、RocketMQ 提供者对象实例反对复用等,进一步晋升了 Spring Cloud Alibaba 应用的稳定性与健壮性。更多内容可参见该版本相干发版布告[11]。
相干链接:
[1] https://www.infoq.cn/article/vpdcmupcw3mev3l2kx41
[2] 计算机网络(第七版)谢希仁
[3]《推动互联网协议第六版(IPv6)规模部署行动计划》http://www.gov.cn/zhengce/2017-11/26/content_5242389.htm
[4]《IPv6 流量晋升三年专项行动计划(2021-2023 年)》http://www.xinhuanet.com/info/2021-07/09/c_1310052164.htm
[5]《对于推动 IPv6 规模部署的领导意见》http://www.gov.cn/zhengce/zhengceku/2021-07/23/content_562696…
[6] 双栈性能 https://kubernetes.io/zh-cn/docs/concepts/services-networking…
[7] 阿里云容器服务 ACKhttps://www.aliyun.com/product/kubernetes
[8] 1.6.1 版本 https://github.com/seata/seata/releases/tag/v1.6.1
[9] 1.8.6 版本 https://github.com/alibaba/Sentinel/releases/tag/1.8.6
[10] 2.2.0 版本 https://github.com/alibaba/nacos/releases/tag/2.2.0
[11] 发版布告 https://github.com/alibaba/spring-cloud-alibaba/releases
作者:铖朴
原文链接
本文为阿里云原创内容,未经容许不得转载。