Dubbo框架

news2024/10/5 19:14:35

文章目录

  • 1. 什么是Dubbo
  • 2. Dubbo架构
  • 3. SpringBoot整合Dubbo框架
    • 3.1 前期准备
      • 3.1.1 Zookeeper的安装
    • 3.2 项目创建
    • 3.3 添加依赖
    • 3.4 定义服务接口
    • 3.5 服务端的实现
    • 3.6 消费端请求任务
    • 3.7 服务端配置文件
    • 3.8 消费端配置文件
    • 3.9 启动应用
  • 4. Dubbo负载均衡
  • 5. Dubbo集群容错

1. 什么是Dubbo

Dubbo是一款高性能、轻量级的RPC服务开发框架,是由阿里巴巴公司开源并贡献给Apache基金会的。他可以通过RPC快速调用远程服务,并且提供了很多功能,例如负载均衡、服务注册和发现、容错机制等,使得分布式服务的开发变得更加简单和方便。

RPC:Remote Procedure Call Protocol,远程过程调用协议。

2. Dubbo架构

架构图如图
在这里插入图片描述
角色说明

Registry:服务注册与发现的注册中心
Consumer:调用远程服务的服务消费者
Provider:暴露服务的服务提供者
Container:服务器运行容器
Monitor:统计服务的调用次数和调用时间的监控中心

调用关系说明

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

3. SpringBoot整合Dubbo框架

3.1 前期准备

3.1.1 Zookeeper的安装

这里注册中心使用的Zookeeper。
下载地址 https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz

下载之后解压到文件夹下,这里需要将文件conf下的zoo_sample.cfg文件改为zoo.cfg文件,然后更改一些配置信息。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:/apache-zookeeper-3.8.1-bin/data
clientPort=2181
admin.serverPort=2182

然后在bin目录下,点击zkServer.cmd启动zookeeper

3.2 项目创建

先创建一个基础项目
在这里插入图片描述
现在还需要创建三个子模块
dubbo-api:共享 API 模块
dubbo-consumer:消费端模块
dubbo-provider:服务端模块
在这里插入图片描述
在这里插入图片描述

3.3 添加依赖

在父项目的pom.xml中添加依赖

	<properties>
        <java.version>1.8</java.version>
        <dubbo.version>3.1.0</dubbo.version>
        <spring-boot.version>2.7.12</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Dubbo -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

为子项目consumer和provider两个模块添加依赖

	<parent>
        <groupId>com.example</groupId>
        <artifactId>springboot-dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
	
	    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-reload4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

3.4 定义服务接口

在这里插入图片描述

public interface DemoService {
    String sayHello(String name);
}

3.5 服务端的实现

在这里插入图片描述

注意这里的Service是DubboService

@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

3.6 消费端请求任务

在这里插入图片描述

注意这里的@DubboReference 从 Dubbo 获取了一个 RPC 订阅。

@Component
public class Task implements CommandLineRunner {
    @DubboReference
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);

        new Thread(()-> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
            }
        }).start();
    }
}

3.7 服务端配置文件

dubbo:
  # Dubbo 的应用名
  application:
    name: dubbo--provider
  # Dubbo 协议信息
  protocol:
    name: dubbo
    port: -1
  # Dubbo 使用的注册中心地址
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181

server:
  port: 8081

3.8 消费端配置文件

dubbo:
  # Dubbo 的应用名
  application:
    name: dubbo-consumer
  # Dubbo 协议信息
  protocol:
    name: dubbo
    port: -1
  # Dubbo 使用的注册中心地址
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181


server:
  port: 8082

3.9 启动应用

首先启动provider的启动类
在这里插入图片描述
这里最后日志是 [Dubbo] Current Spring Boot Application is await...
就代表成功了

然后启动consumer的启动类
在这里插入图片描述

4. Dubbo负载均衡

Dubbo框架提供了多种负载均衡策略,用于消费者在调用服务提供者时选择一个合适的节点进行调用。以下是Dubbo支持的几种负载均衡策略:

  1. 权重随机负载均衡(Random LoadBalance):随机从可用的节点中选择一个进行调用。
  2. 加权轮询负载均衡(Round Robin LoadBalance):按照轮询的方式依次选择可用节点进行调用。
  3. 最少活跃数负载均衡(Least Active LoadBalance):选择最少活跃数的节点进行调用,可以有效地避免出现单节点负载过高的情况。
  4. 一致性哈希负载均衡(Consistent Hash LoadBalance):将请求的关键字映射到一个哈希环上,每个节点在哈希环上占据一个位置,通过哈希算法来选择一个最近的节点进行调用。

Dubbo框架默认使用的是基于权重随机负载均衡策略。

在Spring Boot中,我们可以通过在application.properties或application.yml配置文件中指定Dubbo的负载均衡策略。具体步骤如下:

  1. 在application.properties或application.yml文件中添加以下配置:
# 指定负载均衡策略为轮询
dubbo.consumer.loadbalance=roundrobin

其中,dubbo.consumer.loadbalance表示服务消费者端的负载均衡策略。

  1. 如果需要动态切换Dubbo的负载均衡策略,可以使用Dubbo提供的API,修改ReferenceConfig对象的负载均衡策略属性,示例代码如下:
@Autowired
private ReferenceConfig<MyService> reference;

public void changeLoadBalance(String loadBalance) {
    reference.setLoadbalance(loadBalance);
}

在上面的代码中,我们注入了一个ReferenceConfig实例,并定义了一个changeLoadBalance方法用于动态修改负载均衡策略。调用setLoadbalance方法修改负载均衡策略即可。

除了在application.properties或application.yml文件中配置外,我们也可以在Java Config类中通过@Bean注解自定义Dubbo的负载均衡策略,示例如下:

@Configuration
public class DubboConfig {

    @Bean
    public ReferenceConfig<MyService> referenceConfig() {
        ReferenceConfig<MyService> reference = new ReferenceConfig<>();
        reference.setInterface(MyService.class);

        LoadBalance loadBalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension("leastactive");
        reference.setLoadbalance(loadBalance);

        return reference;
    }
}

在上面的代码中,我们使用@Bean注解定义了一个ReferenceConfig实例,并通过getExtension方法获取了Dubbo的负载均衡策略扩展实现。

5. Dubbo集群容错

Dubbo的集群容错可以提高系统的可用性和稳定性,有效地降低了服务调用失败的风险。如果服务调用出现异常或者超时,Dubbo会根据预定义的容错机制对请求进行处理,从而保证服务调用的可靠性。

Dubbo提供了多种集群容错方案,主要包括以下几种:

  1. Failover Cluster:这是Dubbo默认的容错机制,当请求失败时,会自动切换到另一个节点进行重试,默认情况下重试2次。可以通过设置retries属性来调整重试次数。
  2. Failfast Cluster:该集群容错机制非常快速,但不会进行重试。如果一个节点出现异常,那么立即返回错误响应。
  3. Failsafe Cluster:该集群容错机制会在出现异常时返回一个空结果,不会抛出异常。适用于有些场景下,部分节点不可用但是不影响整体服务的情况。
  4. Failback Cluster:该集群容错机制在发生失败后进行后台重试,不会阻塞当前请求线程。该机制可能会引起重复执行问题,需要开发者自行处理。
  5. Forking Cluster:该集群容错机制会同时向多个节点发起请求,并取最先返回的一个结果。可以通过设置forks属性来指定并发请求数量。
  6. Broadcast Cluster:将请求广播给所有提供者,适用于通知所有提供者更新缓存等操作。

在Spring Boot中,我们可以通过在application.properties或application.yml配置文件中指定Dubbo的集群容错策略。具体步骤如下:

  1. 在application.properties或application.yml文件中添加以下配置:
# 指定集群容错策略为Failfast Cluster
dubbo.consumer.cluster=failfast

其中,dubbo.consumer.cluster表示服务消费者端的集群容错策略。

  1. 如果需要动态切换Dubbo的集群容错策略,可以使用Dubbo提供的API,修改ReferenceConfig对象的负载均衡策略属性,示例代码如下:
@Autowired
private ReferenceConfig<MyService> reference;

public void changeCluster(String cluster) {
    reference.setCluster(cluster);
}

在上面的代码中,我们注入了一个ReferenceConfig实例,并定义了一个changeCluster方法用于动态修改集群容错策略。调用setCluster方法修改集群容错策略即可。

除了在application.properties或application.yml文件中配置外,我们也可以在Java Config类中通过@Bean注解自定义Dubbo的集群容错策略,示例如下:

@Configuration
public class DubboConfig {

    @Bean
    public ReferenceConfig<MyService> referenceConfig() {
        ReferenceConfig<MyService> reference = new ReferenceConfig<>();
        reference.setInterface(MyService.class);

        Cluster cluster = ExtensionLoader.getExtensionLoader(Cluster.class).getExtension("failover");
        reference.setCluster(cluster);

        return reference;
    }
}

在上面的代码中,我们使用@Bean注解定义了一个ReferenceConfig实例,并通过getExtension方法获取了Dubbo的集群容错策略扩展实现。

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

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

相关文章

第一部分-基础篇-第一章:PSTN与VOIP(上篇)

文章目录 序言引言&#xff1a;什么是VOIP和PSTN1.1 PSTN起源与发展1.1.1 最早的电话网1.1.2 人工电话交换时代1.1.3自动电话交换时代1.1.4半电子交换机时代1.1.5空分交换机时代1.1.6 数字交换机时代1.1.7现代PSTN时代1.1.8 下一代网络及VoIP时代 1.2 电话实现技术1.2.1 电话号…

【MySQL】如何速通MySQL(1)

&#x1f4cc;前言&#xff1a;本篇博客介绍如何速通MySQL&#xff0c;主要介绍Mysql中主要的基础的入门&#xff0c;学习MySQL之前要先安装好MySQL&#xff0c;如果还没有安装的小伙伴可以看看博主前面的博客&#xff0c;里面有详细的安装教程。或者看一下下面这个链接~ &…

“AI孙燕姿”爆火背后,是内容合规问题的再次升级|上云那些事

“讽刺的是&#xff0c;人类再怎么快也无法超越它。”这是歌手孙燕姿关于自己AI分身遍布网络一事&#xff0c;在MAKE MUSIC网站的博客上发表的看法。 来源&#xff1a;孙燕姿MAKE MUSIC网站博客 当大家还在担心AIGC会不会让自己失业时&#xff0c;歌手孙燕姿就因为“AI孙燕姿”…

LDA算法实现鸢尾花数据集降维

目录 1. 作者介绍2. LDA降维算法2.1 基本概念2.2 算法流程 3. LDA算法实现3.1 数据集介绍3.2 代码实现3.3 结果展示 1. 作者介绍 唐杰&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…

深度学习笔记(八)——语义分割标注转换

核心思想&#xff1a;“将颜色转换成对应的标号” 形式一&#xff1a;Json格式的标注转换成调色板mask 形式二&#xff1a;RGB类型mask(24位三通道&#xff09;转成调色板mask&#xff08;8位单通道&#xff09;&#xff0c;调色板的格式为.png 形式三&#xff1a;对于二分类的…

oracle安装

服务端安装&#xff08;公司中不需要&#xff0c;只安装客户端就行&#xff09; 1、挂载一个Windows系统 双击vmx文件 启动 2、网络配置 添加一个网络 自己电脑看控制面板是否添加虚拟网卡 查看连接的网络&#xff0c;ip地址不能为1&#xff0c;为1就自己修改&#xff0c;…

深度剖析:C++内存池的设计与实现

深度剖析&#xff1a;C内存池的设计与实现 一、引言&#xff08;Introduction&#xff09;1.1 内存管理的重要性1.2 内存池的基本概念1.3 内存池的应用场景 二、C内存管理机制&#xff08;C Memory Management Mechanism&#xff09;2.1 C内存分配与释放2.2 C内存管理的问题2.3…

《Kali渗透基础》04. 主动信息收集(一)

kali渗透 1&#xff1a;主动信息收集2&#xff1a;发现3&#xff1a;二层发现3.1&#xff1a;arping3.2&#xff1a;nmap3.3&#xff1a;netdiscover3.4&#xff1a;Scapy 4&#xff1a;三层发现4.1&#xff1a;ping4.2&#xff1a;Scapy4.3&#xff1a;nmap4.4&#xff1a;fpi…

Win2016服务器DNS服务搭建

文章目录 前言一、什么是DNS&#xff1f;1.为什么需要DNS系统2.为DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;的功能3.域名解决方案的演进 二、域名介绍1.域名空间结构2.常见的顶级域名 三、DNS解析原理1.查询过程及方式2.DNS的查询分类 四、配置DNS服…

【论文精读】ICLR2022 - 语言驱动的语义分割

【论文精读】ICLR2022 - 语言驱动的语义分割 【论文原文】&#xff1a;LANGUAGE-DRIVEN SEMANTIC SEGMENTATION 【作者信息】&#xff1a;Boyi Li Cornell University, Cornell Tech Kilian Q. Weinberger Cornell University Serge Belongie University of Copenhagen Vladl…

2023年试用uniapp、vue2、vue3、typescript、vite、nvue

1. 前言 试用了一下 uniapp、vue2、vue3、typescript、vite、nvue 等技术&#xff0c;写了两个页面&#xff0c;两个页面加起来不到400行代码。 尝试使用了四种组合&#xff1a; 组合1&#xff1a;uniapp vue2 JavaScript nvue文件 非fast模式 组合2&#xff1a;uniapp…

【C++系列Pn】模板搞不懂,脑阔抖三抖(精讲模板,快来复习趴)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过C的老铁&#xff0c;主要内容含 目录 一.模板 1.函数模板 一.函数模板概念 二.函数模板的格式 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的…

数据库的简介

文章目录 前言一、为什么需要数据库二、数据库基本概念1.什么是数据库2.什么是数据库管理系统3.数据库表4.数据库表 三、常见的数据库管理系统 前言 数据库的简介 一、为什么需要数据库 信息时代数据容量海量增长&#xff0c;结构化存储大量数据&#xff0c;便于高效的检索和…

如何在华为OD机试中获得满分?Java实现【区块链文件转储系统】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

完全详解权限系统设计方案

1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&#xff0c;程序员新入职一家公司需要找人开通各种权限&#xff0c;比如网络连接的权限、编码下载提交的权限、监控平台登录的权限、运营平台查数据的权限等等。 在很多时候我们会觉得这么多繁杂的申请给工作带…

【JavaSE】Java基础语法(十五):继承

文章目录 1. 继承的实现2. 继承的好处和弊端3. Java中继承的特点4. 继承中的成员访问特点5. super6. 继承中构造方法的访问特点7. 继承中成员方法的访问特点8. super内存图9. 方法重写10. 权限修饰符 1. 继承的实现 继承的概念 继承是面向对象三大特征之一&#xff0c;可以使得…

G0第23章 :gorm介绍、模型定义、连接数据库

01 GORM介绍 https://gorm.io/zh_CN/docs/ gorm是一个使用Go语言编写的ORM框架。它文档齐全&#xff0c;对开发者友好&#xff0c;支持主流数据库。 特性 全功能 ORM关联 (Has One&#xff0c;Has Many&#xff0c;Belongs To&#xff0c;Many To Many&#xff0c;多态&…

SentinelResource配置

1.SentinelResource配置&#xff08;上&#xff09; 1.1.按资源名称限流 后续处理 1.1.1.启动Nacos成功 1.1.2.启动Sentinel成功 1.1.3.添加控制器 import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockExc…

2023-05-26:golang关于垃圾回收和析构函数的选择题,多数人会选错。

2023-05-26&#xff1a;golang关于垃圾回收和析构的选择题&#xff0c;代码如下&#xff1a; package mainimport ("fmt""runtime""time" )type ListNode struct {Val intNext *ListNode }func main0() {a : &ListNode{Val: 1}b : &Li…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…