Dubbo学习(二)——dubbo环境搭建

news2024/11/24 3:04:01

文章目录

  • dubbo核心简介
  • SpringCloud与Dubbo的区别
  • Dubbo的架构说明
  • dubbo和Feign远程调用的差异
    • 共同点:
    • 区别:
  • 基于 Spring Boot 开发微服务应用
    • 项目介绍
    • 1. 启动注册中心
    • 2. 新建一个spring boot项目
    • 3. 添加 Maven 依赖
    • 4. 定义服务接口
    • 5. 定义服务端的实现
      • 实现接口
      • 配置服务端Yaml 配置文件:
      • 基于 Spring 配置服务端启动类
    • 6. 定义消费端的实现
      • 调用接口
      • 配置消费端Yaml配置文件
      • 基于Spring配置消费端启动类
    • 7. 启动应用
  • 总结

dubbo核心简介

Dubbo官网:https://cn.dubbo.apache.org/zh-cn/

Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,服务自动注册和发现。分布式系统是将一个系统拆分为多个不同的服务。

SpringCloud与Dubbo的区别

Spring Clouddubbo
框架模型是基于HTTP协议的RESTful风格调用采用RPC远程过程调用形式
服务发现与治理支持注册中心支持注册中心
服务调用基于HTTP/Rest的短连接长连接
配置管理支持灵活的配置管理和动态刷新需要手动编写接口或启用第三方集成

Dubbo的架构说明

在这里插入图片描述
各个节点的说明:

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

dubbo和Feign远程调用的差异

共同点:

功能上有很多类似的地方,因为都是专注于远程调用这个动作。比如注册中心、负载均衡、失败重试熔断、链路监控。

区别:

实现上:Dubbo除了注册中心,其它的都自己实现了,而Feign大部分功能都是依赖全家桶的组件来实现的。Dubbo小而专一,专注于远程调用。而Spring全家桶而言,远程调用只是一个重要的功能而已。

  • Feign是基于传统Http接口的封装,追求的是简洁,少侵入(因为就服务端而言,在SpringCloud环境下,不需要做任何额外的操作,而Dubbo的服务端需要配置开放的Dubbo接口)
  • Dubbo性能更好(比如支持异步调用、Netty性能更好)
  • Dubbo配置更灵活(比如引入权重,比如动态配置),比如多传输协议(Dubbo、Rmi、http、redis等等)

基于 Spring Boot 开发微服务应用

项目介绍

在本任务中,将分为 3 个子模块进行独立开发,模拟生产环境下的部署架构。

interface       // 共享 API 模块
consumer        // 消费端模块
provider        // 服务端模块

如上所示,共有 3 个模块,其中 interface 模块被 consumer 和 provider 两个模块共同依赖,存储 RPC 通信使用的 API 接口。

1. 启动注册中心

对于一个微服务化的应用来说,注册中心是不可或缺的一个组件。只有通过注册中心,消费端才可以成功发现服务端的地址信息,进而进行调用。(用Nacos作为注册中心即可)

2. 新建一个spring boot项目

基于 IntelliJ IDEA 进行工程的搭建以及测试。
在这里插入图片描述
搭建了基础项目之后,我们还需要创建 interface 、provider 和 consumer 三个子模块。
在这里插入图片描述

3. 添加 Maven 依赖

在搭建完项目的基础框架以后,我们需要先添加 Dubbo 和注册中心Nacos的相关的 maven 依赖。对于多模块项目,首先需要在父项目的 pom.xml 里面配置依赖信息。
编辑 ./pom.xml 这个文件,添加下列配置。

	<properties>
        <dubbo.version>3.2.0-beta.4</dubbo.version>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
<dependencyManagement>
        <dependencies>
            <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>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>2.1.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

然后在 consumer 和 provider 两个模块 pom.xml 中进行具体依赖的配置。

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>interface</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.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.1.0</version>
        </dependency>

    </dependencies>

4. 定义服务接口

服务接口 Dubbo 中沟通消费端和服务端的桥梁。
在这里插入图片描述
在此目录下定义DemoServie接口:

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

在 DemoService 中,定义了 sayHello 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的。

5. 定义服务端的实现

实现接口

定义了服务接口之后,可以在服务端这一侧定义对应的实现,这部分的实现相对于消费端来说是远端的实现,本地没有相关的信息。

@DubboService
public class DemoServiceImpl implements DemoService {

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

在 DemoServiceImpl 中,实现了 DemoService 接口,对于 sayHello 方法返回 Hello name。

注:在DemoServiceImpl 类中添加了 @DubboService 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。

配置服务端Yaml 配置文件:

通过 Spring Boot 的方式配置 Dubbo 的一些基础信息。
首先,我们先创建服务端的配置文件。
在这里插入图片描述
在 provider 模块的 resources 资源文件夹下建立 application.yml 文件,定义如下:

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
#    使用的注册中心地址
    address: nacos://localhost:8848

在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。

基于 Spring 配置服务端启动类

除了配置 Yaml 配置文件之外,我们还需要创建基于 Spring Boot 的启动类。

首先,我们先创建服务端的启动类。

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

在这个启动类中,配置了一个 ProviderApplication 去读取我们前面第 6 步中定义的 application.yml 配置文件并启动应用。@EnableDubbo做了两件事,一个是初始化Dubbo核心组件,加载Dubbo配置到内存。另一个是注册BeanPostProcessor,用来扫描@Service和@Reference注解。

6. 定义消费端的实现

调用接口

我们在 Spring Boot 模式下还可以基于 CommandLineRunner去创建。
CommandLineRunner是个接口,有一个run()方法。为了使用CommandLineRunner我们需要创建一个类实现该接口并覆盖run()方法。使用@Component注解实现类。当SpringApplication.run()启动spring boot程序时,启动完成之前,CommandLineRunner.run()会被执行。CommandLineRunner的run()方法接收启动服务时传过来的参数。

@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();
    }
}

在 Task 类中,通过@DubboReference 从 Dubbo 获取了一个 RPC 订阅,这个 demoService 可以像本地调用一样直接调用。在 run方法中创建了一个线程进行调用。

配置消费端Yaml配置文件

dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://localhost:8848

基于Spring配置消费端启动类

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

7. 启动应用

代码就已经开发完成了,本小节将启动整个项目并进行验证。
首先是启动provider.Application ,等待一会出现如下图所示的日志(Current Spring Boot Application is await)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。
在这里插入图片描述
然后启动ConsumerApplication,等待一会出现如下图所示的日志(Hello world )即代表服务消费端启动完毕并调用到服务端成功获取结果。
在这里插入图片描述

总结

使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。

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

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

相关文章

操作系统 --- 进程的描述与控制

&#xff08;一 &#xff09;前趋图和程序的执行 前趋图 前趋图 :有向无循环图 &#xff0c;用于描述 进程之间执行的先后顺序 结点表示进程或程序段&#xff0c;有向边表示前趋关系 前驱图中是不允许有循环的&#xff0c;否则必然会产生无法实现的前驱关系。 &#xff08;二…

浙大公共管理硕士(MPA)提前批面试的题库里到底有哪些内容?

像研究生招生这样严肃的工作&#xff0c;所有的环节和程序都得有章可循&#xff01;浙大公共管理硕士&#xff08;MPA&#xff09;项目提前批面试即将在10月14日举行&#xff0c;已经通过材料审核的考生肯定很想知道面试中会遇到什么样的题目&#xff0c;专注浙大的杭州达立易考…

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…

Redis各数据类型特定的命令和用法 1.0版本

目录 一、Sring数据类型1.1 概述1.2 set/get/append/strlen命令1.3 incr/decr/incrby/decrby 命令1.4 getset命令1.5 setex命令1.6 setnx命令1.7 mset/mget/msetnx命令 二、List数据类型2.1 概述2.2 lpush/lpushx/lrange命令2.3 lpop/llen命令2.4 lrem/lset/lindex/ltrim命令2.…

信息安全:网络安全审计技术原理与应用.

信息安全&#xff1a;网络安全审计技术原理与应用. 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。网络安全审计的作用在千建立“事后“安全保障措施&#xff0c;保存网络安全事件及行为信息&#xff0c;为网络安全事件分析提供线…

SpringBoot之视图解析

文章目录 前言一、视图解析1.视图解析原理流程 二、模板引擎——Thymeleaf基本语法表达式字面量文本操作数学运算布尔运算比较运算条件运算特殊操作设置属性值-th:attr迭代条件运算属性优先级 提取公共页面th:insertth:replace区别 总结 前言 SpringBoot默认不支持 JSP&#x…

UE学习记录07----C++中使用事件委托

1.c定义多播委托&#xff0c;示例代码&#xff1a; #include "Delegates/Delegate.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyDelegate, UObject*, SelectAgent);/****/ UCLASS(Blueprintable, DisplayName "VM_PlaceEntity") class PR_PLACEE…

“益路同行”栏目人物专访第0001期—笨爸爸工房创始人张旭健先生

中国善网在第十届慈展会上特别推出了《益路同行》采访栏目&#xff0c;《益路同行》栏目旨在寻觅公益之路上同行者的故事&#xff0c;挖掘公益更深层次的内涵&#xff0c;探索新时代公益发展道路。希望公益企业、人物、故事被更多人看到&#xff0c;并呼吁更多人为公益做出自己…

san.js源码解读之工具(util)篇——splitStr2Obj函数

一、 源码解析 /*** 将字符串逗号切分返回对象** param {string} source 源字符串* return {Object}*/ function splitStr2Obj(source) {var result {};each( // 2source.split(,), // 1function (key) { // 3result[key] key;});return result; }把字符串通过 split 函数以…

力扣刷题-链表-链表相交

02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返…

C语言动态内存管理malloc、calloc、realloc、free函数的讲解

一.为什么存在动态内存管理&#xff1a; 我们知道&#xff0c;在此之前向内存申请空间的方式有以下两种&#xff1a;&#xff08;变量和数组&#xff09; 但这两种方法有几个缺陷&#xff1a; ①&#xff1a;空间开辟大小是固定的&#xff1b; ②&#xff1a;数组在声明的时候&…

redis缓存穿透问题

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库 常见的解决办法: 缓存空对象:第一次请求发现redis和数据库中都不存在时,,可以设置请求数据为key,null为值,放置在缓存中. 但是会有一个问题,就是如果此类请求过多,会导…

渗透中Windows利用Certutil进行文件下载

渗透中Windows利用Certutil进行文件下载 1.概述2.利用Certutil进行文件下载 1.概述 certutil.exe 是一个合法Windows文件&#xff0c;用于管理Windows证书的程序。此合法Windows服务现已被广泛滥用于恶意用途 渗透中主要利用其下载、编码、解码、替代数据流等功能 可以在命令…

全流程HEC-RAS 1D/2D水动力与水环境模拟技术

查看原文>>>全流程HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用 目录 专题一、水动力模型基础 专题二、恒定流模型(1D/2D) 专题三、一维非恒定流 专题四、二维非恒定流模型&#xff08;一&#xff09; 专题五、二维非恒定流模型&#xff08;二&#…

JSON.stringify格式化数据美化显示效果(不呆板地一行显示)

一.JSON.stringify 语法: JSON.stringify(value[, replacer[,space]])第二个参数replacer: 过滤属性或者处理值第三个参数space: 美化输出格式 第一个参数: 对象object等 第二个参数replacer: 如果该参数是一个函数: 则在序列化的过程中,被序列化的值的每个属性都会经过该函…

leetcode算法题-移动零Java

这道题的解法,我们可以新建一个等长的数组,初始化后数组中的元素都为零,我们只需要遍历一遍原来的数组,将不为0的数据转移到新数组即可,下面是代码实现: public static void main(String[] args) {System.out.println("移动零:" Arrays.toString(moveZero(new int[…

SVN_SERVER的搭建

一、目前svnserver仅支持windows下安装&#xff0c;所以前提需要一台windows服务器或者windows主机 1. 下载最新版本的包 当前最新版visualsvn server最新版5.3.0 visualsvn server下载地址Downloads | VisualSVN 当前tortoiseSVn最新版1.14.5 tortoise SVN下载地址 h…

嵌入式Linux应用开发-基础知识-第六章 LED驱动程序框架

嵌入式Linux应用开发-基础知识-第六章 LED驱动程序框架 第六章 LED 驱动程序框架6.1 回顾字符设备驱动程序框架6.2 对于 LED 驱动&#xff0c;我们想要什么样的接口&#xff1f;6.3 LED 驱动要怎么写&#xff0c;才能支持多个板子&#xff1f;分层。6.4 写代码6.4.1 驱动程序6.…

车厂造手机旗舰版售价6899,不只是个“车钥匙”

大伙应该发现了这两年的一个奇怪现象&#xff1a;造手机的跑去造车&#xff0c;而车厂又跑来造手机。 这也好解释&#xff0c;毕竟别人碗里的更香、别人老氵…板先挑衅是吧&#xff1f; 昨日&#xff0c;蔚来在其创新科技日活动中正式发布了传闻已久的手机产品 NIO Phone 。 …

最全百科:什么是精益生产?有哪些难点?怎么解决?

什么是生产管理&#xff1f;什么是精益生产&#xff1f;企业生产管理都有哪些难点&#xff1f;企业生产管理又有哪些解决方案&#xff1f;如何高效的进行生产管理&#xff1f;精益生产有哪些管理工具&#xff1f;本篇&#xff0c;我们将为细细盘点企业生产管理的那些事&#xf…