侵入式服务治理方案,读这一篇就够(3)

简介: 侵入式服务治理方案,读这一篇就够(3)
  • 弹性好:

基于的服务发现机制可以快速发现服务的扩容与缩容,与相对静态的服务列表配置机制比,它是更加动态、灵活和实时的,这使得基于Dubbo开发的服务可以随时被关闭、启动和迁移,也使得应用能够以原生方式利用云环境中资源的弹性伸缩。


  • 高可用:

Dubbo是完全去中心化的服务治理方案,在分布式系统运行时,任何节点宕机都不会对服务产生实质性的影响。服务提供者宕机是较为常见的问题,可以与缩容一并处理,不会影响集群的整体服务。注册中心容易被误认为Dubbo系统的中心,其实不然,即使注册中心集群整体宕机,也不会影响Dubbo应用的运行。因为服务提供者列表是缓存在每一个服务消费者本地的,因此即使不经过注册中心,服务间的远程调用仍然不会中断。不过在注册中心失效期间,服务消费者无法感知新上线的服务提供者,因此无法对系统进行扩容。


  • 性能优:

采用Dubbo协议的服务消费者和服务提供者之间是点对点直连的,连接建立后无须断开,每次远程调用无须重新经过三次握手,也无须经过负载均衡服务器的二次转发,非常适用于互联网后端之间频次高、性能敏感度高的服务交互。


Dubbo支持随机、轮询、最少活跃调用数和一致性哈希这四种负载均衡策略,也提供扩展点用于定制策略。


随机策略是Dubbo默认采用的负载均衡策略。调用量越大分布越均匀,在无状态应用场景下较为适用。


轮询策略能够让流量以绝对均匀的方式分配。但是,如果服务节点处理能力不均衡的话,便会导致大量请求最终阻塞在最短板的服务节点上,从而影响集群的整体运行效果。


最少活跃数调用策略可以使请求响应迅速的服务节点获得更多的请求,使请求响应缓慢的服务节点获得较少的请求。


微信图片_20220123181649.jpg


一致性哈希策略使用一致性哈希算法,使相同的参数总是可以被发送给同样的服务提供者,在服务节点变化时平摊请求,避免请求路由结果发生剧烈变动。一致性哈希算法在分布式缓存等方案中较为常见,无状态服务没有必要使用,但如果服务是有状态的,便可以考虑使用该策略,以降低数据在服务节点间的复制频率。


Dubbo还为负载均衡策略提供了权重,可以通过配置或Dubbo的控制台动态调节权重,控制各个服务节点分配到的请求的数量。


配置负载均衡策略很简单,以下是将接口的负载均衡策略调整为轮询策略的配置代码。

<dubbo:referenceinterface="..." loadbalance="roundrobin" />


以下是将某一种方法的负载均衡策略调整为轮询策略的配置代码。

<dubbo:referenceinterface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>


在服务调用失败时,Dubbo还提供了失效转移等容错的能力。



远程通信


使用Dubbo进行远程调用非常简单,它将多种通信方式及不同的序列化协议进行了统一封装。服务提供者和服务消费者只需在配置中指定使用的协议,便无须关心其他的实现细节了。


在正式介绍通信协议之前,我们需要先明确一下“Dubbo”这个词在不同语境中所表示的不同概念。首先,Dubbo是这个框架的名字;其次,在Dubbo框架中,服务提供者与服务消费者之间可以采用多种协议通信,Dubbo通信协议便是其中的一种;最后,远程通信时需要对在网络间传输的消息进行序列化和反序列化,Dubbo序列化协议是Dubbo框架所支持的众多序列化协议之一,是其自研的序列化算法。


Dubbo框架内置了多种通信协议,默认使用Dubbo通信协议,其他的协议还有RMI、Hessian、HTTP、WebService、Thrift、Memcached、Redis等。每个协议的连接方式、支持的序列化协议、线程模型、消息派发方式等都有很大区别。


Dubbo通信协议是Dubbo框架中最常用的通信协议。它采用Java NIO实现多路复用。对于每一个服务消费者来说,Dubbo协议的服务提供者都会创建固定数量的长连接传输消息,用于有效减少建立连接的握手次数,Dubbo通信协议使用线程池并发处理请求来增强并发效率。由于连接复用,传输大文件时的带宽占用率高可能会成为系统瓶颈,因此Dubbo通信协议适合处理高并发的小数据量互联网请求,不适合处理视频、高清照片这样的大文件或超长字符串。


微信图片_20220123181704.jpg


Dubbo通信协议并未直接使用Java原生的NIO包进行开发,它默认采用Netty框架进行远程通信,并且可以仅通过配置的变更将远程调用的具体实现方式切换为使用Mina或Grizzly等其他通信框架,远程调用的实现对使用方完全透明。


Dubbo通信协议可以支持多种序列化协议,与变更通信框架一样,它也能够仅通过修改配置实现序列化协议的切换。Dubbo通信协议使用Hessian作为默认的序列化协议,除此之外,还支持Dubbo、JSON以及Java原生的序列化协议。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
SQL 安全 数据库
深入理解SQL的数据操作语言(DML)
SQL(Structured Query Language)是一种用于管理和操作关系数据库的强大语言。SQL语言被分为多个子语言,其中之一是DML(Data Manipulation Language),用于执行与数据的操作和管理相关的任务。在本文中,我们将深入探讨DML的各个方面,从基础操作到高级技巧,以帮助初学者更好地理解和使用SQL的DML。
851 1
|
存储 自然语言处理 关系型数据库
MySQL高级篇——索引的创建与设计原则
索引的分类与使用、MySQL8.0索引新特性、适合创建索引的情况、不适合创建索引的情况
MySQL高级篇——索引的创建与设计原则
|
存储 缓存 JavaScript
国内开源规则引擎牛起来
国内开源规则引擎牛起来
1435 0
|
2月前
|
人工智能 缓存 运维
【智造】AI应用实战:6个agent搞定复杂指令和工具膨胀
本文介绍联调造数场景下的AI应用演进:从单Agent模式到多Agent协同的架构升级。针对复杂指令执行不准、响应慢等问题,通过意图识别、工具引擎、推理执行等多Agent分工协作,结合工程化手段提升准确性与效率,并分享了关键设计思路与实践心得。
512 20
【智造】AI应用实战:6个agent搞定复杂指令和工具膨胀
|
2月前
|
监控 安全 Docker
10_大模型开发环境:从零搭建你的LLM应用平台
在2025年,大语言模型(LLM)已经成为AI应用开发的核心基础设施。无论是企业级应用、科研项目还是个人创新,拥有一个高效、稳定、可扩展的LLM开发环境都至关重要。
|
3月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
509 7
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
540 4
|
开发框架 Java 数据安全/隐私保护
Spring Boot插件化开发概念原理及实现
Spring Boot插件化开发概念原理及实现
1127 0
|
Python
Python reStructuredText风格注释详解
reStructuredText风格注释是Python代码注释的一种标准化格式,它提供了一种规范的注释格式,使得代码更加易读、易于维护。reStructuredText风格注释使用两个等号来包围注释标题,并按照一定规范编写。通过使用reStructuredText风格注释,我们可以为代码提供清晰的文档和说明,使得代码更加易读、易于维护。
577 2
|
JSON 监控 druid
Druid Spring Boot Starter
Druid 主页 https://github.com/alibaba/druid Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。 如何使用
2914 0