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

news2024/11/28 0:38:50

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-opens
        java.base/jdk.internal.misc=ALL-UNNAMED
        --add-opens
        java.base/java.nio=ALL-UNNAMED
        --add-opens
        java.base/java.lang=ALL-UNNAMED
	b. 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{
    @Override
    public 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;

    @Test
    public 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.coloradmin.cn/o/1023162.html

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

相关文章

vue基础知识十四:说说你对vue的mixin的理解,有什么应用场景?

一、mixin是什么 Mixin是面向对象程序设计语言中的类&#xff0c;提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类 Mixin类通常作为功能模块使用&#xff0c;在需要该功能时“混入”&#xff0c;有利于代码复用又避免了多继承的复杂 Vue中的mixin 先来看一…

【关于RHCE考试和准备看这一篇就够了】

一、文章大纲 认证机构 课程体系 面向人群 证书有效期 备考学习周期 考试内容 证书领取 证书样例 二、认证机构 RHCE全称为红帽认证工程师&#xff08;Red Hat Certified Engineer&#xff09;&#xff0c;其认证机构为红帽。红帽可以说是Linux发行版中的龙头老大&am…

Android 数据库封装(SQLite)

Android 数据库操作&#xff08;SQLite&#xff09; Android 数据库操作&#xff08;SQLite&#xff09;动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找&#xff08;列表&#xff09;查找&#xff08;单条&#xff09;条件查找&#xff08;列表&…

【去除若依首页】有些小项目不需要首页,去除方法

第一步 // // // // // // // // // // // // // // // // // // 修改登录页 Login.vue 中 大概144行 &#xff0c;注释掉原有跳转。替换为自己的跳转路径 // // // // // // // // // // // // // this.$router.push({ path: this.redirect || …

windows英伟达nvidia显卡驱动安装教程

文章目录 查看版本驱动下载驱动安装查看安装结果 查看版本 之前我的电脑预安装了nvidia的显卡驱动&#xff0c;通过nvidia-smi命令发现驱动版本是Driver Version&#xff1a;417.98&#xff0c;CUDA Version&#xff1a;10.0&#xff0c;目前的驱动和CUDA支持的已经是4年前的版…

ARM第四天

用C语言实现点灯

AI项目七:WEB端部署YOLOv5

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 最近接触网页大屏&#xff0c;所以就想把YOLOV5部署到WEB端&#xff0c;通过了解&#xff0c;知道了两个方法&#xff1a; 1、基于Flask部署YOLOv5目标检测模型。 2、基于Streamlit部署YOLOv5目标检测。 代码在…

Python灰帽编程——错误异常处理与面向对象

文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测&#xff08;捕获&#xff09;异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…

高并发分布式架构演进之路

淘宝 10 年&#xff0c;高并发分布式架构演进之路 楼仔 2022-04-08987阅读23分钟 大家好&#xff0c;我是楼仔&#xff01; 之前给自己定了一个学习计划&#xff0c;今年上半年需要完成“高并发”系列文章&#xff0c;这个是该系列的第一篇。 在写“高并发”系列文章之前&a…

23062QTday3

完成文本编辑器的保存工作 //保存文件 void Widget::on_savebtn_clicked() {QString newfileQFileDialog::getSaveFileName(this,"保存文件","./","All(*.*);;Images(*.png *.xpm *.jpg);;Text files(*.txt);;");if(newfile.isNull()){QMessage…

恒合仓库 - 用户管理、用户列表、为用户分配角色

文章目录 用户管理一、用户列表1.1 实体类1.1.1 分页实体类1.1.2 用户信息实体类 1.2 业务实现1.2.1 UserMapper1.2.2 Service层1.2.3 Controller层1.2.4 效果图 二、用户增删改查2.1 添加用户业务实现2.1.1 Mapper2.1.2 Service2.1.3 Controller2.1.4 效果图 2.2 删除用户业务…

十一、MySql的事务(上)

文章目录 一、引入&#xff08;一&#xff09;CURD不加控制&#xff0c;会有什么问题&#xff1f;&#xff08;二&#xff09;CURD满足什么属性&#xff0c;能解决上述问题&#xff1f; 二、什么是事务&#xff1f;三、事务的特性&#xff08;一&#xff09;原子性&#xff1a;…

经典算法-----约瑟夫问题(C语言)

目录 前言 故事背景 约瑟夫问题 环形链表解决 数组解决 前言 今天我们来玩一个有意思的题目&#xff0c;也就是约瑟夫问题&#xff0c;这个问题出自于欧洲中世纪的一个故事&#xff0c;下面我们就去通过编程的方式来解决这个有趣的问题&#xff0c;一起来看看吧&#xff01…

基于Java+SpringBoot+Vue+小程序实现前后端分离二手交易系统

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

Vmware通过VMware tools设置共享文件夹

步骤说明&#xff1a; 先安装VMware tools&#xff0c;再设置共享文件夹即可。 写在前面&#xff1a; 刚安装虚拟机时&#xff0c;窗口可能显得太小&#xff0c;这是窗口分辨率没有调整导致的。 点击设置->显示->分辨率调整即可 一、安装VMware tools 1.1 点击虚拟机…

机器人如何有效采摘苹果?

摘要&#xff1a;本文利用动捕数据构建拟人运动模型&#xff0c;对比观察两种苹果采摘模式&#xff0c;并对系统性能进行全面评估&#xff0c;为提高机器人采摘效率提供创新方法。 近期&#xff0c;一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…

nokov设置教程

1软件安装 设置 屏幕分辨力 缩放问题 软件设置 以管理员身份运行 高DPI缩放行为 系统 软件界面 1 设置路径 全部数据存放于该文件夹下 右下角文件按钮 右键 选择目录 设置完后程序上面显示路径 2 电脑设置ip地址 以太网属性 版本4 查看以太网状态 是否千兆网 网速 …

前序遍历、后序遍历-morris

前序遍历 前序遍历&#xff1a;中 -> 左子树 -> 右子树 非递归的遍历-stack public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();if (null root) {return res;}LinkedList<TreeNode> stack new…

基于 VSC 的 UPFC(统一潮流控制器)研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

EM算法和VAE的学习笔记

文章目录 摘要EM算法流程EM算法对GMM的参数估计EM算法的证明EM算法的另一种理解VAE参考文献 摘要 这是我学习EM算法&#xff08;Expectation-Maximization Algorithm&#xff09;和VAE&#xff08;Variational Auto-Encoder&#xff09;的学习笔记&#xff0c;首先总结了EM算法…