Dubbo 与 Spring Cloud 完美结合

2023-11-04

概述 

可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时间,中间只发过一个小版本修了一个小bug,甚至大家都以为这个项目已经死掉了,竟然又在2017年9月份恢复了更新,不可谓不神奇。

网络上很多人都拿Dubbo和Spring Cloud做对比,可能在大家的心目中,这两个框架是可以画上等号的吧,后来在网络上有一个非常流行的表格,比较详细的对比了 Spring Cloud 和 Dubbo ,表格如下:

 

以上列举了一些核心部件,当然这里需要申明一点,Dubbo对于上表中总结为“无”的组件不代表不能实现,而只是Dubbo框架自身不提供,需要另外整合以实现对应的功能,这样看起来确实Dubbo更像是Spring Cloud的一个子集。

Dubbo 在国内拥有着巨大的用户群,大家希望在使用 Dubbo 的同时享受 Spring Cloud 的生态,出现各种各样的整合方案,但是因为服务中心的不同,各种整合方案并不是那么自然,直到 Spring Cloud Alibaba 这个项目出现,由官方提供了 Nacos 服务注册中心后,才将这个问题完美的解决。并且提供了 Dubbo 和 Spring Cloud 整合的方案,命名为: Dubbo Spring Cloud 。

Dubbo Spring Cloud 概述

Dubbo Spring Cloud 构建在原生的 Spring Cloud 之上,其服务治理方面的能力可认为是 Spring Cloud Plus, 不仅完全覆盖 Spring Cloud 原生特性,而且提供更为稳定和成熟的实现,特性比对如下表所示:

以上对比表格摘自Dubbo Spring Cloud官方文档。

而且Dubbo Spring Cloud 基于 Dubbo Spring Boot 2.7.1 和 Spring Cloud 2.x 开发,无论开发人员是 Dubbo 用户还是 Spring Cloud 用户, 都能轻松地驾驭,并以接近“零”成本的代价使应用向上迁移。Dubbo Spring Cloud 致力于简化云原生开发成本,以达成提高研发效能以及提升应用性能等目的。

Dubbo Spring Cloud 主要特性

面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,屏蔽了远程调用底层细节。

智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。

高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

Spring Cloud 为什么需要RPC

在Spring Cloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较Dubbo这种RPC框架而言,性能堪忧。

虽说在微服务架构中,会讲按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用HTTP这种简答的通信机制,大多数情况都会使用REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP并不会开启KeepAlive功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立TCP连接,这使得其效率变的相当低下。

对外部提供REST API服务是一件非常好的事情,但是如果内部调用也是使用HTTP调用方式,就会显得显得性能低下,Spring Cloud默认使用的Feign组件进行内部服务调用就是使用的HTTP协议进行调用,这时,我们如果内部服务使用RPC调用,对外使用REST API,将会是一个非常不错的选择,恰巧,Dubbo Spring Cloud给了我们这种选择的实现方式。

实战

本小结将会以一个简单的入门案例,介绍一下在使用Nacos作为服务中心,使用Dubbo来实现服务提供方和服务消费方的案例。

Nacos的安装、部署配置和使用已经在前面的章节介绍过了,这里不再赘述,如果还有不清楚的读者,请参考前面的Nacos系列文章:

《Spring Cloud Alibaba | Nacos服务中心初探》

《Spring Cloud Alibaba | Nacos服务注册与发现》

《Spring Cloud Alibaba | Nacos集群部署》

《Spring Cloud Alibaba | Nacos配置管理》

创建父工程 dubbo-spring-cloud-demo

父工程依赖pom.xml如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/pom.xml

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

注意:

  • 必须包含spring-boot-starter-actuator包,不然启动会报错。

  • spring-cloud-starter-dubbo包需要注意groupId,根据具体使用的spring cloud alibaba版本依赖来确定。

    • 如果使用孵化版本,使用的groupId为:org.springframework.cloud
    • 如果使用毕业版本,使用的groupId为:com.alibaba.cloud
  • 以上引用未指定版本,需显示的声明<dependencyManagement>

创建子工程 dubbo_api

 API模块,存放Dubbo服务接口和模型定义,非必要,这里创建仅为更好的代码重用以及接口、模型规格控制管理。

定义抽象接口HelloService.java:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_api/src/main/java/com/springcloud/dubbo_api/service/HelloService.java

public interface HelloService {
    String hello(String name);
}

创建子工程 dubbo_provider ,Dubbo服务提供方

工程依赖pom.xml如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/pom.xml

<!-- API -->
<dependency>
    <groupId>com.springcloud.book</groupId>
    <artifactId>ch13_1_dubbo_api</artifactId>
    <version>${project.version}</version>
</dependency>

此处引入公共API模块。

实现Dubbo接口,HelloServiceI.java如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/service/HelloServiceI.java

@Service
public class HelloServiceI implements HelloService {
    @Override
    public String hello(String name) {
        return "Hello " + name;
    }
}

注意:这里的@Service注解并不是来自Spring的org.springframework.stereotype.Service,而是Dubbo的org.apache.dubbo.config.annotation.Service,千万不要引用错误。这里的@Service注解仅声明该Java服务(本地)实现为Dubbo服务。

配置文件 application.yml 需要将Java服务(本地)配置为 Dubbo 服务(远程)如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/resources/application.yml

server:
port: 8000
dubbo:
    scan:
        base-packages: com.springcloud.book.ch13_1_dubbo_provider.service
protocol:
    name: dubbo
    port: -1
registry:
    address: spring-cloud://192.168.44.129
spring:
application:
    name: dubbo-spring-cloud-provider
cloud:
    nacos:
    discovery:
        server-addr: 192.168.44.129:8848
main:
    allow-bean-definition-overriding: true

注意:在暴露Dubbo服务方面,推荐使用外部化配置的方式,即指定Java服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注 @DubboComponentScan 来实现基准包扫描。

  • dubbo.scan.base-packages:指定 Dubbo 服务实现类的扫描基准包
  • dubbo.protocol:Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
  • dubbo.registry:Dubbo 服务注册中心配置,其中子属性address 的值 "spring-cloud://192.168.44.129",说明挂载到 Spring Cloud 注册中心
  • spring.application.name:Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 Dubbo Spring Cloud 加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name
  • spring.main.allow-bean-definition-overriding:在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
  • spring.cloud.nacos.discovery:Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。

创建应用主类Ch131DubboProviderApplication.java:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/DubboProviderApplication.java

@SpringBootApplication
@EnableDiscoveryClient
public class DubboProviderApplication {

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

}

创建子工程 dubbo_consumer ,服务调用方:

工程依赖pom.xml如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/pom.xml

<!-- API -->
<dependency>
    <groupId>com.springcloud.book</groupId>
    <artifactId>ch13_1_dubbo_api</artifactId>
    <version>${project.version}</version>
</dependency>

工程配置application.yml如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/resources/application.yml

server:
port: 8080
dubbo:
protocol:
    name: dubbo
    port: -1
registry:
    address: spring-cloud://192.168.44.129
cloud:
    subscribed-services: dubbo-spring-cloud-provider
spring:
application:
    name: dubbo-spring-cloud-consumer
cloud:
    nacos:
    discovery:
        server-addr: 192.168.44.129:8848
main:
    allow-bean-definition-overriding: true
  • dubbo.cloud.subscribed-services:表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。

测试接口HelloController.java如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/HelloController.java

@RestController
public class HelloController {
    @Reference
    private HelloService helloService;

    @GetMapping("/hello")
    public String hello() {
        return helloService.hello("Dubbo!");
    }
}

注意:这里的@Reference注解是org.apache.dubbo.config.annotation.Reference

启动主类Ch131DubboConsumerApplication.java如下:

代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/DubboConsumerApplication.java

@SpringBootApplication
@EnableDiscoveryClient
public class DubboConsumerApplication {

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

}

测试 

启动子工程 dubbo_provider 和子工程 dubbo_consumer ,启动完成后,我们可以访问Nacos控制台的服务列表上看到两个服务,如图:

我们打开浏览器访问:http://localhost:8080/hello ,可以看到页面正常显示Hello Dubbo!,测试成功,如图:

示例代码

示例代码-Github

示例代码-Gitee

参考

Dubbo Spring Cloud 官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo 与 Spring Cloud 完美结合 的相关文章

  • 学生信息管理系统

    学生信息管理系统 基于动态链表的增 删 改 查和文件的存储 实现对学生信息 姓名 性别 年龄 学号 电话 语文 数学 英语 的管理 存储学生信息的文件 define FILEPATH information txt 学生基本信息结构体 学生
  • 将用户“C:\Users\XXX”文件夹映射到其他盘符

    注意事项 在要改变用户 以xxx为例 时 系统XXX关闭 用微PE或安装好U盘的系统 进入U盘启动操作 确保映射稳定 主机的盘符与U盘启动下的盘符一致 其他的可以不一样 要将用户XXX移动到的盘符必须一致 不建议将整个用户文件夹 C Use

随机推荐

  • 网络通讯中的checksum算法

    网络通讯中的checksum算法 一 实验目的和任务 本实验要求复习Debian系统抓包工具的使用 本实验要求理解checksum算法原理和实现方法 二 实验设备介绍 1 软件需求 win7操作系统 VMware workstation u
  • latex第一段的首行缩进问题

    setlength parindent 2em 首行全部缩进2字符 但是在第一行使用没有效果 indent也是首行缩进 第一段第一行的缩进只能用 hspace 0 5em 来控制空格的多少 解决中文排版问题 hspace 0 5em 随着科
  • 复制微信公众号图片不能用,防盗链问题

    问题起因很简单 直接复制的公众号文章到网站 不单独处理图片 复制出来的文章图片因为微信防盗链设置不能显示出来 如下图 防盗链原理就是后端先拦截请求获取其中的referrer 将其和自身的白名单 本地域名等对比 符合条件的将通过 不符合的将会
  • Java:最小栈()

    一 知识准备 1 栈 核心 先进后出 从栈顶入 栈顶出 栈的几种基本操作 void push int data 入栈 int pop 弹出栈顶元素 即 删除并返回最后一个入栈的元素 int peek 返回栈顶元素但不删除 boolean e
  • 2021-03-30 python离线安装openpyxl模块

    1 前言 最近Python项目需要用openpyxl对excel进行处理 引用到了openpyxl模块 但是客户的环境没有网 无法用pip安装openpyxl 因此需要离线安装 记录下遇到的问题及解决的办法 2 过程 能联网的话用pip 一
  • WEB安全-RCE代码及命令执行漏洞

    WEB安全 RCE代码及命令执行漏洞 摘要 RCE概述 远程代码执行 eval 案例 远程命令执行 system shell exec 与 exec 案例 靶场案例 墨者靶场黑盒功能点命令执行 应用功能 墨者靶场白盒代码及命令执行 代码分析
  • make编译内核驱动模块

    make编译内核驱动模块 方法一 obj m hello world o KDIR home july7 prj Firefly RK3308 kernel 内核源码路径 PWD shell pwd 获取当前目录的变量 all make C
  • java 获取当前服务器CPU,JVM,内存等信息

    借助于 Hyperic Sigar 是一个收集系统各项底层信息的工具集 没啥技术含量 参考 https support hyperic com display SIGAR Home 下载地址 http sourceforge net pro
  • #ifndef 与 #pragma once 的使用方法

    ifndef 与 pragma once 都能让头文件只编译一次 避免重复编译 新版本的代码建议使用 pragma once 这样只要编译一次就可以了 但是很多老编译器不支持该语法 很尴尬 ifndef则需要每次使用的时候进行一次编译 速度
  • 概率论【离散型随机变量】--猴博士爱讲课

    第二课 离散型随机变量 1 6 求分布律里的未知数 2 6 根据X的分布律写Y的分布律 一维随机变量函数的分布 注意 3 6 根据 X Y 的分布律写Z的分布律 4 6 根据 X Y 的分布律写边缘分布律 边缘分布 5 6 X与Y相互独立时
  • python训练预测_python中NARX的示例-训练和预测 - python

    是否有使用Python中的NARX模型训练和预测 推断数据的端到端示例 有图书馆PyNeurgen NARX PyNeurgen library 但是PyNeurgen的文档不是很完整 该OP似乎已经编写了Keras实现 但是代码缺少用于推
  • CLion2021.2配置qt环境

    文章参考文档 使用CLion开发Qt Qt5 9 1 CLion2020 3 Clion中Cmake构建出现复制文件错误的解决办法 Clion 创建 Qt UI Class 踩坑 文章目录 1 前言 2 QT安装与环境变量的配置 3 工具链
  • Spring系列之@EnableAsync & @Async 实现方法异步调用

    1 本文内容 详解 EnableAsync Async 主要分下面几个点进行介绍 作用 用法 获取异步执行结果 自定义异步执行的线程池 自定义异常处理 线程隔离 源码 原理 2 作用 spring容器中实现bean方法的异步调用 比如有个l
  • 代码随想录算法训练营19期第44天

    完全背包 视频讲解 带你学透完全背包问题 和 01背包有什么差别 遍历顺序上有什么讲究 哔哩哔哩 bilibili https programmercarl com E8 83 8C E5 8C 85 E9 97 AE E9 A2 98 E
  • 数据工具sqoop用法之mysql与hive数据导入导出

    一 pom org apache hive hive jdbc 1 1 0 org apache hadoop hadoop common 2 6 0 org mybatis mybatis 3 4 6 mysql mysql connec
  • 别再无聊地显示隐藏了,Vue 中使用过渡动画让你的网页更有活力

    点击上方 前端Q 关注公众号 回复加群 加入前端Q技术交流群 Vue 是一款流行的前端框架 支持过渡动画的实现是其中的一项重要特性 在 Vue 中 使用过渡动画可以为用户提供更加友好的用户体验 下面我将为大家介绍一下子如何在 Vue 中实现
  • Python报错解决:local variable ‘xxx‘ referenced before assignment

    local variable xxx referenced before assignment 指的是 xxx 局部变量没有被声明 一般有如下两种情况 第一种是变量没有赋值 def test print a 这里a没有赋值 应该改成如下形式
  • 漂亮大气的企业文化宣传ppt模板

    和PPT打交道多年 从什么都不会的小白 到如今PPT制作小达人 关于有哪些好用的PPT模板资源 我还是很清楚的 学做ppt的时间成本确实是挺高的 因为这是一个需要长期磨练的技术活 故而 如若我们时间赶 任务重的话 可不必亲力亲为将自己磨练成
  • 如何使用Java操作TensorFlow

    简介 机器学习在全球范围内越来越受欢迎和使用 它已经彻底改变了某些应用程序的构建方式 并且可能会继续成为我们日常生活中一个巨大的 并且正在增加的 部分 没有什么包装且机器学习并不简单 它对许多人来说似乎非常复杂并常常令人生畏 像谷歌这样的公
  • Dubbo 与 Spring Cloud 完美结合

    概述 可能说起来Dubbo 很多人都不陌生 这毕竟是一款从2012年就开始开源的Java RPC框架 中间由于各种各样的原因停止更新4年半的时间 中间只发过一个小版本修了一个小bug 甚至大家都以为这个项目已经死掉了 竟然又在2017年9月