01.Dubbo3应⽤开发第⼀章

Dubbo3应⽤开发第⼀章

1.第⼀个Dubbo程序开发

JDK 与 Dubbo版本对应问题说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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以上版本

jdk于spring匹配关系

1
2
3
4
5
6
SpringFramework JDK
Spring 5.3.x JDK 8-19
Spring 5.2.x JDK 8-15
Spring 5.1.x JDK 8-12
Spring 5.0.x JDK 8-10
Spring 4.3.x JDK 6-8

dubbo依赖

1
2
3
4
5
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.2.0</version>
</dependency>

QOS问题

ERROR org.apache.dubbo.qos.server.Server

Address already in use

问题产⽣的原因:

Qos=Quality of Service,qos是Dubbo的在线运维命令,可以对服务进⾏动态的配置、控制及查询,Dubboo2.5.8新版本重构了telnet(telnet是从Dubbo2.0.5开始⽀持的)模块,提供了新的telnet命令⽀持,新版本的telnet端⼝与dubbo协议的端⼝是不同的端⼝, 默认为22222。正是因为这个问题:如果在⼀台服务器⾥⾯,启动provider时22222端⼝,⽽consumer启动时就会报错了。

解决方案:

关闭qos或者修改qos端口

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

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

启动端口冲突问题

provider基于dubbo协议 默认的端⼝是20880 ,但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置端⼝ 。

1
2
3
4

<dubbo:protocol name="dubbo" port="20880"/>

<dubbo:protocol name="dubbo" port="-1"/>

2.springboot与dubbo3整合

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

引入依赖:

1
2
3
4
5
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>

@EnableDubbo注解的作⽤

  1. @EnableDubbo ⽤于扫描@DubboService 并把对应的对象实例化,发布成RPC服务。 扫描的路径:应⽤这个注解的类(启动类)所在的包及其⼦包。
  2. 如果@DubboService注解修饰的类没有放到@EnableDubbo注解修饰类当前包及其⼦包,还希望能够扫描到它该如何处理? 可以通过@DubboComponentScan(basePackages = {“org.suns.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服务

  1. 后续开发过程中如果考虑兼容性,建议实现类不仅仅要加⼊@DubboService注解,同时也要加⼊@Service注解。

@DubboReference注解的作⽤(消费者)

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

@DubboReference(url = “dubbo://192.168.50.62:20880/com.suns.service.UserService”)