带你读《Apache Dubbo微服务开发从入门到精通》——二、 应用级服务发现机制详解(上)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 带你读《Apache Dubbo微服务开发从入门到精通》——二、 应用级服务发现机制详解(上)

二、 应用级服务发现机制详解

 

1. 设计目标

 

显著降低服务发现过程的资源消耗,包括提升注册中心容量上限、降低消费端地址解析资源占用等,使得Dubbo3框架能够支持更大规模集群的服务治理,实现无限水平扩容。

 

适配底层基础设施服务发现模型,如Kubernetes、Service Mesh等。

 

2. 背景

 

image.png

 

我们从Dubbo最经典的工作原理图说起,Dubbo从设计之初就内置了服务地址发现的能力,Provider注册地址到注册中心,Consumer通过订阅实时获取注册中心的地址更新,在收到地址列表后,consumer基于特定的负载均衡策略发起对provider的RPC调用。

 

在这个过程中:

 

每个Provider通过特定的key向注册中心注册本机可访问地址

注册中心通过这个key对provider实例地址进行聚合

Consumer通过同样的key从注册中心订阅,以便及时收到聚合后的地址列表

 

image.png

 

这里,我们对接口级地址发现的内部数据结构进行详细分析。

 

首先,看右下角provider实例内部的数据与行为。Provider部署的应用中通常会有多个Service,也就是Dubbo2中的服务,每个service都可能会有其独有的配置,我们所讲的service服务发布的过程,其实就是基于这个服务配置生成地址URL的过程,生成的地址数据如图所示;同样的,其他服务也都会生成地址。

 

然后,看一下注册中心的地址数据存储结构,注册中心以service服务名为数据划分依据,将一个服务下的所有地址数据都作为子节点进行聚合,子节点的内容就是实际可访问的IP地址,也就是我们Dubbo中URL,格式就是刚才provider实例生成的。

 

image.png

 

这里把URL地址数据划分成了几份:

 

首先是实例可访问地址,主要信息包含ip port,是消费端将基于这条数据生成tcp网络链接,作为后续RPC数据的传输载体

 

其次是RPC元数据,元数据用于定义和描述一次RPC请求,一方面表明这条地址数据是与某条具体的RPC服务有关的,它的版本号、分组以及方法相关信息,另一方面表明

 

下一部分是RPC配置数据,部分配置用于控制RPC调用的行为,还有一部分配置用于同步Provider进程实例的状态,典型的如超时时间、数据编码的序列化方式等。

 

最后一部分是自定义的元数据,这部分内容区别于以上框架预定义的各项配置,给了用户更大的灵活性,用户可任意扩展并添加自定义元数据,以进一步丰富实例状态。

 

结合以上两页对于Dubbo2接口级地址模型的分析,以及最开始的Dubbo基本原理图,我们可以得出这么几条结论:

 

地址发现聚合的key就是RPC粒度的服务

注册中心同步的数据不止包含地址,还包含了各种元数据以及配置

得益于1与2,Dubbo实现了支持应用、RPC服务、方法粒度的服务治理能力

 

这就是一直以来Dubbo2在易用性、服务治理功能性、可扩展性上强于很多服务框架的真正原因。

 

image.png

 

一个事物总是有其两面性,Dubbo2地址模型带来易用性和强大功能的同时,也给整个架构的水平可扩展性带来了一些限制。这个问题在普通规模的微服务集群下是完全感知不到的,而随着集群规模的增长,当整个集群内应用、机器达到一定数量时,整个集群内的各个组件才开始遇到规模瓶颈。在总结包括阿里巴巴、工商银行等多个典型的用户在生产环境特点后,我们总结出以下两点突出问题(如图中红色所示):

 

首先,注册中心集群容量达到上限阈值。由于所有的URL地址数据都被发送到注册中心,注册中心的存储容量达到上限,推送效率也随之下降。

 

而在消费端这一侧,Dubbo2框架常驻内存已超40%,每次地址推送带来的CPU等资源消耗率也非常高,影响正常的业务调用。

 

为什么会出现这个问题?我们以一个具体provider示例进行展开,来尝试说明为何应用在接口级地址模型下容易遇到容量问题。

 

青蓝色部分,假设这里有一个普通的Dubbo Provider应用,该应用内部定义有10个RPC Service,应用被部署在100个机器实例上。这个应用在集群中产生的数据量将会是“Service数*机器实例数”,也就是10*100=1000条。数据被从两个维度放大:

 

从地址角度。100条唯一的实例地址,被放大10倍

 

从服务角度。10条唯一的服务元数据,被放大100倍

 

《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——二、 应用级服务发现机制详解(下):https://developer.aliyun.com/article/1224471

相关文章
|
1月前
|
项目管理 微服务
云效常见问题之将多个微服务应用集成到一次研发流程中发布上线如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
28 0
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
241 5
|
1月前
|
监控 网络协议 Go
应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
109646 118
|
2月前
|
运维 监控 数据管理
Apollo与微服务架构:构建可扩展的应用程序
Apollo与微服务架构:构建可扩展的应用程序
|
3月前
|
微服务
微服务 乾坤子应用 内存增长 没有释放
子应用内存没有被释放,每次刷新都会增加内存增长
|
3月前
|
JSON Dubbo Java
微服务框架(二十)Dubbo Spring Boot 生产就绪特性
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Dubbo Spring Boot 生产就绪特性
|
7天前
|
Kubernetes Cloud Native Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(下)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
41 0
|
7天前
|
Cloud Native 算法 Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(上)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
32 0
|
13天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
17 4
|
18天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)

推荐镜像

更多