Dubbo中的常用组件

news2024/11/27 20:39:09

微服务的架构主要包括服务描述、服务发现、服务调用、服务监控、服务追踪以及服务治理这几个基本组件。

那么每个基本组件从架构和代码设计上该如何实现?组件之间又是如何串联来实现一个完整的微服务架构呢?今天我就以开源微服务框架Dubbo为例来给你具体讲解这些组件。

服务发布与引用

服务发布与引用的三种常用方式:RESTful API、XML配置以及IDL文件,其中Dubbo框架主要是使用XML配置方式。

首先来看服务发布的过程,下面这段代码是服务提供者的XML配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="hello-world-app"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="multicast://127.0.0.1:3435" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans>

其中“dubbo:service”开头的配置项声明了服务提供者要发布的接口,“dubbo:protocol”开头的配置项声明了服务提供者要发布的接口的协议以及端口号。

Dubbo会把以上配置项解析成下面的URL格式:

dubbo://host-ip:20880/com.alibaba.dubbo.demo.DemoService

然后基于扩展点自适应机制,通过URL的“dubbo://”协议头识别,就会调用DubboProtocol的export()方法,打开服务端口20880,就可以把服务demoService暴露到20880端口了。

再来看下服务引用的过程,下面这段代码是服务消费者的XML配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="multicast://127.0.0.1:3435" />

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
</beans>

其中“dubbo:reference”开头的配置项声明了服务消费者要引用的服务,Dubbo会把以上配置项解析成下面的URL格式:

dubbo://com.alibaba.dubbo.demo.DemoService

然后基于扩展点自适应机制,通过URL的“dubbo://”协议头识别,就会调用DubboProtocol的refer()方法,得到服务demoService引用,完成服务引用过程。

服务注册与发现

先来看下服务提供者注册服务的过程,继续以前面服务提供者的XML配置为例,其中“dubbo://registry”开头的配置项声明了注册中心的地址,Dubbo会把以上配置项解析成下面的URL格式:

registry://multicast://127.0.0.1:3435/com.alibaba.dubbo.registry.RegistryService?export=URL.encode("dubbo://host-ip:20880/com.alibaba.dubbo.demo.DemoService")

然后基于扩展点自适应机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的export()方法,将export参数中的提供者URL,注册到注册中心。

再来看下服务消费者发现服务的过程,同样以前面服务消费者的XML配置为例,其中“dubbo://registry”开头的配置项声明了注册中心的地址,跟服务注册的原理类似,Dubbo也会把以上配置项解析成下面的URL格式:

registry://multicast://127.0.0.1:3435/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode("consummer://host-ip/com.alibaba.dubbo.demo.DemoService")

然后基于扩展点自适应机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的refer()方法,基于refer参数中的条件,查询服务demoService的地址。

服务调用

在服务调用的过程中,通常把服务消费者叫作客户端,服务提供者叫作服务端,发起一次服务调用需要解决四个问题:

  • 客户端和服务端如何建立网络连接?

  • 服务端如何处理请求?

  • 数据传输采用什么协议?

  • 数据该如何序列化和反序列化?

其中前两个问题客户端和服务端如何建立连接和服务端如何处理请求是通信框架要解决的问题,Dubbo支持多种通信框架,比如Netty 4,需要在服务端和客户端的XML配置中添加下面的配置项。

服务端:

<dubbo:protocol server="netty4" />

客户端:

<dubbo:consumer client="netty4" />

这样基于扩展点自适应机制,客户端和服务端之间的调用会通过Netty 4框架来建立连接,并且服务端采用NIO方式来处理客户端的请求。

再来看下Dubbo的数据传输采用什么协议。Dubbo不仅支持私有的Dubbo协议,还支持其他协议比如Hessian、RMI、HTTP、Web Service、Thrift等。下面这张图描述了私有Dubbo协议的协议头约定。

alt

至于数据序列化和反序列方面,Dubbo同样也支持多种序列化格式,比如Dubbo、Hession 2.0、JSON、Java、Kryo以及FST等,可以通过在XML配置中添加下面的配置项。

例如:

<dubbo:protocol name="dubbo" serialization="kryo"/>

服务监控

服务监控主要包括四个流程:数据采集、数据传输、数据处理和数据展示,其中服务框架的作用是进行埋点数据采集,然后上报给监控系统。

在Dubbo框架中,无论是服务提供者还是服务消费者,在执行服务调用的时候,都会经过Filter调用链拦截,来完成一些特定功能,比如监控数据埋点就是通过在Filter调用链上装备了MonitorFilter来实现的。

服务治理

服务治理手段包括节点管理、负载均衡、服务路由、服务容错等,下面这张图给出了Dubbo框架服务治理的具体实现。

alt

图中的Invoker是对服务提供者节点的抽象,Invoker封装了服务提供者的地址以及接口信息。

  • 节点管理:Directory负责从注册中心获取服务节点列表,并封装成多个Invoker,可以把它看成“List ” ,它的值可能是动态变化的,比如注册中心推送变更时需要更新。

  • 负载均衡:LoadBalance负责从多个Invoker中选出某一个用于发起调用,选择时可以采用多种负载均衡算法,比如Random、RoundRobin、LeastActive等。

  • 服务路由:Router负责从多个Invoker中按路由规则选出子集,比如读写分离、机房隔离等。

  • 服务容错:Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,比如采用Failover策略的话,调用失败后,会选择另一个Invoker,重试请求。

一次服务调用的流程

上面我讲的是Dubbo下每个基本组件的实现方式,那么Dubbo框架下,一次服务调用的流程是什么样的呢?

alt

首先我来解释微服务架构中各个组件分别对应到上面这张图中是如何实现。

  • 服务发布与引用:对应实现是图里的Proxy服务代理层,Proxy根据客户端和服务端的接口描述,生成接口对应的客户端和服务端的Stub,使得客户端调用服务端就像本地调用一样。

  • 服务注册与发现:对应实现是图里的Registry注册中心层,Registry根据客户端和服务端的接口描述,解析成服务的URL格式,然后调用注册中心的API,完成服务的注册和发现。

  • 服务调用:对应实现是Protocol远程调用层,Protocol把客户端的本地请求转换成RPC请求。然后通过Transporter层来实现通信,Codec层来实现协议封装,Serialization层来实现数据序列化和反序列化。

  • 服务监控:对应实现层是Filter调用链层,通过在Filter调用链层中加入MonitorFilter,实现对每一次调用的拦截,在调用前后进行埋点数据采集,上传给监控系统。

  • 服务治理:对应实现层是Cluster层,负责服务节点管理、负载均衡、服务路由以及服务容错。

再来看下微服务架构各个组件是如何串联起来组成一个完整的微服务框架的,以Dubbo框架下一次服务调用的过程为例,先来看下客户端发起调用的过程。

  • 首先根据接口定义,通过Proxy层封装好的透明化接口代理,发起调用。

  • 然后在通过Registry层封装好的服务发现功能,获取所有可用的服务提供者节点列表。

  • 再根据Cluster层的负载均衡算法从可用的服务节点列表中选取一个节点发起服务调用,如果调用失败,根据Cluster层提供的服务容错手段进行处理。

  • 同时通过Filter层拦截调用,实现客户端的监控统计。

  • 最后在Protocol层,封装成Dubbo RPC请求,发给服务端节点。

这样的话,客户端的请求就从一个本地调用转化成一个远程RPC调用,经过服务调用框架的处理,通过网络传输到达服务端。其中服务调用框架包括通信协议框架Transporter、通信协议Codec、序列化Serialization三层处理。

服务端从网络中接收到请求后的处理过程是这样的:

  • 首先在Protocol层,把网络上的请求解析成Dubbo RPC请求。

  • 然后通过Filter拦截调用,实现服务端的监控统计。

  • 最后通过Proxy层的处理,把Dubbo RPC请求转化为接口的具体实现,执行调用。

总结

今天我们讲述了Dubbo服务化框架每个基本组件的实现方式,以及一次Dubbo调用的流程。

对于学习微服务架构来说,最好的方式是去实际搭建一个微服务的框架,甚至去从代码入手做一些二次开发

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习实战六步法之训练模型、优化模型、部署模型(七)

要落地一个机器学习的项目&#xff0c;是有章可循的&#xff0c;通过这六个步骤&#xff0c;小白也能搞定机器学习。 看我闪电六连鞭&#xff01;&#x1f923; 训练模型 当确定好机器学习算法之后&#xff0c;就可以通过训练数据集中的特征和标签&#xff0c;根据样本数据的…

SLAM中刚体的运动描述

简介 物体在真实世界中是运动的&#xff0c;SLAM中求解的机器人位姿就是求解机器人的运动。SLAM的问题就是求解世界坐标系中的静态物理点坐标以及运动的机器人点坐标集合&#xff08;机器人运动点的集合构成机器人的运动轨迹&#xff09;。而通常我们获取的信息是以机器人本体为…

测试真的会被ChatGPT代替一文告诉你

送走最后一车货&#xff0c;最后三个工人&#xff0c;老王吃力的关上大铁门。左手从口袋摸出一盒烟&#xff0c;轻轻一颠&#xff0c;滑落一根&#xff0c;右手娴熟的夹住。掏出打火机&#xff0c;点燃&#xff0c;一丝青烟腾起&#xff0c;萦绕在指头。 夕阳穿过玻璃&#xf…

知道这些英文文档翻译的方式吗

在工作中&#xff0c;大家有没有遇到领导交给你一份外语的文档&#xff0c;要你去观看和理解&#xff0c;但是我们看不太懂或者没啥时间去一点点翻译怎么办呢&#xff1f;我们就需要有工具来将文档翻译&#xff0c;它是一项非常实用和便捷的功能&#xff0c;它可以将文档中的文…

高级运维工程师的工作职责描述(合集)

高级运维工程师的工作职责描述1 职责&#xff1a; 1、参与设计、审核的Linux系统以及各应用系统的体系架构; 2、全面负责公司运维项目的系统升级、linux系统运营维护&#xff0c;保障公司服务器零风险; 3、负责阿里云服务器监控,搭建cacti、zabbix、nagios等监控产品&#xff0…

STM32信号量

目录 什么是信号量&#xff1f; 什么是二值信号量&#xff1f; 二值信号量相关 API 函数 1. 创建二值信号量 2. 释放二值信号量 3. 获取二值信号量 实操 实验需求 cubeMX配置​编辑 代码实现 计数型信号量 什么是计数型信号量&#xff1f; 计数型信号量相关 API 函…

CENTO OS上的网络安全工具(二十三)VSCODE SPARK 容器式编程环境构建

在vscode上使用maven构建spark的scala编程环境&#xff0c;很大程度上需要不断地从网络上下载各种依赖和插件&#xff0c;而且这一过程复杂而不可控。下面这段&#xff0c;是整个安装过程中/root目录下不断增加的内容。 [rootd7ff8f448a0d /]# cd /root [rootd7ff8f448a0d ~]#…

【 Python 全栈开发 - WEB开发篇 - 32 】MySQL高级查询

文章目录 一、LIMIT限制查询结果的数量二、使用GROUP BY进行分组查询1.GROUP BY和聚合函数一起使用2.GROUP BY和聚合函数以及HAVING一起使用 三、使用ORDER BY对查询结果排序 一、LIMIT限制查询结果的数量 开始之前&#xff0c;我们先准备一下数据&#xff0c;打开cmd&#xf…

MsSqlServer2008R2移动数据库迁移复制粘贴附加.mdf不要.ldf日志 230609记录

MsSqlServer2008R2数据库迁移复制粘贴附加.mdf 230609记录 将一个SqlServer的某个数据文件.mdf拷贝到另一个数据库当中,并启用 操作工具为 SSMS(SQL Server Management Studio) 19.1 免费下载 SQL Server Management Studio (SSMS) 19.1 .mdf文件 SQL Server 数据库中的三…

【数据结构】何为数据结构。

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星T…

chatgpt赋能python:Python循环暂停和继续的方法

Python循环暂停和继续的方法 Python是一种高级编程语言&#xff0c;在编程中使用循环结构非常常见。很多情况下&#xff0c;我们需要在循环中暂停或者继续执行。在本文中&#xff0c;我们将介绍如何在Python中实现循环暂停和继续的方法。 循环暂停和继续的意义 在Python编程…

打死也要学的VUE.js(中文官方文档)

VUE.js中文官方文档 文章目录 VUE.js中文官方文档 创建一个 Vue 应用[#](https://cn.vuejs.org/guide/essentials/application.html#creating-a-vue-application)应用实例[#](https://cn.vuejs.org/guide/essentials/application.html#the-application-instance)根组件[#](http…

微信小程序抓包你会吗?不会我来教你

目录 前言 先来说小程序抓包问题 再说下小程序调试问题 解包wxapkg 调试小程序 总结&#xff1a; 前言 今天聊下微信小程序的抓取&#xff0c;其实小程序的抓取不难&#xff0c;主要解决抓包和如何调试小程序这两个问题。如果你运用chrome调试已经比较熟练了的话&#xff0c;就…

Java多线程、进程、并行、并发的理解(通俗易懂)

程序(programm) 概念&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码。 进程(process) 概念&#xff1a;程序的一次执行过程&#xff0c;或是正在运行的一个程序。 说明&#xff1a;进程作为资源分配的单位&#xff0c;系统在运行时会为每…

基于VITS-fast-fine-tuning构建多speaker语音训练

1 VITS模型介绍 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;是一种语音合成方法&#xff0c;它使用预先训练好的语音编码器 (vocoder声码器) 将文本转化为语音。 VITS 的工作流程如下&#xff1a; &#xff0…

【CSS按钮特效】css如何实现科技感好看按钮效果(尾附源码下载)

【写在前面】这两天还是比较痴迷于CSS特效的&#xff0c;甚至还想着去用CSS做动画片呢&#xff0c;希望后面能做到&#xff0c;今天主要讲的是我们页面常见的元素-按钮&#xff0c;很多时候按钮也需要高级化&#xff0c;但是很多人苦于没有途径去寻找&#xff0c;于是乎借这个机…

jsx底层渲染机制,函数组件的底层渲染机制

jsx底层渲染机制&#xff01;&#xff01; 1.第一大步创建virtualDom 首先把我们编写的JSX语法&#xff0c;编译为虚拟DOM对象「virtualDOM」&#xff0c;这一步也分为两小步 虚拟DON对象∶框架自己内部构建的一套对象体系&#xff08;对象的相关成员都是React内部规定的)&a…

深入理解深度学习——注意力机制(Attention Mechanism):多头注意力(Multihead Attention)

分类目录&#xff1a;《深入理解深度学习》总目录 在实践中&#xff0c;当给定相同的查询、键和值的集合时&#xff0c;我们希望模型可以基于相同的注意力机制学习到不同的行为&#xff0c; 然后将不同的行为作为知识组合起来&#xff0c; 捕获序列内各种范围的依赖关系 &#…

论文解读:GBPNet:蛋白质结构的通用几何表示学习

GBPNet: Universal Geometric Representation Learning on Protein Structures DOI:https://doi.org/10.1145/3534678.3539441 Github:GBPNet/gbpnet/datamodules at main sarpaykent/GBPNet GitHub 摘要&#xff1a; 蛋白质3D结构的表示学习对于例如计算蛋白质设计或蛋白…

单链表OJ题:LeetCode--160.相交链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第160道单链表OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…