百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

探索分布式服务框架-Dubbo整体架构与实现原理

ccwgpt 2024-10-02 12:10 24 浏览 0 评论

前言

一、简介

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

二、优点

1.面向接口的远程方法调用

2.智能容错和负载均衡

3.服务自动注册和发现

4.服务接口监控与治理

三、Dubbo架构

1、 节点说明

2、调用关系说明(6步)

0.服务容器负责启动,加载,运行服务提供者。 
1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

3、Dubbo提供的注册中心有如下几种类型可供选择

- Multicast注册中心
- Zookeeper注册中心(推荐使用)
	(注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。)
- Redis注册中心
- Simple注册中心

四、推荐顺序

1.启动zookeeper注册中心

2.启动管理控制台

3.编写并启动provider

4.最后编写并启动consumer

五、服务提供者

①、pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

<dependencies>
    <!--基础环境-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!--dubbo的起步依赖-->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.5</version>
    </dependency>
    <!-- zookeeper的api管理依赖 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <!-- zookeeper依赖 -->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.12</version>
    </dependency>
        <!--依赖公共接口-->
        <dependency>
            <groupId>com.zj</groupId>
            <artifactId>dubbo-demo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
</dependencies>

②、编写service实现类

@Service // 注意:这里使用org.apache.dubbo包下的
public class UserServiceImpl implements UserService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

③、application.yml

# dubbo.application.name       服务名称,一般跟模块名称一致即可
# dubbo.application.qos-port   服务质量模块的端口,默认值:22222
# dubbo.registry.address       注册中心的连接地址
# dubbo.protocol.name          当前服务的访问协议,支持dubbo、rmi、hessian、http、webservice、rest、redis等
# dubbo.protocol.port          当前服务的访问端口
# dubbo.scan.base-packages     包扫描,将对象交给ioc容器并暴露到注册中心

dubbo:
  application:
    name: dubbo-demo-provider
    qos-port: 22223
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  scan:
    base-packages: com.zj.service

④、启动类

@SpringBootApplication
public class ProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class, args);
    }
}

六、服务消费者

①、pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

<dependencies>
    <!--web环境-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--dubbo的起步依赖-->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.5</version>
    </dependency>
    <!-- zookeeper的api管理依赖 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <!-- zookeeper依赖 -->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.12</version>
    </dependency>
    <!--依赖公共接口-->
        <dependency>
            <groupId>com.zj</groupId>
            <artifactId>dubbo-demo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
</dependencies>

②、编写controller

@RestController
public class UserController {
 
    @Reference // 使用 org.apache.dubbo 包下注解
    private UserService userService;
    
    @GetMapping("/user/hello")
    public String sayHello(String name){
        return userService.sayHello(name);
    }
}

③、application.yml

# dubbo.application.name       服务名称,一般跟模块名称一致即可
# dubbo.registry.address       注册中心的连接地址
# dubbo.scan.base-packages     包扫描

dubbo:
  application:
    name: dubbo-demo-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: com.zj.controller

④、启动类

@SpringBootApplication
public class ConsumerApp {
    
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class, args);
    }
}

七、公共接口模块抽取

①、pom.xml

<dependencies>
    <!-- 因为本次我们简单练习案例,所以导入该坐标依赖,将实体类写到该模块
	-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
</dependencies>

<!--没有父工程进行版本锁定,所以手动设置jdk和字符集编码-->
<build>
    <plugins>
        <!-- 设置编译版本为1.8 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

②、编写service接口

 String sayHello(String name);

八、使用细节

1、序列化

dubbo底层是需要通过网络传输数据的,因此被传输的对象必须实现序列化接口 当消费者和服务生产者之间进行传输时,不管是参数还是返回值,只要是传输的都必须实现序列化接口

2、启动时检查

启动时检查,配置在服务消费者一方,用于服务消费者在启动的时候主动检查注册中心或者服务提供者是否准备好提供服务

1.如果配置为false,代表不检查

2.如果配置为true,代表检查,一旦检查到服务提供者未准备好,就会直接抛异常

dubbo:
	consumer:  # 检查服务提供者是否正常启动
		check: false
	registry:  # 检查注册中心是否正常启动
		check: false

3、服务超时

服务消费者在调用服务提供者的时候可能会发生阻塞、等待的情形,这个时候,如果服务消费者会一直等下去,就会造成线程堆积,服务宕机。

① 全局配置

如果同时设置了,消费者提供者优先级高

# dubbo允许设置一个服务的超时时间(默认为1s),如果超过这个时间,服务无法作出反应,直接终止线程。
dubbo:
	provider:
		timeout: 5000
		retries: 0

# 这个时间可以设置在服务调用者一端,也可以设置在服务提供者一端
dubbo:
	consumer:
		timeout: 3000
		retries: 0

② 局部配置【推荐】

dubbo还支持在类上定义超时时间,其优先级高于全局配置

//1. 在服务提供端声明
@Service(timeout = 3000, retries = 0) 
public class UserServiceImpl implements UserService{}

//2. 在服务调用端声明
public class Controller{
	@Reference(timeout = 6000,retries = 0)
	private UserService userService;    
}

4、服务重试

dubbo设置了超时时间,如果在这个时间段内,无法完成服务访问,则自动断开连接。

为了弥补这一特性的缺点,保证系统健壮,dubbo提供了重试机制。

public class Controller{
	@Reference(timeout = 2000,retries = 4)  // 默认值是重试两次
	private UserService userService;    
}

5、 服务降级

当一个请求发生超时,一直等待着服务响应,那么在高并发情况下,很多请求都是因为这样一直等着响应,直到服务资源耗尽产生宕机,而宕机之后会导致分布式其他服务调用该宕机的服务也会出现资源耗尽宕机, 这样下去将导致整个分布式服务都瘫痪。

@RestController
public class Controller {

    @Reference(mock = "fail:return 默认值")
    private Us`erService userService;
}

6、负载均衡–智能容错

负载均衡策略 : 解决服务器消费者的一个请求到底应该由哪一个服务提供者去处理

在高并发情况下,一个服务往往需要以集群的形式对外工作。

dubbo支持四种负载均衡策略:

Random:按权重随机选择,这是默认值。

RoundRobin:按权重轮询选择。

LeastActive:最少活跃调用数,相同活跃数的随机选择。

ConsistentHash:一致性Hash,相同参数的请求总是发到同一提供者。

使用:

@Reference(loadbalance = "RoundRobin")

集群和分布式区别:

集群:(高可用) 多台服务器重复完成同一个任务,即同一个任务部署在多台服务器上

分布式:(高性能) 多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务

7 、多版本

dubbo使用version属性来设置和调用同一个接口的不同版本

实例:

①、服务提供者1(provider1)

@Service(version = "v1.0") //设置版本为v1.0
public class HelloServiceImpl implements HelloService {}

②、服务提供者2(provider2)

@Service(version = "v2.0")  //设置版本为v2.0
public class HelloServiceImpl implements HelloService {}

③、服务消费者(consumer)

@RestController
public class HelloController {
	@Reference(version = "v1.0")  // 指定哪个版本
	 private HelloService helloService;
}

最后

最近面试的小伙伴挺多的,小编整理了全套的Java面试宝典手册,“性能调优+微服务架构+并发编程+开源框架+分布式”等七大面试专栏,包含Tomcat、JVM、MySQL、SpringCloud、SpringBoot、Dubbo、并发、Spring、SpringMVC、MyBatis、Zookeeper、Ngnix、Kafka、MQ、Redis、MongoDB、memcached等等。如果你对这个感兴趣,小编可免费分享。

资料获取方式:关注小编+转发文章+私信【面试题】获取上述资料~

重要的事情说三遍,转发+转发+转发,一定要记得转发哦!!!

相关推荐

Dubbo最全详解(万字图文总结)

大家好,我是mikechen。Dubbo是非常重要的分布式中间件,也是微服务的核心框架,而且大厂也特别喜欢考察Dubbo,下面我就全面来详解Dubbo@mikechen本篇已收于mikechen原创超...

探秘Dubbo:RPC框架的奇妙世界

探秘Dubbo:RPC框架的奇妙世界大家好啊!今天我要带大家走进一个神奇的编程领域——分布式服务调用。说起分布式系统,很多程序员都头疼不已。但今天咱们不谈那些让人抓狂的网络延迟、负载均衡等问题,而是聚...

Dubbo分布式服务框架:像调教宠物一样驾驭它

Dubbo分布式服务框架:像调教宠物一样驾驭它大家好呀,今天我们来聊聊Dubbo这个分布式服务框架,它就像一只温顺的小猫咪,但有时候也会调皮捣蛋,所以得好好调教一番。别担心,我会用最轻松的方式来帮你搞...

深入浅出:Dubbo框架源码分析

深入浅出:Dubbo框架源码分析Dubbo是一款由阿里巴巴开源的高性能分布式服务框架,广泛应用于微服务架构中。它为开发者提供了强大的RPC调用能力,使得分布式系统中的服务间通信变得简单高效。本文...

Dubbo分布式服务框架:从零开始的实战之旅

Dubbo分布式服务框架:从零开始的实战之旅Dubbo作为一个高性能的JavaRPC框架,在微服务架构中扮演着重要角色。它能帮助开发者轻松构建分布式系统,实现服务间的高效通信。今天,我们就来一起探索...

Dubbo分布式服务框架的工作原理:从入门到精通

Dubbo分布式服务框架的工作原理:从入门到精通Dubbo是一个高性能的Java分布式服务框架,由阿里巴巴开源。它致力于提供透明化的远程方法调用(RPC),使得开发者能够像调用本地服务一样调用远程服务...

框架的本质分析——Dubbo

诞生的背景什么背景下诞生了该技术?不论是哪个框架,不会平白无故诞生,不会平白无故的被人所追捧,了解其背景,追根溯源。随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架...

2023编导艺考「热点话题」评述框架示例(七个2022热点)

2022冬奥会开幕式(1)“旧”文化符号的“新”应用(2)“全媒体”时代的“小人物”(3)“简约”的形式表达“丰富”的内核(4)“新”叙事结构打破“旧”国家形象(5)数字媒介增强受众“在场感”短视频“...

84页思考的框架,思维模型的全明星集合,9种经典思维模型

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!84页思考的框架如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

DUSt3R-从任意图像集合中重建3D场景的框架

DUSt3R是什么DUSt3R(DenseandUnconstrainedStereo3DReconstruction,密集无约束立体三维重建)是由来自芬兰阿尔托大学和Naver欧洲实验室的...

高考数学:一张思维导图掌握集合知识点,真题解析巩固知识

一、思维导图二、疑难透析三、题型示例1、已知集合A={1,3},B={x丨mx-3=0},且A∪B=A,则m的取值是()。【解析】分类讨论思想∵AUB=A∴BA(1)当m=0时,B=,符合条件;...

java集合框架03——ArrayList和源码分析

上一章学习了Collection的架构,并阅读了部分源码,这一章开始,我们将对Collection的具体实现进行详细学习。首先学习List。而ArrayList又是List中最为常用的,因此本章先学习...

Java Collections 工具类集合框架中常用算法解析

在软件开发中,算法是非常重要的一部分,它们可以提供高效的数据处理和操作。在Java集合框架中,有几个常用的算法,包括排序算法、二分查找算法、洗牌算法和旋转算法。本文将对这些算法进行详细解析,并写了一些...

1.6、Java 异常处理机制与集合框架(List、Set、Map等)

在Java编程中,异常处理机制和集合框架是两个非常重要的概念。前者帮助开发者处理程序运行时可能遇到的错误,确保程序能够稳定运行;后者则提供了一种有效的方式来管理和操作数据集合。本文将分别介绍Java中...

Java集合框架性能优化秘籍

Java集合框架性能优化秘籍在Java的世界里,集合框架就像一座巨大的宝库,存储着我们程序的各种数据。然而,随着数据量的增大,如何让这座宝库更高效地运作,就成了我们必须掌握的艺术。今天,我们就来聊聊J...

取消回复欢迎 发表评论: