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前言
代码结构及其术语解释
- provider 功能提供者
- consumer 功能调⽤者【功能消费者】
- commons-api 通⽤内容 entity service接口
- registry 注册中⼼
- 可选
- ⽤于管理provider集群

开发步骤
- 开发commons-api 通⽤内容
- 开发provider 功能提供者
- 开发 consumer 功能调⽤者【功能消费者】
- 如需要注册中心,开发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工厂启动类

运行起来发现,会导出一个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
细节补充
- 协议、端口
provider基于dubbo协议 默认的端⼝是20880
<dubbo:protocol name="dubbo" port="20880"/>
但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置
端⼝
<dubbo:protocol name="dubbo" port="-1"/>
应用程序运行过程浅析
为什么provider提供了UserService的实现,而在另一个JVM中的consumer中可以调用?Consumer中调用的到底是什么?
实际上调用的是远端UserServiceImpl的代理对象 Proxy
代理的核心工作是什么?
被consumer实际调用,通过代理对consumer屏蔽网络通信的过程(通信方式、协议、序列化),数据传递。
基于SpringBoot的方式使用Dubbo
SpringBoot应用Dubbo开发应用的核心思路分析
深度封装,把公⽤的配置放置到application.yml中,把个性的配置应⽤注解进⾏设置。
provider的处理

consumer的处理

编码开发
provider模块
创建新的module

再引入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;将公共的配置放到这里面:

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

启动类上加@EnableDubbo注解:


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;将公共的配置放到这里面:

在启动类中加上注解

在测试类中进行测试:
@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注解的作用
- @EnableDubbo ⽤于扫描@DubboService,并把对应的对象实例化、发布成RPC服务。扫描的路径:应⽤这个注解的类(启动类)所在的包及其子包。
- 如果@DubboService注解修饰的类没有放到@EnableDubbo注解修饰类当前包及其⼦包,还希望能够扫描到它该如何处理?
可以通过@DubboComponentScan(basePackages ={"org.sjdwz.service"}),显示的指定扫描的路径 - yml进⾏配置扫描@DubboService 并把对应的对象实例化,发布成RPC服务。
dubbo.scan.base-packages 等同于 @EnableDubbo
@DubboService注解的作用
- 应⽤@DubboService注解修饰类型,SpringBoot会创建这个类型的对象,并发布成Dubbo服务。
- @DubboService 等同于 @Component(@Service) @Bean注解的创建对象的作⽤。
通过源码SingletonObjects可以验证 - @DubboService
a. 创建对象 等同于 @Component(@Service) @Bean
b. 发布成RPC服务 - 后续开发过程中如果考虑兼容性,建议实现类不仅仅要加⼊@DubboService注解,同时也要加⼊@Service注解
@DubboReference注解的作用
- 在Consumer端,通过@DubboReference,注⼊远端服务的代理对象。
- @DubboReference类似于原始Spring开发中@Autowired注解的作⽤。
Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发的更多相关文章
- Springboot整合Dubbo和Zookeeper
Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单.截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这 ...
- 【转】SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)
http://blog.csdn.net/a67474506/article/details/61640548 Dubbo是什么东西我这里就不详细介绍了,自己可以去谷歌 SpringBoot整合Dub ...
- dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级
1. springboot整合dubbo 在provider端,添加maven引入,修改pom.xml文件 引入springboot,版本:2.3.2.RELEASE,dubbo(org.apache ...
- springboot整合dubbo\zookeeper做注册中心
springboot整合dubbo发布服务,zookeeper做注册中心.前期的安装zookeeper以及启动zookeeper集群就不说了. dubbo-admin-2.5.4.war:dubbo服 ...
- SpringBoot整合dubbo(yml格式配置)
yml文件 如果只作为服务的消费者不用暴露端口号,扫描的包名根据自己service改 dubbo: application: name: springboot-dubbo-demo #应用名 regi ...
- SpringBoot 整合 Dubbo 进行分布式开发
自从Dubbo支持SpringBoot后,Dubbo与Spring的整合变得更加的简单了,下面就是完整的步骤: 1. 引入依赖 <dependency> <groupId>co ...
- springboot整合dubbo的简单案例
使用框架: jdk 1.8 springboot-2.1.3 dubbo-2.6 spring-data-jpa-2.1.5 一.开发dubbo服务接口: 按照Dubbo官方开发建议,创建一个接口项目 ...
- spring-boot整合Dubbo分布式架构案例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 3.2.5 2.项目文件目录 3.Maven Plugin管理 总项目 pom.xml配置代码: &l ...
- springboot整合dubbo+zookeeper最新详细
引入 最近和小伙伴做一个比赛,处于开发阶段,因为涉及的服务比较多,且服务需要分开部署在不同的服务器上,讨论之后,打算采用分布式来做,之前学习springboot的时候,部分章节涉及到了springbo ...
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔细想一 ...
随机推荐
- 《数据结构》之栈和堆结构及JVM简析
导言: 在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 一.程序在内存中的 ...
- 使用 coding.net 发布你的个人博客
微信文章不允许外链,本文章的静态示例站点,可在文章左下角 "阅读原文" 进行预览. 很多人喜欢在 github pages / gitee pages 发布自己的个人博客,前者由于 ...
- Vue——表单控制、购物车案例、v-model进阶、与后端交互三种方式、箭头函数
表单控制 // 1 checkbox 单选 多选 // 2 radio 单选 <body> <div id="app"> <h1>checkbo ...
- 02. vmware搭建centos虚拟机并使用静态ip,局域网内可互通
一.虚拟机镜像地址 我这里有镜像 二.目的 使用vmware搭建centos虚拟机集群,进行基础服务搭建,对系统业务提供服务支撑 三.效果 centos虚拟机ip不会自动改变,使用设置的静态ip,可以 ...
- FPGA加速技术:如何提高系统的可编程性和灵活性
目录 <23. FPGA加速技术:如何提高系统的可编程性和灵活性> 一.引言 随着人工智能.物联网等新技术的快速发展,对计算资源和处理能力的需求不断增加.为了加速计算流程和提高系统的性能, ...
- Kubernetes(k8s) Web-UI界面(二):部署和访问Kuboard
目录 一.系统环境 二.前言 三.Kuboard简介 四.部署Kuboard 五.访问kuboard 六.总结 七.附加信息 一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作 ...
- 基于JavaFX的扫雷游戏实现(一)——整体概述
我在不要更新挑战中坚持了一年,你也来试试吧(咕咕咕)! 好言归正传,本次更新带来的是经典游戏扫雷,基于JavaFX实现.篇幅有限,文章主要介绍核心操作实现,不会列出所有代码.需要完整源码或是想预览 ...
- 我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater
我们现在使用SpringBoot 做Web 开发已经比之前SprngMvc 那一套强大很多了. 但是 用SpringBoot Web 做API 开发还是不够简洁有一些. 每次Web API常用功能都需 ...
- 图解 Vue 响应式原理
Vue 初始化 模板渲染 组件渲染 为了便于理解,本文将从以下两个方面进行探索: 从 Vue 初始化,到首次渲染生成 DOM 的流程. 从 Vue 数据修改,到页面更新 DOM 的流程. Vue 初始 ...
- 2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。
2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量. 其中的每一个数字出现的频率都相同. 答案2023-07-29: 大体步骤如下: 1.初始化变量base为固定值10 ...