当前位置: 首页>编程语言>正文

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

引言:在现代分布式系统中,服务化架构已成为构建高性能、可扩展和可靠系统的关键。 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框架来实现这个功能。

其他补充

你项目用到了 Dubbo,讲讲为什么要用以及怎么使用的?,你项目用到了 Dubbo,讲讲为什么要用以及怎么使用的?_服务提供者,第1张

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

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

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

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

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


https://www.xamrdz.com/lan/5v21963855.html

相关文章: