Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

Dubbo3程序的初步开发

Dubbo3升级的核心内容

  • 易⽤性

    开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持(GO PYTHON RUST)

  • 超⼤规模微服务实践

    • ⾼性能通信(Triple GRPC)
    • ⾼可扩展性 (SPI 多种序列化⽅式 多种协议)
    • 丰富的服务治理能⼒
    • 超⼤规模集群实例⽔平扩展
  • 云原生友好

    • 容器调度平台(Kubernetes)

      将服务的组织与注册交给底层容器平台,如 Kubernetes,这是更云原 ⽣的⽅式。

    • Service Mesh

      原有Mesh结构中通过Sidecar完成负载均衡、路由等操作,但是存在链路的性能损耗⼤,现有系统迁移繁琐等问题。 Dubbo3 引⼊Proxyless Mesh,直接和I控制⾯交互[istio]通信。集成 ServiceMesh更为⽅便,效率更高。

Dubbo3前言

代码结构及其术语解释

  1. provider 功能提供者
  2. consumer 功能调⽤者【功能消费者】
  3. commons-api 通⽤内容 entity service接口
  4. registry 注册中⼼
    1. 可选
    2. ⽤于管理provider集群

模块结构

开发步骤

  1. 开发commons-api 通⽤内容
  2. 开发provider 功能提供者
  3. 开发 consumer 功能调⽤者【功能消费者】
  4. 如需要注册中心,开发registry 注册中⼼

本专题所使用软件版本

JDK使用了两种JDK:JDK8和JDK17

Maven:3.8.7

Dubbo:3.2.0

JDK与Dubbo版本的关系

1. JDK8 与 Dubbo3.1.x以前的版本匹配,在使⽤Zookeeper注册作为注册中⼼时,消费者会出现节点已经存在的异常https://github.com/apache/dubbo/issues/11077
2. JDK17 与 Dubbo3.1.x之前的版本搭配使⽤会出现如下问题a. JDK9之后的深反射问题,需要通过JVM参数配置解决-Dio.netty.tryReflectionSetAccessible=true--add-opensjava.base/jdk.internal.misc=ALL-UNNAMED--add-opensjava.base/java.nio=ALL-UNNAMED--add-opensjava.base/java.lang=ALL-UNNAMEDb. Dubbo3.2.0.beat4以前的版本使⽤的是Spring5.2.x 不能⽀持 JDK17会产⽣如下异常Unsupported class file major version 61 【major 61 对应 17 】版本需要升级到Dubbo3.2.0.beat5以上版本

基于XML的Dubbo3程序开发

环境搭建

项目结构

父项目pom.xml的依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.9</version>
</dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.2.0</version>
</dependency>

首先开发公共模块-api模块

实体entity
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {private String name;private String password;
}
接口service
public interface UserService {public boolean login(String name,String password);
}

类文件目录

开发provider模块

在provider模块添加依赖
<dependencies><dependency><groupId>com.sjdwz</groupId><artifactId>dubbo-01-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>
实现接口
public class UserServiceImpl implements UserService{@Overridepublic boolean login(String name, String password) {System.out.println("UserServiceImpl.login name "+name + " password "+password);return false;}
}
创建Spring配置文件,配置Dubbo相关内容使得UserServiceImpl可以跨虚拟机来调用

配置文件结构

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 为dubbo起个名字,要做到唯一,可以被注册中心所管理 --><dubbo:application name="dubbo-02-provider"/><!-- 设置rpc相关的协议 使得可以网络通信 --><dubbo:protocol name="dubbo" port="20880"/><!-- 创建对象 --><bean id="userService" class="com.sjdwz.service.UserServiceImpl"/><!-- 发布dubbo服务 --><dubbo:service interface="com.sjdwz.service.UserService" ref="userService"/></beans>
Spring工厂启动类

Spring工厂启动类

运行起来发现,会导出一个url

export url

dubbo://192.168.96.1:20880/com.sjdwz.service.UserService

开发consumer模块

引入api模块依赖
<dependencies><dependency><groupId>com.sjdwz</groupId><artifactId>dubbo-01-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>
创建Spring配置文件

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 配置dubbo服务名称 --><dubbo:application name="dubbo-03-consuemer" /><!-- 获取远端服务url就是刚才导出的url--><dubbo:reference interface="com.sjdwz.service.UserService" id="userService"url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/></beans>
创建启动类

启动类

启动起来就可以看到消费端和生产端相应的输出。

注意

消费端会有一个异常

16:40:41.156 [main] ERROR org.apache.dubbo.qos.server.Server -  [DUBBO] qos-server can not bind localhost:22222, dubbo version: 3.2.0, current host: 192.168.96.1, error code: 7-4. This may be caused by , go to https://dubbo.apache.org/faq/7/4 to find instructions. 问题产生的原因:
Qos=Quality of Service,qos是Dubbo的在线运维命令,可以对服务进⾏动态的配置、控制及查询,Dubboo2.5.8新版本重构了telnet(telnet是从Dubbo2.0.5开始⽀持的)模块,提供了新的telnet命令支持,新版本的telnet端⼝与dubbo协议的端⼝是不同的端⼝,默认为22222。正是因为这个问题:如果在⼀台服务器里面,启动provider是22222端⼝,⽽consumer启动时就会报错了。

xml解决方案

<dubbo:parameter key="qos.enable" value="true"/> <!--
是否开启在线运维命令 -->
<dubbo:parameter key="qos.accept.foreign.ip" value="false"/> <!--
不允许其他机器的访问 -->
<dubbo:parameter key="qos.port" value="33333"/> <!--
修改port-->

boot解决方案

dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false

细节补充

  1. 协议、端口
provider基于dubbo协议 默认的端⼝是20880
<dubbo:protocol name="dubbo" port="20880"/>
但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置
端⼝
<dubbo:protocol name="dubbo" port="-1"/>
  1. 应用程序运行过程浅析

    • 为什么provider提供了UserService的实现,而在另一个JVM中的consumer中可以调用?Consumer中调用的到底是什么?

      实际上调用的是远端UserServiceImpl的代理对象 Proxy

    • 代理的核心工作是什么?

      被consumer实际调用,通过代理对consumer屏蔽网络通信的过程(通信方式、协议、序列化),数据传递。

基于SpringBoot的方式使用Dubbo

SpringBoot应用Dubbo开发应用的核心思路分析

深度封装,把公⽤的配置放置到application.yml中,把个性的配置应⽤注解进⾏设置。

provider的处理

provider的处理

consumer的处理

consumer的处理

编码开发

provider模块

创建新的module

provider模块

再引入api模块和dubbo-starter

<dependency><groupId>com.sjdwz</groupId><artifactId>dubbo-01-api</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.0</version>
</dependency>

创建applicaion.yml;将公共的配置放到这里面:

applicaion.yml

个性化的配置使用注解来完成;

DubboService注解

启动类上加**@EnableDubbo**注解:

启动类

启动日志

consumer模块

consumer模块

再引入api模块和dubbo-starter

<dependency><groupId>com.sjdwz</groupId><artifactId>dubbo-01-api</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.0</version>
</dependency>

创建applicaion.yml;将公共的配置放到这里面:

applicaion.yml

在启动类中加上注解

启动类

在测试类中进行测试:

@SpringBootTest
class Dubbo05BootConsumerApplicationTests {//url是刚才输出的url@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.service.UserService")private UserService userService;@Testpublic void test1() {boolean ret = userService.login("sjdwz", "123456");System.out.println("ret = " + ret);}
}

输出

@EnableDubbo注解的作用

  1. @EnableDubbo ⽤于扫描@DubboService,并把对应的对象实例化、发布成RPC服务。扫描的路径:应⽤这个注解的类(启动类)所在的包及其子包。
  2. 如果@DubboService注解修饰的类没有放到@EnableDubbo注解修饰类当前包及其⼦包,还希望能够扫描到它该如何处理?
    可以通过@DubboComponentScan(basePackages ={“org.sjdwz.service”}),显示的指定扫描的路径
  3. yml进⾏配置扫描@DubboService 并把对应的对象实例化,发布成RPC服务。
    dubbo.scan.base-packages 等同于 @EnableDubbo

@DubboService注解的作用

  1. 应⽤@DubboService注解修饰类型,SpringBoot会创建这个类型的对象,并发布成Dubbo服务。
  2. @DubboService 等同于 @Component(@Service) @Bean注解的创建对象的作⽤。
    通过源码SingletonObjects可以验证
  3. @DubboService
    a. 创建对象 等同于 @Component(@Service) @Bean
    b. 发布成RPC服务
  4. 后续开发过程中如果考虑兼容性,建议实现类不仅仅要加⼊@DubboService注解,同时也要加⼊@Service注解

@DubboReference注解的作用

  1. 在Consumer端,通过@DubboReference,注⼊远端服务的代理对象。
  2. @DubboReference类似于原始Spring开发中@Autowired注解的作⽤。

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

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

相关文章

指针笔试题讲解(让指针变得简单易懂)

数组名的理解 : 数组名就是首元素地址 但是有两个例外&#xff1a; 1. sizeof&#xff08;数组名&#xff09;这里的数组名表示整个数组的大小&#xff0c;sizeof&#xff08;数组名&#xff09;计算的是整个数组的大小&#xff0c;单位是字节 2. &数组名 这里的数组…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

安防监控系统/视频云存储/监控平台EasyCVR服务器解释器出现变更该如何修改?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

python excel复制数据保留单元格格式(.xls.xlsx)

最近帮朋友开发一个数据excel根据条件动态过率的功能.读取生成用pandas很方便,但是这里有一点比较麻烦的是得保留原来的单元格格式.这点操作起来就要麻烦一点了.下面总结了.xlsx和.xls处理 1.xlsx 文件处理 xlsx文件处理可以使用openpyxl库进行处理,比较简单,流程如下 1.获取…

[hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用

参考: Apache hive 3.1.2从单机到高可用部署 HiveServer2高可用 Metastore高可用 hive on spark hiveserver2 web UI 高可用集群启动脚本_薛定谔的猫不吃猫粮的博客-CSDN博客 没用里头的hive on spark,测试后发现版本冲突 一、Hive 集群规划(蓝色部分) ck1ck2ck3Secondary…

【虚幻引擎】UE5 VLC接入网络监控、视频直播、网络直播支持RTSP、RTMP

一、如何更新自己的插件匹配自己想要的UE版本 我们在网上下载的插件一般是UE4版本的插件&#xff0c;这个时候就需要我们自己去修改编译&#xff0c;接下来教大家修改插件来适配自己的引擎。 如果不想自己编译代码&#xff0c;可以直接找我拿编译好的UE5.0、UE5.1、UE5.2的插件…

学习路之PHP--laravel postman 提交表单出现419错误

问题图片 解决&#xff1a; 白名单 有时候你可能希望设置一组不需要 CSRF 保护的 URL 。例如&#xff0c;如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统&#xff0c;你会需要从 CSRF 的保护中排除 Stripe webhook 处理程序路由&#xff0c;因为 Stripe 不知道要发…

swift 天气

定义不同模式主题 自定义颜色 输入框 委托和协议 扩展 协议 http 请求 调用api 闭包

记录crack某IDE插件过程

声明&#xff1a;本文仅记录学习过程&#xff0c;已对关键位置脱敏处理&#xff0c;未提供任何工具&#xff0c;请支持正版。 反编译jar包 使用cfr进行对插件核心jar包MyBxxxxxx-obfuss.jar进行反编译&#xff0c;在本地生成a.txt。 java -jar cfr-0.152.jar MyBxxxx-obfuss.…

用flask框架flask-sock和websocket创建一个自己的聊天界面

WebSocket 协议在10年前就已经标准化了(在2011年&#xff0c;你能相信吗?)所以我相信你不需要介绍。但是如果你不熟悉它&#xff0c;WebSocket 是 HTTP 协议的一个扩展&#xff0c;它在客户端和服务器之间提供了一个永久的、双向的通信通道&#xff0c;在这里双方可以实时地发…

Hugging Face使用Stable diffusion Diffusers Transformers Accelerate Pipelines VAE

Diffusers A library that offers an implementation of various diffusion models, including text-to-image models. 提供不同扩散模型的实现的库&#xff0c;代码上最简洁&#xff0c;国内的问题是 huggingface 需要翻墙。 Transformers A Hugging Face library that pr…

怎么将几张图片做成pdf合在一起

怎么将几张图片做成pdf合在一起&#xff1f;在我们平时的工作中&#xff0c;图片和pdf都是非常重要的电脑文件&#xff0c;使用也非常频繁&#xff0c;图片能够更为直观的展示内容&#xff0c;而pdf则更加的正规&#xff0c;很多重要文件大多会做成pdf格式的。在职场人的日常工…

C# OpenCvSharp 图片模糊检测(拉普拉斯算子)

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyl…

java CAS详解(深入源码剖析)

CAS是什么 CAS是compare and swap的缩写&#xff0c;即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作&#xff0c;而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住&#xff0c;等之前获得锁的线程释放锁之后&am…

React 全栈体系(九)

第五章 React 路由 一、相关理解 1. SPA 的理解 单页 Web 应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过 ajax 请求获取, 并在前端…

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选 适用性较广的基础多选&#xff0c;用 Tag 展示已选项 <template><el-select v-model"value1" multiple placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.la…

基于SpringBoot+Vue的宠物领养饲养交流管理平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

vue3+TS前端JS实现 搜索关键词变红

起初在网上搜索获得的处理方式大都是类似这种&#xff1a; 但是实际使用中发现&#xff0c;对于汉字和数字是没有问题的&#xff0c;但是如果有字母就会出现问题。 1.只有汉字和数字的时候&#xff1a;匹配正常。 2.当有字母的时候&#xff1a;异常替换。 原因&#xff1a;第二…

TuyaLink 快速入门教程

通过本入门教程&#xff0c;大家能了解到如何在涂鸦 IoT 开发平台上使用 TuyaLink 完成智能设备接入。并通过 Java 程序&#xff0c;在 IntelliJ IDEA 中使用 TuyaLink 的 GitHub Demo 工程&#xff0c;对一个电工开关设备&#xff0c;实现基本的数据上报下发功能。 准备工作 …

测试与FastAPI应用数据之间的差异

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 当使用两个不同的异步会话来测试FastAPI应用程序与数据库的连接时&#xff0c;可能会出现以下错误&#xff1a; 在测试中&#xff0c;在数据库中创建了一个对象&#x…