经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发
来源:cnblogs  作者:随机的未知  时间:2023/9/20 9:29:00  对本文有异议

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. 1. JDK8 Dubbo3.1.x以前的版本匹配,在使?Zookeeper注册作为注册中?时,消费者会出现节点已经存在的异常
  2. https://github.com/apache/dubbo/issues/11077
  3. 2. JDK17 Dubbo3.1.x之前的版本搭配使?会出现如下问题
  4. a. JDK9之后的深反射问题,需要通过JVM参数配置解决
  5. -Dio.netty.tryReflectionSetAccessible=true
  6. --add-opens
  7. java.base/jdk.internal.misc=ALL-UNNAMED
  8. --add-opens
  9. java.base/java.nio=ALL-UNNAMED
  10. --add-opens
  11. java.base/java.lang=ALL-UNNAMED
  12. b. Dubbo3.2.0.beat4以前的版本使?的是Spring5.2.x 不能?持 JDK17
  13. 会产?如下异常
  14. Unsupported class file major version 61 major 61 对应 17
  15. 版本需要升级到Dubbo3.2.0.beat5以上版本

基于XML的Dubbo3程序开发

环境搭建

项目结构

父项目pom.xml的依赖

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.22</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.slf4j</groupId>
  8. <artifactId>slf4j-api</artifactId>
  9. <version>1.7.32</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>ch.qos.logback</groupId>
  13. <artifactId>logback-classic</artifactId>
  14. <version>1.2.9</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.dubbo</groupId>
  18. <artifactId>dubbo</artifactId>
  19. <version>3.2.0</version>
  20. </dependency>

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

实体entity
  1. @Data
  2. @ToString
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class User implements Serializable {
  6. private String name;
  7. private String password;
  8. }
接口service
  1. public interface UserService {
  2. public boolean login(String name,String password);
  3. }

类文件目录

开发provider模块

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

配置文件结构

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

Spring工厂启动类

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

export url

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

开发consumer模块

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

配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  4. 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">
  5. <!-- 配置dubbo服务名称 -->
  6. <dubbo:application name="dubbo-03-consuemer" />
  7. <!-- 获取远端服务
  8. url就是刚才导出的url
  9. -->
  10. <dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
  11. url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/>
  12. </beans>
创建启动类

启动类

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

注意

消费端会有一个异常

  1. 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.
  2. 问题产生的原因:
  3. Qos=Quality of ServiceqosDubbo的在线运维命令,可以对服务进?动态的配置、控制及查询,Dubboo2.5.8新版本重构了telnettelnet是从Dubbo2.0.5开始?持的)模块,提供了新的telnet命令支持,新版本的telnet端?与dubbo协议的端?是不同的端?,默认为22222。正是因为这个问题:如果在?台服务器里面,启动provider22222端?,?consumer启动时就会报错了。

xml解决方案

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

boot解决方案

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

细节补充

  1. 协议、端口
  1. provider基于dubbo协议 默认的端?是20880
  2. <dubbo:protocol name="dubbo" port="20880"/>
  3. 但是随着应?数量过?如果显示指定协议端?,会容易造成端?冲突所以建议按照如下写法设置
  4. 端?
  5. <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

  1. <dependency>
  2. <groupId>com.sjdwz</groupId>
  3. <artifactId>dubbo-01-api</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.dubbo</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>3.2.0</version>
  10. </dependency>

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

applicaion.yml

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

DubboService注解

启动类上加@EnableDubbo注解:

启动类

启动日志

consumer模块

consumer模块

再引入api模块和dubbo-starter

  1. <dependency>
  2. <groupId>com.sjdwz</groupId>
  3. <artifactId>dubbo-01-api</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.dubbo</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>3.2.0</version>
  10. </dependency>

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

applicaion.yml

在启动类中加上注解

启动类

在测试类中进行测试:

  1. @SpringBootTest
  2. class Dubbo05BootConsumerApplicationTests {
  3. //url是刚才输出的url
  4. @DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.service.UserService")
  5. private UserService userService;
  6. @Test
  7. public void test1() {
  8. boolean ret = userService.login("sjdwz", "123456");
  9. System.out.println("ret = " + ret);
  10. }
  11. }

输出

@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注解的作?。

原文链接:https://www.cnblogs.com/nicaicai/p/17715947.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号