Dubbo Spring Cloud

2023-11-05

1、概述

官方文档:https://github.com/apache/dubbo-spring-boot-project/blob/master/README_CN.md

dubbo官方网站:http://dubbo.apache.org/

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

功能组件 Spring Cloud Dubbo Spring Cloud
分布式配置(Distributed configuration) Git、Zookeeper、Consul、JDBC Spring Cloud 分布式配置 + Dubbo 配置中心
服务注册与发现(Service registration and discovery) Eureka、Zookeeper、Consul Spring Cloud 原生注册中心 + Dubbo 原生注册中心
负载均衡(Load balancing) Ribbon(随机、轮询等算法) Dubbo 内建实现(随机、轮询等算法 + 权重等特性)
服务熔断(Circuit Breakers) Spring Cloud Hystrix Spring Cloud Hystrix + Alibaba Sentinel 等
服务调用(Service-to-service calls) Open Feign、RestTemplate Spring Cloud 服务调用 + Dubbo @Reference
链路跟踪(Tracing) Spring Cloud Sleuth + Zipkin Zipkin、opentracing 等

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

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

1.1 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给了我们这种选择的实现方式。

2、示例

2.1 创建父工程

2.1.1 引入依赖

您可以为您的工程引入最新 dubbo-spring-boot-starter 的发布,增加以下依赖到工程的 pom.xml 文件中

<properties>
    <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
    <dubbo.version>2.7.8</dubbo.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>

        <!-- Apache Dubbo  -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-bom</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Dubbo Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.8</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
    </dependency>
</dependencies>

2.2 创建子工程 dubbo-api

package com.ali.dubbo.api.service;

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

2.3 创建子工程 dubbo-provider ,Dubbo服务提供方

2.3.1 实现 HelloService 接口

package com.ali.dubbo.provider.service;

import com.ali.dubbo.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboService;

/**
 * @program: dubbo-spring-cloud
 * @description:
 * @author: geoffrey
 * @create: 2021-03-08 19:08
 */
@DubboService
public class HelloServiceImpl implements HelloService {

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

2.3.2 编写 Spring Boot 引导程序

package com.ali.dubbo.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class DubboProviderApplication {

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

}

2.3.3 配置 application.yml

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

注意:在暴露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 服务器主机和端口。

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

2.4.1 通过 @DubboReference 注入 HelloService 

package com.ali.dubbo.consumer.controller;

import com.ali.dubbo.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: dubbo-spring-cloud
 * @description:
 * @author: geoffrey
 * @create: 2021-03-08 20:32
 */
@RestController
public class HelloController {
    @DubboReference
    private HelloService helloService;

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

2.4.2 编写 Spring Boot 引导程序

package com.ali.dubbo.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class DubboConsumerApplication {

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

}

2.4.3 配置 application.yml 

server:
  port: 8081
spring:
  application:
    name: dubbo-spring-cloud-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
  main:
    allow-bean-definition-overriding: true #在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
dubbo:
  scan:
    base-packages: com.ali.dubbo.provider.service #指定 Dubbo 服务实现类的扫描基准包
  protocol: #Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
    name: dubbo #Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 Dubbo Spring Cloud 加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name。
    port: -1
  registry: #Dubbo 服务注册中心配置
    address: nacos://${spring.cloud.nacos.discovery.server-addr}
  cloud:
    subscribed-services: dubbo-spring-cloud-provider #表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。
  • dubbo.cloud.subscribed-services:表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。

3、测试

3.1 启动nacos

访问地址:http://192.168.0.110:8848/nacos/index.html

3.2 启动provider和consumer

访问地址:http://localhost:8081/hello

nacos服务列表

4、示例代码地址

https://gitee.com/xixingzhe2/learn/tree/master/dubbo

5、管理控制台安装

5.1 下载

>git clone https://github.com/apache/dubbo-admin.git

5.2 后端

5.2.1 配置

在 dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址

admin.registry.address=nacos://127.0.0.1:8848
admin.config-center=nacos://127.0.0.1:8848
admin.metadata-report.address=nacos://127.0.0.1:8848

5.2.2 构建

>cd dubbo-admin
>mvn clean package -Dmaven.test.skip=true

5.2.3 启动

运行dubbo admin server dubbo admin server是一个标准的spring boot项目, 可以在任何java IDE中运行它

5.3 前端

5.3.1 设置 npm 代理镜像

npm install  --registry=https://registry.npm.taobao.org

5.3.2 运行

运行dubbo admin ui dubbo admin ui由npm管理和构建,在开发环境中,可以单独运行:

>npm run install
>npm run dev

5.4 访问地址

访问地址:http://localhost:8082/

用户名、密码在后端配置文件中

参考:

https://www.cnblogs.com/babycomeon/p/11546737.html

https://github.com/apache/dubbo-spring-boot-project/blob/master/README_CN.md

https://dubbo.apache.org/zh/docs/v2.7/admin/install/admin-console/

https://github.com/apache/dubbo-admin/blob/develop/README_ZH.md

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

Dubbo Spring Cloud 的相关文章

随机推荐

  • 性能测试连载 (9)-压测实战分析性能拐点

    咨询微信 uhz2008 概述 本文对百度进行一次实战压测 验证一下理论知识 分析一下性能拐点 操作 第一次实验 200并发 并发200 不限迭代次数 同时在请求下面加RPS定时器 目的是在200线程下 将RPS逐步增加到1000 S 并持
  • Linux磁盘挂载

    概念 挂载 所谓挂载就是利用一个目录当成进入点 将磁盘分区的数据放在该目录下 也就是说 进入该目录就可以读取该分区的意思 Linux系统最重要的是根目录 因此根目录一定需要挂载到某个分区 至于其他的目录则根据需要挂载到不同的分区 假设硬盘分
  • 推荐一款我最近爱上的网页版文库(编辑器)——语雀yuque.com

    推荐一款由于工作接触然后热爱上的文库 语雀 语雀 https www yuque com 一开始它是阿里内部的文档库 后来随着它的功能升级 升级 升级 我恨不得把自己以前散落在各地的笔记 各种文件都搬上去 甚至最近已经弃用axureRP和s
  • 微信二次分享链接,出现config:invalid signature错误的解决方法

    当开发微信时需要做特定的页面做分享时 根据官方提供的jssdk php文件创建的签名数据包调试时 大家碰到的最多的错误而且解决最麻烦的大概就是signature错误了 分享时提示错误 errMsg config invalid signat
  • 单链表的各种操作,对于初学者来说,更容易理解

    include
  • Oracle11g 数据库提示ORA-28002: the password will expire within

    Oracle11g 数据库提示ORA 28002 the password will expire within 7 days 是说密码过期 oracle11g中默认在default概要文件中设置了 PASSWORD LIFE TIME 1
  • 批量修改mathtype中的公式字体、大小

    目录 一 保存格式文件 二 批量修改 一 保存格式文件 随便双击打开一个公式 点击菜单栏大小 定义 然后根据自己的需求修改参数 修改完成后点击确定 点击菜单栏预设 公式预设 保存到文件 选择一个保存的位置并命名 二 批量修改 下面就对全文公
  • 怎么导入别人的项目运行部署搭建Java项目springboot代码eclipse idea的心得实操

    调过无数代码 就发现没有运行不了的代码 这些代码也是我实践经验的来源 从最开始的servlet 到现在的springcloud 每一种类型的项目都有其特定的导入部署方式 如果是idea或者eclipse 按如下操作 按项目类型分两种情况部署
  • 内网穿透的应用-如何搭建WordPress博客网站,并且发布至公网上?

    文章目录 如何搭建WordPress博客网站 并且发布至公网上 概述 前置准备 1 安装数据库管理工具 1 1 安装图形图数据库管理工具 SQL Front 2 创建一个新数据库 2 1 创建数据库 2 2 为数据库创建一个用户 3 安装P
  • 如何优雅的使用fbx sdk

    include 头文件 设置lib目录 添加libfbxsdk lib 复制粘贴dll文件 运行平台一定要 大写加粗 一定要 设置为x64 添加宏FBXSDK SHARED 否则会出各种莫名其妙的问题
  • 【java基础】HashMap源码解析

    文章目录 基础说明 构造器 put方法 无扩容 无冲突 put方法 无冲突 有扩容 put方法 有冲突 无树化 put方法 有冲突 树化 remove方法 树退化 常见方法 总结 基础说明 HashMap 是一个散列表 它存储的内容是键值对
  • Go语言学习15-基本流程控制

    基本流程控制 流程控制对比 Go 和 C 基本流程控制 1 代码块和作用域 2 if 语句 3 switch语句 3 1 表达式switch语句 3 2 类型switch语句 4 for 语句 4 1 for 子句 4 2 range 子句
  • 什么是三极管的倒置状态及其作用!

    1 什么是三极管的倒置状态 集电结正偏 发射结反偏 为倒置状态 集电结正偏 发射结正偏 为饱和状态 集电结反偏 发射结反偏 为倒截止态 集电结反偏 发射结正偏 为放大状态 2 对三极管倒置状态的分析 实际上 当NPN型三极管的三个电极电位关
  • BUUCTF-Reverse:SimpleRev(算法分析题)

    题目地址 https buuoj cn challenges SimpleRev 查壳 得知消息 ELF 64 直接拖进ida64分析 int cdecl noreturn main int argc const char argv con
  • h5和APP实现交互(安卓-ios)

    h5调用APP 的方法 taskCallback是和APP端协议的函数名 安卓 window PlatformCurrency taskCallback 测试数据 ios window webkit messageHandlers task
  • 使用ffmpeg合并多个视频文件

    由于腾讯视频将一个视频分割成多个20M左右的小文件 所以必须合并起来成为一个完整视频文件 用什么工具来合并这些文件呢 想到了已经安装好的ffmpeg 开源免费 又是现成的 两种方法 方法1 直接写文件名 使用 来分割 ffmpeg i co
  • Java基础系列:NIO编程

    俗世游子 专注技术研究的程序猿 说在前面的话 聊完了Socket编程 我们来聊一聊关于NIO方面的话题 当然在这里只会介绍用的比较广泛的类 方法 其他用的不多的 就不多介绍了 用到的时候查API就好了 本节我们聊个大概内容 明白该如何使用
  • 解决qt里面添加的信号与槽不起作用的办法

    今天 在qt界面上新加了个checkbox 再加上信号与槽 发现竟然没响应 以前遇到过这个问题 没记录下来 其实很简单 把断点放在起作用的slot里面 发现它的前一步是类名 qt static metacall 而这个断点在Moc 类名 c
  • es6 嵌套数组循环_[js]从 ES3 到 ES6 教你如何数组去重

    声明 以下方法仅对数组值全部属于 primitive data type 的情况有效 ES6 方法一 Set数据结构 Array from静态方法 ES6中新增了Set数据结构 类似于数组 但是它的成员都是唯一的 其构造函数可以接受一个数组
  • Dubbo Spring Cloud

    1 概述 官方文档 https github com apache dubbo spring boot project blob master README CN md dubbo官方网站 http dubbo apache org Dub