你项目用到了 Dubbo,讲讲为什么要用以及怎么使用的?

news2024/11/15 9:46:16

引言:在现代分布式系统中,服务化架构已成为构建高性能、可扩展和可靠系统的关键。 Dubbo 作为一种优秀的服务化框架,提供了丰富的特性和灵活的配置选项,使得它在业界得到了广泛的应用和认可。本文将探讨为什么选择 Dubbo 以及如何在项目中使用 Dubbo 的相关内容。

题目

你项目用到了 Dubbo,讲讲为什么要用以及怎么使用的?

推荐解析

为什么要用 Dubbo?

为什么要用,其实就是 Dubbo 功能有哪些,以及你项目中由于业务所要使用到它的某些特性,因此在技术选型后,确定使用 Dubbo 框架。

1)服务注册与发现:

服务提供者在启动时将服务注册到注册中心,服务消费者可以从注册中心发现服务提供者的地址信息。

2)负载均衡:

Dubbo 内置了多种负载均衡策略,如随机、轮询、最少活跃调用等,用于在多个服务提供者之间分配请求。

3)服务调用:

支持同步调用和异步调用,以及回调机制,以满足不同的服务调用需求。

4)集群容错:

包括失败重试、快速失败、故障转移等策略,提高系统的可用性和容错能力。

5)服务监控:

提供服务调用次数、调用时间等统计信息,方便开发者监控服务状态。

6)服务降级:

在服务不可用时,提供备选方案,例如返回默认值或缓存数据,以保证核心业务的可用性。

7)服务治理:

包括服务分组、版本控制、动态配置等,帮助开发者更好地管理服务。

8)安全性:

支持服务权限控制、数据加密和安全认证,保障服务通信的安全性。

9)多协议支持:

Dubbo 支持多种通信协议,如 Dubbo 协议、RMI 协议、HTTP 协议等,以适应不同的通信场景。

10)多注册中心支持:

支持与多种注册中心(如 ZooKeeper、Redis、Multicast)集成,提供服务注册和发现的功能。

简单 Dubbo 举例使用

1. 引入 Dubbo 依赖

首先,在你的 Java 项目中引入 Dubbo 相关的依赖。

Maven 依赖配置

pom.xml 文件中添加 Dubbo 的依赖:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.0.9</version> <!-- 可以根据最新版本进行调整 -->
</dependency>
2. 编写 Dubbo 服务接口

定义 Dubbo 的服务接口和相关的数据模型。

定义服务接口

// 服务接口
public interface HelloService {
    String sayHello(String name);
}
3. 实现 Dubbo 服务提供者

编写具体的服务实现类,实现 Dubbo 的服务接口。

实现服务接口

// 服务提供者实现类
@Service(version = "1.0.0")
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}
4. 配置 Dubbo 服务提供者

在 Spring Boot 的配置文件中配置 Dubbo 服务提供者的相关信息。

application.properties 配置

# Dubbo 应用名
dubbo.application.name=my-dubbo-provider
# Dubbo 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# Dubbo 服务协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
5. 启动 Dubbo 服务提供者

编写一个启动类,用于启动 Dubbo 服务提供者。

@SpringBootApplication
public class DubboProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }
}
6. 编写 Dubbo 服务消费者

在另一个项目或模块中,编写 Dubbo 的服务消费者。

@RestController
public class HelloController {

    @Reference(version = "1.0.0")
    private HelloService helloService;

    @GetMapping("/hello")
    public String sayHello(@RequestParam String name) {
        return helloService.sayHello(name);
    }
}
7. 配置 Dubbo 服务消费者

在消费者项目中配置 Dubbo 的消费者相关信息。

application.properties 配置

# Dubbo 应用名
dubbo.application.name=my-dubbo-consumer
# Dubbo 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
8. 启动 Dubbo 服务消费者

同样编写一个启动类,用于启动 Dubbo 服务消费者。

@SpringBootApplication
public class DubboConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }
}
9. 运行与测试

现在你可以启动 Dubbo 提供者和消费者应用程序,并测试 Dubbo 服务是否正常工作。

1)启动提供者应用程序(DubboProviderApplication)。

2)启动消费者应用程序(DubboConsumerApplication)。

3)访问消费者的接口,如 http://localhost:8080/hello?name=John,应该能够看到返回的结果。

Dubbo 使用的是什么通信框架?

1)Netty:

Dubbo 在其通信层使用了 Netty 作为底层的网络通信框架,Netty 是一个高性能的网络编程框架。

2)TCP/IP 协议:

Dubbo 通信框架基于 TCP/IP 协议栈,保证了网络通信的可靠性和效率。

3)序列化框架:

Dubbo 支持多种序列化方式,如 Hessian、Java 自身的序列化机制等,用于对象的网络传输。

4)动态代理机制:

通过使用 JDK 的动态代理或 CGLIB 库,Dubbo 实现了客户端对服务的透明调用。

5)多线程模型:

Dubbo 在服务提供者和消费者两端都采用了多线程模型来处理并发请求。

6)异步通信:

Dubbo 支持异步调用模式,允许服务消费者和提供者进行非阻塞的数据处理。

7)长连接和心跳机制:

为了减少频繁建立和关闭连接的开销,Dubbo 使用长连接和心跳机制来维护服务端和客户端之间的连接。

8)请求-响应模式:

Dubbo 的通信框架基于请求-响应模式,客户端发送请求并等待服务端的响应。

API 项目面试题

为什么使用RPC调用?有了解过其他的方式吗?为什么不用OpenFegin?

答:因为如果在网关引入数据库的操作的话,不仅会增加项目体积,以及违背了设计原则的单一职
责原则,所以我考虑通过服务间调用的方式,我了解过有两种方式,第一种是Open feign,原理是
构造了一个HTTP请求,并会添加很多的请求头,body是使用json字符串传输,所以调用效率会比
较低,更加适合外部服务间的调用。然后我了解到RPC是可以基于TCP协议,避免了无用的请求
头,以及可以通过将数据序列化为二进制流的形式传输,效率更加高效,更加安全,所以更适用于
我这个场景。最终我选择了Dubbo RPC框架来实现这个功能。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

Dubbo

优点:

  1. 高性能: Dubbo 在设计上注重性能,采用了简单的远程调用方式和高效的序列化机制。
  2. 服务治理: 提供了丰富的服务治理功能,包括负载均衡、容错机制(如熔断、降级)、服务路由等,适合复杂的分布式场景。
  3. 支持多协议: Dubbo 支持多种通信协议,如 Dubbo 协议、HTTP、RMI 等,能够灵活适配不同的应用需求。
  4. 对中小型公司友好: 简单易用,适合中小型公司快速构建微服务架构。

缺点:

  1. 生态相对狭窄: 相对于 Spring Cloud,Dubbo 的生态系统相对较小,周边工具和支持资源可能不如 Spring Cloud 那么丰富。
  2. 对 Spring 依赖较重: 尽管 Dubbo 可以与非 Spring 框架集成,但在 Spring 生态圈内的集成更为顺畅。

Spring Cloud

优点:

  1. 丰富的组件: Spring Cloud 提供了丰富的组件和工具,如服务注册与发现(Eureka、Consul)、服务调用(Feign、RestTemplate)、断路器(Hystrix)、配置管理(Spring Cloud Config)等。
  2. 强大的生态系统: Spring Cloud 构建在 Spring 生态系统之上,能够充分利用 Spring Boot 的便利性和成熟的技术栈。
  3. 广泛的支持和社区: 由于其流行度和开放性,Spring Cloud 拥有庞大的社区支持和文档资源,能够解决各种复杂场景下的需求。

缺点:

  1. 复杂性: Spring Cloud 提供了大量的组件和配置选项,可能会导致学习曲线较陡。
  2. 性能开销: 由于提供了更多的功能和灵活性,Spring Cloud 在性能方面可能不如 Dubbo 高效。

选择场景和建议

  • 性能要求高、对服务治理有较高需求的场景,推荐使用 Dubbo。
  • Spring 生态系统已经深度依赖、需要较多集成支持的场景,推荐使用 Spring Cloud。
  • 初创公司或者中小型公司,对性能要求不是特别高,但需要快速搭建微服务架构的场景,可以考虑 Dubbo 或者 Spring Cloud 的简化版本(如 Spring Cloud Alibaba)。

综上所述,选择 Dubbo 还是 Spring Cloud 取决于项目需求、团队经验以及对生态系统的依赖程度。

欢迎交流

本文主要介绍 Dubbo 的主要功能以及简单使用,对于项目的面试题也已经回答,可以去记一些关键词方便记忆,在文末还有三个问题,检验本篇文章的学习成功,欢迎小伙伴在评论区留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)Dubbo 的主要优势是什么?它与其他 RPC 框架相比的特点是什么?

2)Dubbo 如何处理服务注册和发现?它支持哪些注册中心和负载均衡策略?

3)Dubbo 在集群容错方面有哪些机制?它如何处理服务调用失败或超时的情况?

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

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

相关文章

贪心+构造,CF1153 C. Serval and Parenthesis Sequence

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1153C - Codeforces 二、解题报告 1、思路分析 对于括号匹配问题我们经典做法是左括号当成1&#xff0c;右括号当成-1 那么只要任意前缀非负且最终总和为0那么该括号序列就是合法 对于本题&…

ssm学生成绩管理系统-海豚

ssm学生成绩管理系统-海豚 ssm学生成绩管理系统。 功能:登录&#xff0c;学生信息管理&#xff0c;课程信息&#xff0c;成绩信息&#xff0c; 技术&#xff1a;java&#xff0c;ssm&#xff0c;mybatics&#xff0c;jsp 平台&#xff1a;eclispe或者idea&#xff0c;mysql5.7…

spring-data-mongodb版本兼容问题

spring-data-mongodb与mongodb驱动有兼容性问题&#xff0c;不匹配会报NoSuchMethod异常&#xff0c;mongodb的java驱动包在4.0之后由mongodb-java-driver更名为mongodb-driver-sync。 spring-data-mongodb包依赖中有mongodb-driver-core&#xff0c;但缺诸如MongoCollection等…

vue3实战练习之红包雨,抢红包案例

抢红包案例 每当618消费节到来时&#xff0c;某宝、某多&#xff0c;等购物网站都会退出各种活动&#xff0c;其中抢红包&#xff0c;优惠券等红包雨活动很是火热&#xff0c;于是就通过vue的知识来做一个红包雨&#xff0c;抢红包加分活动&#xff01;代码中红包的路径改成自己…

FullCalendar日历组件集成实战(11)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

Node中模块查找机制

在Node.js中&#xff0c;目前支持es6模块和commonjs模块&#xff0c;在这个万物皆可为模块的世界里&#xff0c;模块的查找机制是一个相对复杂但有序的过程。这通常被称为“模块解析”或“模块查找”。 模块分类 nodejs中的模块主要分为两大类&#xff0c;一类是nodejs提供的…

Mocha Pro 2024 v11.0.1 Mac版摄像机反求跟踪插件更新:优化AE/PR/OFX/达芬奇工作流程

更新Mac苹果版&#xff0c;原生支持Intel和Apple M芯片&#xff0c;安装很简单。Mocha Pro 是一款世界知名的软件和插件&#xff0c;用于平面运动跟踪、3D 跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪。得益于集成SynthEyes核心3D跟踪算法的强大功能&#xff0…

构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析

一、项目背景与目标 随着我国水利事业的不断发展&#xff0c;水利设施的管理与维护工作愈发重要。随着夏季汛期的到来&#xff0c;水利管理工作面临着巨大的挑战。为确保水利设施的安全运行&#xff0c;及时应对可能出现的汛情&#xff0c;建设一套高效、智能的视频监控可视化…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

物联网网关和飞鸟物联平台如何助力其实现智能化升级,提升生产效率-天拓四方

随着工业4.0时代的到来&#xff0c;物联网技术逐渐成为推动工业转型升级的关键力量。物联网网关作为连接工业设备与网络的核心枢纽&#xff0c;在工业自动化、数据收集与分析等方面发挥着越来越重要的作用。本案例将围绕一家知名制造企业&#xff0c;展示物联网网关和飞鸟物联平…

vue-loader

Vue Loader 是一个 webpack 的 loader&#xff0c;它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件 起步 安装 npm install vue --save npm install webpack webpack-cli style-loader css-loader html-webpack-plugin vue-loader vue-template-compiler webpack…

SpringCloud学习笔记 - 1、Boot和Cloud版本选型

文章目录 前言需要&#xff08;学习/用到&#xff09;的技术SpringBoot版本的选择我们为什么要使用 Java 17&#xff0c;以及SpringBoot 3.2 呢&#xff1f; SpringCloud 版本的选择SpringCloud 命名规则Springcloud Alibaba 版本的选择如何确定Boot&#xff0c;Cloud&#xff…

我国的AI大模型前景如何?

目前&#xff0c;我国的AI大模型市场前景很好。这个产业的发展源于多领域的广泛需求&#xff0c;包括办公、制造、金融、医疗、政务等场景中的降本增效、生产自动化、降低风险、提高诊断准确率、提高政务服务效率等诉求。这些领域的创新和发展共同推动了我国AI大模型产业的蓬勃…

C++中的结构体——结构体案例1_2

案例描述 学校正在做毕设项目&#xff0c;每位老师指导5名学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师的姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c;创…

又一个小伙伴在深圳上车安家~

又有同学在深圳买房上车了&#xff0c;招呼在深圳的大学同学聚餐&#xff0c;现在这个时间点买房还是挺强的。 他主要是小孩马上到了上学的年纪&#xff0c;考虑到孩子上学&#xff0c;所以今年四月份开始在深圳看房&#xff0c;很快就在罗湖锁定了一套二手房&#xff0c;没怎…

计算机组成原理 期末复习笔记整理(上)(个人复习笔记/侵删/有不足之处欢迎斧正)

零、计算机的发展 冯.诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器&#xff0c;可按地址寻访 3.指令和数据用二进制表示 4.指令由操作码和地址码组成 5.存储程序&#xff08;首次提出存储结构&#xff09; 6.以运算器为中心&#xff08;现代…

定时器0电机控制PWM输出

/*立式不锈钢波纹管机控制板2021 2 26 pcb PAST******/ #include <REG52.H> #include <intrins.H> #define uint unsigned int #define uchar unsigned char #define …

农产品商城系统农资电商商城系统java项目jsp web项目

农产品商城系统农资电商商城系统java项目jsp web项目 会员用户可以实现&#xff1a;注册登录、商品信息浏览、加入购物车、加入收藏、下单支付、查看公告、查看以及留言、个人信息管理 后台管理的实现&#xff1a;类别管理模块、商品管理模块、会员管理模块、订单管理、退货管…

11.1 Go 标准库的组成

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

redis未授权getshell整合利用

一、redis环境搭建 Redis下载地址&#xff1a;http://download.redis.io/releases/redis-4.0.2.tar.gz 1.靶机安装redis-centos7 第一步&#xff1a;下载wget yum -y install wget 第二步&#xff1a;下载redis wget http://download.redis.io/redis-stable.tar.gz 第三步&a…