Dubbo 简单入门

Dubbo 简单入门

Dubbo 是一个高性能的分布式服务框架,旨在解决微服务架构下的 RPC(远程过程调用)问题。其核心原理包括服务注册与发现、通信协议、负载均衡、容错机制等。以下是对这些核心原理的详细讲解:

1. 服务注册与发现

服务注册

在 Dubbo 中,服务提供者(Provider)在启动时将自己的服务接口和地址信息注册到注册中心(如 Zookeeper)。

服务发现

服务消费者(Consumer)在启动时从注册中心获取所需服务的地址列表,并缓存本地,以便调用时使用。

流程图示

Provider -----> Registry (Service Registration)
Consumer <----- Registry (Service Discovery)

2. 通信协议

Dubbo 支持多种协议,如 Dubbo 协议、HTTP 协议、Hessian 协议等。默认使用 Dubbo 协议,基于 Netty 实现,具有高性能、低延迟等优点。

请求过程
  1. 序列化:消费者将调用请求序列化为二进制数据。
  2. 传输:通过 TCP 协议将请求数据传输到提供者。
  3. 反序列化:提供者接收到请求后,将数据反序列化为方法调用。
  4. 处理:提供者执行相应的方法,并将结果序列化为响应数据。
  5. 返回:通过 TCP 将响应数据传回消费者。
  6. 反序列化:消费者将响应数据反序列化为方法返回值。

3. 负载均衡

Dubbo 提供多种负载均衡策略,包括随机、轮询、一致性哈希、最少活跃调用数等。

  • 随机:随机选择一个服务实例进行调用。
  • 轮询:按顺序循环调用不同的服务实例。
  • 一致性哈希:将请求的参数哈希到固定的服务实例上。
  • 最少活跃调用数:优先选择当前活跃调用数最少的实例。

4. 容错机制

Dubbo 提供了多种容错策略,确保在调用失败时能够合理处理:

  • 失败重试:在调用失败时自动重试,默认重试两次。
  • 失败切换:在调用失败时切换到其他服务实例,通常与负载均衡策略结合使用。
  • 失败快速:在调用失败时快速失败,不进行重试,适用于实时性要求高的服务。
  • 失败安全:调用失败时忽略错误并返回默认值,适用于对结果不敏感的调用。

5. SPI 机制

Dubbo 采用了 Service Provider Interface (SPI) 机制,使得框架的扩展性和灵活性大大增强。用户可以根据需求自定义各种组件,如协议、负载均衡策略、序列化方式等。

6. 拓扑结构

Dubbo 的服务拓扑结构如下:

+-----------+      +-----------+      +-----------+
| Consumer  |<---->| Registry  |<---->| Provider  |
+-----------+      +-----------+      +-----------+^                                      ||                                      v
+-----------+                         +-----------+
| Monitor   |<------------------------| Provider  |
+-----------+                         +-----------+
  • Registry:注册中心,存储服务的注册信息。
  • Provider:服务提供者,提供具体的服务实现。
  • Consumer:服务消费者,调用远程服务。
  • Monitor:监控中心,收集和展示服务调用的统计信息。

总结

Dubbo 的核心原理包括通过注册中心实现服务注册与发现、采用高效的通信协议、提供多种负载均衡策略和容错机制,并且支持通过 SPI 机制进行扩展。Dubbo 为构建高性能、可扩展的分布式服务系统提供了强有力的支持。

Dubbo 简单示例:

环境准备

  1. JDK: 安装 JDK 8 或以上版本。
  2. Maven: 安装 Maven,用于管理项目依赖。
  3. Zookeeper: 安装 Zookeeper 作为服务注册中心。

项目结构

使用 Maven 创建一个简单的多模块项目,包含 dubbo-interfacedubbo-providerdubbo-consumer 三个模块。

创建接口模块 (dubbo-interface)

定义服务接口和数据传输对象 (DTO):

// HelloService.java
package com.example.dubbo;public interface HelloService {String sayHello(String name);
}

创建提供者模块 (dubbo-provider)

  1. 添加 Maven 依赖:
<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.14</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.1.RELEASE</version></dependency>
</dependencies>
  1. 编写服务实现类:
// HelloServiceImpl.java
package com.example.dubbo.provider;import com.example.dubbo.HelloService;
import org.apache.dubbo.config.annotation.Service;@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}
}
  1. 配置 Spring Boot 应用:
// ProviderApplication.java
package com.example.dubbo.provider;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}
  1. 配置 application.yml
dubbo:application:name: dubbo-providerregistry:address: zookeeper://127.0.0.1:2181protocol:name: dubboport: 20880

创建消费者模块 (dubbo-consumer)

  1. 添加 Maven 依赖:
<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.14</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.1.RELEASE</version></dependency>
</dependencies>
  1. 编写消费者类:
// HelloConsumer.java
package com.example.dubbo.consumer;import com.example.dubbo.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ConsumerApplication implements CommandLineRunner {@Referenceprivate HelloService helloService;public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}@Overridepublic void run(String... args) throws Exception {String message = helloService.sayHello("Dubbo");System.out.println(message);}
}
  1. 配置 application.yml
dubbo:application:name: dubbo-consumerregistry:address: zookeeper://127.0.0.1:2181

运行项目

  1. 启动 Zookeeper。
  2. 运行 dubbo-provider 模块中的 ProviderApplication
  3. 运行 dubbo-consumer 模块中的 ConsumerApplication

消费者启动后,将调用提供者的 HelloService 并输出 “Hello, Dubbo”。

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

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

相关文章

Kafka~消息系列问题解决:消费顺序问题解决、消息丢失问题优化(不能保证100%)

消息消费顺序问题 使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序&#xff0c;比如我们同时发了 2 个消息&#xff0c;这 2 个消息对应的操作分别对应的数据库操作是&#xff1a; 用户等级升级。根据用户等级下的订单价格 假如这两条消息的消费顺序不一样造…

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目&#xff1a;多个气体传感器的管理。由于气体传感器比较昂贵&#xf…

比尔盖茨:Agent将是AI最大的赛道

Agent不仅将改变人们与计算机的互动方式&#xff0c;还将颠覆软件行业&#xff0c;引发自从我们从键入命令到点击图标以来计算机领域的最大革命。 保罗艾伦和我一起创立微软的至今&#xff0c;我对软件的热爱至今依然不减。 然而&#xff0c;尽管在过去的几十年中软件已经取得…

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall&#xff0c;前端部分使用了 Vue.js&#xff0c;后端部分使用…

多阶段分层构建容器化Spring Boot应用程序

上一节中&#xff0c;容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程&#xff0c;本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程&#xff0c;希望对大家有所帮助。 Spring Boot从版本2.3.0开始支持分层构建容器化的…

Mysql中varchar类型数字排序不对踩坑记录

场景 在进行表设计时将版本号字段设计了为varchar类型&#xff0c;尽量从表设计阶段将数字类型列设计为int型。 再进行排序时如果版本号累计到了10及以上&#xff0c;那么再进行排序时则会出现问题。 比如下面执行排序时发现10被排在了第一位。 这是因为 varchar类型对数字…

51单片机第8步_absacc.h库函数

本章重点学习库函数absacc.h的使用,介绍绝对宏和绝对地址的用法。故事有点老掉牙&#xff0c;但学校的教授们还在继续。 #include <REG52.h> //包含头文件REG52.h,使能51内部寄存器; #include <absacc.h> #include <stdio.h> //包含头文件stdio.h //_get…

已备案网站变更并且不影响现有业务的方案

已备案网站变更并且不影响现有业务的方案 近日有个工作上的需求&#xff0c;已备案网站变更并且不影响现有业务&#xff0c;记录一下。 需求 域名&#xff1a;XXXXXX.com备案变更前主体&#xff1a; 海南XXXXXX科技有限公司 备案变更后主体&#xff1a; 深圳XXXXXX科技有限…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;http…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;Hive的数据存储在HDFS上&#xff0c;底层基于…

Linux 常用命令 - dd 【复制及转换文件内容】

简介 dd 命令源自于磁盘复制&#xff08;disk dump&#xff09;的缩写&#xff0c;是 Linux 和 Unix 系统中用于转换和复制文件的一个强大工具。它可以在复制过程中进行格式转换&#xff0c;支持不同的块大小&#xff0c;能够直接对硬盘设备进行操作&#xff0c;非常适合进行备…

android里面json操作

1.读取assets下面xzhd/aikit/pck.json String json = null; try { InputStream is = activity.getAssets().open(aikitPathInData+"xzhd/aikit/pck.json"); int size = is.available(); byte[] buffer = new byte…

容器进程

一、容器进程和宿主机进程的关系 容器在进程空间上和宿主机是隔离的&#xff0c;每创建一个容器&#xff0c;该容器都有一个独属的进程空间简称PID NameSpace。但是容器本质也是一个进程&#xff0c;自然是由其父进程创建的&#xff0c;这个可以使用ps aux命令验证。 | 容器视…

Windows 下写C++代码的必备

在 Windows 下写代码&#xff0c;还需要用到 Windows.h 头文件的话&#xff0c;需要记住以下两点&#xff1a; 一定要 predefine 一个宏&#xff0c;NOMINMAX&#xff0c;禁用掉 windows 定义的 min 和 max 宏 #include <winsock.h> #define WIN32_LEAN_AND_MEAN #defin…

【高考志愿】材料科学与工程

目录 一、专业概述 二、就业前景与方向 三、院校选择和报考建议 3.1 院校选择 3.2 报考建议 四、材料科学与工程专业排名 高考志愿选择材料科学与工程专业时&#xff0c;确实是一个需要深思熟虑的决策过程。以下是更详细和扩展的考虑因素&#xff1a; 一、专业概述 学习…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

Java面试题:描述你如何向非技术人员解释技术概念

向非技术人员解释技术概念时&#xff0c;需要使用简单明了的语言&#xff0c;并结合类比和实际例子&#xff0c;使复杂的技术内容变得易于理解。以下是一些具体的策略&#xff1a; 使用类比&#xff1a; 熟悉的场景类比&#xff1a;将技术概念与日常生活中的熟悉事物进行类比。…

每天写java到期末考试--实验四---接口与抽象类--6.29

第一部分&#xff1a;接口与类的实现 Shape接口 java复制代码public interface Shape { double getArea(); double getPerimeter(); } Circle类 public class Circle implements Shape { private double r; public Circle(double r) { this.r r; } Override publ…

ISO26262标准

什么是ISO26262&#xff1f; ISO 26262(国际功能安全标准)是一个涵盖整个汽车产品开发过程的汽车功能安全标准。ISO 26262继承或改编自工业自动化行业的安全要求标准IEC61508&#xff0c;但专门为汽车行业量身定制。最新版本是ISO26262-1:2018。 它包括诸如需求分析、安全分析…

STM32CubeMx的学习记录系列(2)- STM32G474RET6

最近有个小比赛&#xff0c;需要用到G4&#xff0c;不过找了一圈没有找到标准库的代码&#xff0c;只能使用hal&#xff0c;用CubeMX来生成配置代码。 共同特点 ARDUINO Uno V3 扩展连接器 ST morpho 扩展引脚接头&#xff0c;可完全访问所有 STM32 I/O 采用LQFP64或LQFP48封…