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

2023-09-22 10:21:24

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

更多推荐

综述 | 实时三维形状测量技术的综述

原创|文BFT机器人随着人工智能和机器人技术的快速发展,实时三维形状测量技术变得愈发重要。由于机器人通常在动态环境中操作,因此机器人装备的三维形状测量技术需要能够实时从运动的物体中获取三维形状信息。未来的三维机器视觉技术实际上依赖于实时三维数据获取和测量技术的发展。实时高精度的三维形状测量技术在医疗手术、生物医学工程、

项目经理的“四定、五起、六法”工作法

大家好,我是老原。说来,我也工作十多年了,就像很多刚入门的项目经理一样,一开始不知道怎么预设风险、沟通和团队协调不够好;有的人就可以规避风险,人际往来和团队管理都信手拈来,整个项目顺风顺水,没什么大的问题出现……你以为他一开始就能这么6?其实都是做了很多项目后总结出了一些实用又有效的方式方法。而这些方法对每个职场人其实

SENSORO 城市数字化服务平台入围2023《财富》中国最佳设计榜

9月20日,《财富》杂志2023中国最佳设计榜揭晓,SENSORO城市智能感知服务平台荣登榜单。“这是数字政务与数字城市的新尝试”,《财富》评价称。这也是今年软件/平台类目的唯一上榜。数十年前,设计还主要体现于产品美学;到了今天,设计已成为商业模式创新和社会变革的起点。《财富》中国最佳设计榜就试图寻找那些从人的真实需求

tensorflow的unet模型

importtensorflowastffromtensorflow.keras.layersimportInput,Conv2D,MaxPooling2D,Dropout,UpSampling2D,concatenate#定义U-Net模型defunet(input_size=(256,256,3)):inputs=

正则表达式

正则表达式参考文章@CUGGZ参考文章@轩陌声明一个正则表达式字面量声明constrex=/pattern/;构造函数声明constrex=newRegExp(pattern);匹配模式字符集合[]可以匹配中括号中包含的任意字符比如想要匹配btctletrex=/[bc]t/g;letstring="actionbat

SVN 和 GIT 命令对比

参考https://blog.csdn.net/justry_deng/article/details/82259470#TortoiseSVN打分支、合并分支、切换分支https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/#版本控

机器学习——奇异值分解(未完)

开坑,刚看完书,已经有些窒息了先把坑挖了,再慢慢填,避免自己划水跳过我爱线代,线代爱我,阿弥陀佛为什么要学奇异值分解?因为书本倒数第二章专门提到的,想必一定很重要,于是我上网查了一下奇异值分解的应用wow。。。很有用,增加了学习的动力奇异值分解的应用在机器学习中,奇异值分解,可以删除一些没什么作用的特征。具体是如何删除

JVM——6.字节码指令

这篇文章我们来学习一下字节码指令目录1.简介2.字节码与数据类型3.加载与存储指令4.运算指令5.类型转换指令6.对象创建于访问指令7.操作数栈管理指令8.控制转移指令9.方法调用与返回指令10.异常处理指令11.同步指令12.小结1.简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码)

在微信公众号怎么做电子优惠券功能

在微信公众号上,商家可以提供电子优惠券功能来吸引更多的消费者关注并参与,同时提高产品的知名度和销售额。下面是一篇关于如何在微信公众号上实现电子优惠券功能的文章,供您参考。一、了解电子优惠券的定义和优势电子优惠券是一种以电子形式发放的优惠凭证,商家通过微信公众号向消费者发放电子优惠券,消费者在购买指定商品或服务时使用,可

一遍关于vue基础语法上篇

目录一.插值1.1.文本1.2.html1.2.3.属性1.1.4.表达式演示效果:二.指令2.1.v-if/v-else-if/v-else2.2.v-show2.3.v-for2.4.v-bindv-onv-model2.5.动态参数演示效果:三.过滤器3.1.局部过滤器基本应用3.2.局部过滤器串行使用3.3.局

千呼万唤openGauss资源池化系列培训来了

应openGauss广大用户要求,社区于近期推出openGauss资源池化培训系列。关于资源池化资源池化是openGauss5.0.0推出的重点特性,是openGauss基于内存池化和共享存储实现的数据库集群。数据在集群的计算节点内存、共享存储中实现共享。应用可以任意节点接入,集群可以保证提供实时一致性的数据。集群也保

热文推荐