dubbo3.0使用

news2024/12/25 23:41:05

dubbo3.0使用

介绍

官方网址:https://dubbo.apache.org/

本文基于springCloud依赖的方式演示相关示例:https://github.com/alibaba/spring-cloud-alibaba/wiki/Dubbo-Spring-Cloud

dubbo示例项目:https://github.com/apache/dubbo-samples

springBoot相关示例:https://github.com/apache/dubbo-spring-boot-project

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

变更简述

应用级服务发现

dubbo3.0使用应用级服务发现,但是兼容2.X版本的接口级服务发现

升级参考:https://dubbo.apache.org/zh/overview/tasks/migration/service-discovery-samples/

举例:

如果一个服务有3个实例,接口级服务发现 存放到注册中心的数据条数可能是 实例数 * 接口数,每条数据包含应用名称,接口名称,ip,端口,协议等数据

应用级服务注册则基于实例数,一个服务又多少个实例,注册中心就有几条数据,保存的主要是每个实例的应用名、ip和端口数据

Triple 协议

协议说明

Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。相比于原有 Dubbo2 协议,Triple 有以下优势:

  1. 原生和 gRPC 协议互通。打通 gRPC 生态,降低从 gRPC 至 Dubbo 的迁移成本。
  2. 增强多语言生态。避免因 CPP/C#/RUST 等语言的 Dubbo SDK 能力不足导致业务难以选型适配的问题。
  3. 网关友好。网关无需参与序列化,方便用户从传统的 HTTP 转泛化 Dubbo 调用网关升级至开源或云厂商的 Ingress 方案。
  4. 完善的异步和流式支持。带来从底层协议到上层业务的性能提升,易于构建全链路异步以及严格保证消息顺序的流式服务。

因为http1.x 协议冗余较多,比如回车符换行符等,而且一个socket连接只能发起一个http请求,所以有了dubbo协议,数据紧凑,支持多路复用,但是dubbo协议没有http通用,triple协议底层基于HTTP2,所以更通用(比如跨语言、跨异构系统实现起来比较方便),而Http2向下兼容http,结构紧凑,支持多路复用,在dubbo3.0中是用Triple作为默认协议

Dubbo3.0跨语言调用

protobuf : 这个再说吧

官方文档 :https://dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/idl/

配置手册

配置说明 :https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/

dubbo支持通过api,注解,xml配置文件来声明服务和引用服务。

依赖关系说明

spring.cloud.alibaba版本对应关系参考

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

可以看到最近的几个版本中已经没有了dubbo版本的对应关系,说明:https://cloud.tencent.com/developer/article/2120216

如果你使用的是支持dubbo的版本,使用如下依赖,这个依赖对应的示例项目地址

https://gitee.com/archguide/spring-cloud-alibaba-dubbo-examples

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

如果是去除了dubbo的版本,或者你想要升级使用dubbo3.0版本,引入依赖如下,

dubbo版本发布: https://dubbo.apache.org/zh/release/java/

此时最新的是版本是3.1.1,引入依赖

		<dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

dubbo基础示例

这里只演示比较核心的代码

1、api项目

避免在客户端和服务端都重复添加相同接口声明代码,一般由服务端将接口定义和接口涉及到的数据对象都统一放到api项目中,但是这个不是必须,你也可以直接在客服端引入对应的接口和dto代码,甚至不需要包名一致,只要大致的数据结构相同即可。

一个纯净的项目,pom中不需要任何依赖,然后在消费者端和服务提供者端都引入api项目依赖,一个示例如下

2、服务提供者示例

依赖

可以在父项目中引入如下依赖进行版本管理

			<!-- Apache 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.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        

        <!-- dubbo示例的 api项目 依赖-->
        <dependency>
            <groupId>cn.sry1201</groupId>
            <artifactId>demo6-dubbo-api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>



        <!-- Dubbo Spring Cloud Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>

        <!-- spring cloud 依赖中有 -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

启动类

启动类添加@EnableDubbo注解

@SpringBootApplication
@Slf4j
@EnableDubbo
public class DubboProviderApplication {


    public static void main(String[] args) {

        SpringApplication.run(DubboProviderApplication.class, args);
        log.info("{} startup success", "DubboProviderApplication");

    }
}

服务注册

@DubboService
public class EchoServiceImpl implements EchoService {

    @Override
    public String echo(String a) {
        return "你好呀";
    }
}

配置文件

dubbo:
  application:
    name: doubbo-consumer
  registry:
    address: nacos://61.171.5.6:30848
    username: nacos
    password: nacos

3、服务消费者示例

依赖和启动类

同服务提供者

服务发现

@RestController
@RequestMapping("/echo")
public class EchoController {

    @DubboReference
    private EchoService echoService;

    @GetMapping("/test1")
    public String echo(){
        String str = echoService.echo("q");
        return str;
    }
}

配置文件

同服务提供者

4、成功截图

5、问题:

依赖冲途

1、在包含nacos-discovery-spring-boot-starter依赖的时候,没有nacos discovery相关配置时,dubbo指定的配置不生效,会默认以127.0.0.1:9848去获取数据,如果包含nacos discovery时,不太清楚具体情况,未测试

找不到服务,项目启动失败

2、服务提供者未启动,消费者单独启动时会报找不到服务,添加配置

java.lang.IllegalStateException: Failed to check the status of the service cn.sry1201.dubbo.service.EchoService.

dubbo:
  application:
    name: doubbo-consumer
    service-discovery:
      migration: FORCE_APPLICATION # APPLICATION_FIRST 多订阅模式(默认)FORCE_APPLICATION 应用级订阅  FORCE_INTERFACE(接口级)
  registry:
    address: nacos://61.171.5.6:30848
    username: nacos
    password: nacos
    check: false  #检测注册中心是否可用,true报错(默认),false忽略
  consumer:
    check: false #客户端检测服务是否可用,true报错(默认),false忽略

应用级注册

3、服务还是有接口级注册,有多少个接口类,注册多少个服务

官方说明:https://dubbo.apache.org/zh/overview/tasks/migration/service-discovery-samples/

https://dubbo.apache.org/zh/docs3-v2/java-sdk/upgrades-and-compatibility/service-discovery/service-discovery-rule/

服务端配置

dubbo:
  application:
    name: doubbo-provider
    register-mode: instance  # all (默认,双注册) instance(应用级注册) service (接口级注册)
  registry:
    address: nacos://61.171.5.6:30848
    username: nacos
    password: nacos

客户端配置

当前共存在三种状态,FORCE_INTERFACE(强制接口级),APPLICATION_FIRST(应用级优先)、FORCE_APPLICATION(强制应用级)。

FORCE_INTERFACE:只启用兼容模式下接口级服务发现的注册中心逻辑,调用流量 100% 走原有流程 APPLICATION_FIRST:开启接口级、应用级双订阅,运行时根据阈值和灰度流量比例动态决定调用流量走向 FORCE_APPLICATION:只启用新模式下应用级服务发现的注册中心逻辑,调用流量 100% 走应用级订阅的地址

配置如下

dubbo:
  application:
    name: doubbo-consumer
    service-discovery:
      migration: FORCE_APPLICATION # APPLICATION_FIRST 多订阅模式(默认)FORCE_APPLICATION 应用级订阅  FORCE_INTERFACE(接口级)

似乎还有动态配置,这个另说,如果不是需要迁移应该用不上

热部署插件报错

 Live reload start error java.net.BindException: Address already in use: JVM_Bind
spring.devtools.livereload.port: 35730 # 热部署插件端口号指定,多个项目都使用热部署,指定一下35729,(默认)

调用超时

org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2022-11-08 15:20:23.542, end time: 2022-11-08 15:20:24.561, client elapsed: 0 ms, server elapsed: 1019 ms, timeout: 1000 ms, request: Request [id=9, version=2.0.2, twoWay=true, event=false, broken=false, data=RpcInvocation [methodName=echo, parameterTypes=[class java.lang.String]]], channel: /192.168.153.1:14924 -> /192.168.153.1:20881
dubbo:
  application:
    name: doubbo-consumer
    service-discovery:
      migration: FORCE_APPLICATION # APPLICATION_FIRST 多订阅模式(默认)FORCE_APPLICATION 应用级订阅  FORCE_INTERFACE(接口级)
  registry:
    address: nacos://61.171.5.6:30848
    username: nacos
    password: nacos
    group: dubbo-group # 指定分组
    parameters: # 扩展参数
      "namespace": 748dcaf9-492c-47f9-a4a8-972cccb5f579 # 指定命名空间
    check: false  #检测注册中心是否可用,true报错(默认),false忽略
  consumer:
    check: false #客户端检测服务是否可用,true报错(默认),false忽略
    timeout: 3000 # 指定超时时间

nacos配置管理界面多出了无用的配置

删除的只剩下一条了

主要是 这个配置 use-as-metadata-center: false

dubbo:
  application:
    name: doubbo-provider
    register-mode: instance  # all (默认,双注册) instance(应用级注册) service (接口级注册)
    metadata-type: local # 元数据存放在provider 这边
    metadata-service-port: 20889
    metadata-service-protocol: dubbo
  registry:
    id: nacos-1 # 如果多个注册中心,@DubboService(registry="nacos-1") 指定服务发现的注册中心
    address: nacos://61.171.5.6:30848?registry-type=service # ?registry-type=service 表示仅仅进行应用级服务发现
    username: nacos
    password: nacos
    group: dubbo-group # 指定分组
    parameters: # 扩展参数
      namespace: 748dcaf9-492c-47f9-a4a8-972cccb5f579 # 指定命名空间
      register-consumer-url: true # 是否注册消费者
    use-as-metadata-center: false  # 作为元数据中心
    use-as-config-center: false  # 作为配置中心,会有服务信息上传到配置中心,似乎默认是true

应用级服务发现 metadata 传递方式,是以 Provider 视角而言的,Consumer 侧配置无效,可选值有:
* remote - Provider 把 metadata 放到远端注册中心,Consumer 从注册中心获取;
* local - Provider 把 metadata 放在本地,Consumer 从 Provider 处直接获取;

了解到dubbo需要调用服务还需要获取服务的元数据,这个元数据可以存在元数据中心,就nacos而言,使用nacos的配置中心作为元数据中心,如果配置了local(默认),那么consumer会从provider这边获取元数据,但是无语了,已经进行了相关配置,nacos上多余的数据也没了,但是服务调用不通了,报找不到服务。死活找不到原因。

对比前后, metadata-type设置成local和remote还是有区别的,至少nacos上的配置项数量不一样。这样的话建议单独配置元数据中心。具体可以去官网查看元数据中心描述:https://dubbo.apache.org/zh/docs/references/metadata/

6、配置项说明

客户端和服务端配置官网 :https://dubbo.apache.org/zh/docs3-v2/java-sdk/advanced-features-and-usage/performance/simplify-registry-data/

https://dubbo.apache.org/zh/docs/references/xml/

也可以直接进入配置类中查看注释

nacos 配置项

比如就nacos而言,你可能还需要配置group,namespace,以下是服务提供者配置,服务消费者应该大致相同

dubbo:
  application:
    name: doubbo-provider
    register-mode: instance  # all (默认,双注册) instance(应用级注册) service (接口级注册)
  registry:
    address: nacos://61.171.5.6:30848
    username: nacos
    password: nacos
    group: dubbo-group # 指定分组
    parameters: # 扩展参数
      "namespace": 748dcaf9-492c-47f9-a4a8-972cccb5f579 # 指定命名空间
#  config-center:
#    address: nacos://61.171.5.6:30848
#  metadata-report:
#    address: nacos://61.171.5.6:30848

triple协议使用

https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/protocol/triple/

https://dubbo.apache.org/zh/overview/tasks/migration/migration-triple/

依赖

由于 Triple 协议底层需要依赖 protobuf 协议进行传输,即使定义的服务接口不使用 protobuf 也需要在环境中引入 protobuf 的依赖。

        <!-- Triple 协议底层需要依赖 protobuf 协议进行传输 -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
        </dependency>


        <!-- triple -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-triple</artifactId>
        </dependency>

        <!--   基于triple,流式调用支持-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-common</artifactId>
        </dependency>

配置文件

一部分

  protocol:
    name: tri
    port: -1  # 表示随机端口

大致是在配置文件里指定一下协议,然后调用流程和dubbo协议一致,只是多了流式调用的支持,分为客户端流,服务端流,具体就是客服端发送数据或者服务端响应数据可以分多次发送,发送一段,处理一段,响应一段。可能适合数据量大的情况吧,然后就是基于triple协议实现的跨语言和跨平台能力。具体实现再说

其他

dubbo还有其他一些高级特性,https://dubbo.apache.org/zh/docs3-v2/java-sdk/advanced-features-and-usage/

关联信息

  • 关联的主题:
  • 上一篇:
  • 下一篇:
  • image: 20221108/1
  • 转载自:

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

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

相关文章

9 内中断

内中断 任何一个通用的CPU&#xff0c;比如8086 &#xff0c;都具备一种能力&#xff0c;可以在执行完当前正在执行的指令之后&#xff0c;检测到从CPU 外部发送过来的或内部产生的一种特殊信息&#xff0c;并且可以立即对所接收到的信息进行处理。这种特殊的信息&#xff0c;…

S7-200SMART高速脉冲输出的使用方法和示例

S7-200SMART高速脉冲输出的使用方法和示例 S7-200SMART PLC内部集成了高速脉冲发生器,不同的CPU型号,高速脉冲发生器的数量不同。 具体型号可参考下图: 注意:要输出高速脉冲的话,必须选择ST晶体管型号的PLC,SR继电器型的不支持。 S7-200SMART PLC能产生2种类型的高速脉冲…

【瑞吉外卖】公共字段填充

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;瑞吉外卖 ✨欢迎加入社区&#xff1a; &#x1f449;不会压弯的小飞侠 ✨人生格言&#xff1a;知足上…

激光雷达标定(坐标系转换)

文章目录1. 旋转矩阵2. 平移矩阵3. 坐标系的转换4. 坐标转换代码1. 旋转矩阵 由于激光雷达获取的点云数据的坐标是相对于激光雷达坐标系的&#xff0c;为了使车最终得到的点云数据坐标是在车坐标系下的&#xff0c;我们需要对点云中每一个点的坐标进行坐标转换。首先是需要对坐…

Docker笔记--创建容器、退出容器、查看容器、进入容器、停止容器、启动容器、删除容器、查看容器详细信息

目录 1--docker run创建容器 2--exit退出容器 3--docker ps查看容器 4--docker exec进入容器 5--docker stop停止容器 6--docker start启动容器 7--docker rm删除容器 8--docker inspect查看容器详细信息 1--docker run创建容器 sudo docker run -it --nametest redis…

Python 可迭代对象(Iterable)、迭代器(Iterator)与生成器(generator)之间的相互关系

1、迭代 通过重复执行的代码处理相似的数据集的过程&#xff0c;并且本次迭代的处理数据要依赖上一次的结果继续往下做&#xff0c;上一次产生的结果为下一次产生结果的初始状态&#xff0c;如果中途有任何停顿&#xff0c;都不能算是迭代。 # 非迭代例子 n 0 while n < …

SSM如何

目录 1、整合Mybatis 1.1.新建项目 1.2.添加pom依赖 1.3.application.yml 1.4.generatorConfig.xml 1.5.设置逆向生成 1.6.编写controller层 1.7.测试 2、整合 Mybatis-plus 2.1Mybatis-plus简介 2.2.创建项目 2.3.添加pom依赖 2.4.application.yml 2.5.MPGenerator 2.6.生成…

Stm32旧版库函数1——adxl335 模拟输出量 usart2

主函数&#xff1a; /******************************************************************************* // // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 19200 串口2 PA2(Tx) P…

equals方法:黑马版

目录 Object类的equals方法 Student类 测试类 第一步&#xff1a;使用比较 第二步&#xff1a;使用equals比较 第三步&#xff1a;在子类-Student类中重写equals方法 代码逐句分析 运行 Object类的equals方法 首先写一个类Student&#xff0c;属性有name和age&#xf…

UE5笔记【十二】蓝图函数BluePrint Function

上一篇讲了蓝图变量&#xff0c;这一篇说蓝图函数。BluePrint Function 函数&#xff0c;一般是为了将一段功能的代码提取出来&#xff0c;然后方便我们反复使用。重复的代码可以提取一个函数。类似的&#xff0c;相同的蓝图&#xff0c;我们也可以提取出一个蓝图函数来。 如…

青龙面板 香蕉

香蕉角本教程 介绍 香蕉视频 app —【多用户版】 一个账户每天稳定1元&#xff0c;可以自己提现&#xff0c;也可以兑换会员&#xff0c;脚本不停会员也不停&#xff01;可注册多个账户&#xff01;&#xff08;多账户福利自行看文章底部&#xff01;&#xff09; 拉取文件 …

【微服务】springboot 整合javassist详解

一、前言 Javassist 是一个开源&#xff0c;用于分析、编辑和创建Java字节码的类库&#xff0c;由东京工业大学数学和计算机科学系的 Shigeru Chiba &#xff08;千叶滋&#xff09;所创建。目前已加入了开放源代码JBoss 应用服务器项目&#xff0c;通过使用Javassist对字节码操…

linux redhat 8 创建逻辑卷

LVM与直接使用物理存储相比,有以下优点: 1. 灵活的容量. 当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷. 2. 方便的设备命名 逻辑卷可以按你觉得方便的方式来起任何名称. 3.磁盘条块化. 你可以生成一个逻辑盘,它的数据可以被…

记录一次Mac本地启动nacos遇到的问题

nacos 官网&#xff1a;https://nacos.io/zh-cn/docs/quick-start.html 我这里下载的是2.0.3稳定的版本 本地启动&#xff1a;sh startup.sh -m standalone 问题1&#xff1a;Caused by: java.lang.IllegalStateException: No DataSource set 这里是数据源连接有问题&#xff…

Linux网络原理及编程(6)——第十六节 TCP可靠性保证的原理

目录 1、确认应答机制 2、超时重传机制 3、滑动窗口 4、流量控制 5、拥塞控制 6、延迟应答 &#xff08;各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&am…

Apache Flink 水印的工作机制详解与源码阅读

一、时间长河谁能解 在人类生存的地球上&#xff0c;存在着一种很神秘的东西&#xff1a;时间&#xff0c;它看不见摸不着&#xff0c;但速度恒定&#xff0c;单调递增且永无止境的往前推进&#xff0c;人类的历史被淹没在茫茫的时间长河中。同时在地球附近&#xff0c;一个星…

【自动化测试】如何平衡手工和自动化测试

作为一名测试人员&#xff0c;如何平衡手工和自动化测试&#xff0c;是一道绕不过去的课题。不可否认&#xff0c;自动化测试具有提高效率&#xff0c;加快回归速度并因此有助于及时交付项目的好处。但是&#xff0c;在考虑自动化之前&#xff0c;我们应该评估一些要点&#xf…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生就业管理系统243xa

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

vscode 关闭/忽略/ignore 单个/指定 git 仓库/repository 提示

文章目录1. 问题2. 解决方法2.1 只追踪 打开文件 所在的仓库2.2 忽略指定的仓库3. 参考1. 问题 vscode 当打开的项目中有多个 git 仓库时&#xff0c;默认会显示所有仓库的 status。 有些已经不再使用的仓库可能有多处更改&#xff0c;但我们并不想去处理它。 如果直接关闭 vs…

gcc 4.8.5 的string问题

gcc 4.8.5及一下版本 的string 因为内部内存管理采用了COW的方式&#xff0c;导致了string在多线程的状态下容易崩溃。崩的很没有规律&#xff0c;表现就是string在赋值的时候就莫名其妙的崩了&#xff0c;查看堆栈&#xff0c;你也看不出啥。崩溃的很随机。 为了避免崩溃&…