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

    基于XML的Dubbo3程序开发

    环境搭建

    项目结构

    父项目pom.xml的依赖

    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <version>1.18.22version>
    dependency>
    
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-apiartifactId>
        <version>1.7.32version>
    dependency>
    
    <dependency>
        <groupId>ch.qos.logbackgroupId>
        <artifactId>logback-classicartifactId>
        <version>1.2.9version>
    dependency>
    
    <dependency>
        <groupId>org.apache.dubbogroupId>
        <artifactId>dubboartifactId>
        <version>3.2.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    首先开发公共模块-api模块
    实体entity
    @Data
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    public class User implements Serializable {
        private String name;
        private String password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    接口service
    public interface UserService {
        public boolean login(String name,String password);
    }
    
    • 1
    • 2
    • 3

    类文件目录

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

    配置文件结构

    
    <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:application name="dubbo-02-provider"/>
    
        
        <dubbo:protocol name="dubbo" port="20880"/>
    
        
        <bean id="userService" class="com.sjdwz.service.UserServiceImpl"/>
    
        
        <dubbo:service interface="com.sjdwz.service.UserService" ref="userService"/>
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    Spring工厂启动类

    Spring工厂启动类

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

    export url

    dubbo://192.168.96.1:20880/com.sjdwz.service.UserService
    
    • 1
    开发consumer模块
    引入api模块依赖
    <dependencies>
        <dependency>
            <groupId>com.sjdwzgroupId>
            <artifactId>dubbo-01-apiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    创建Spring配置文件

    配置文件

    
    <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:application name="dubbo-03-consuemer" />
    
        
        <dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
                         url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/>
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    创建启动类

    启动类

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

    注意

    消费端会有一个异常

    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启动时就会报错了。
    
    • 1
    • 2
    • 3
    • 4

    xml解决方案

     
     
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    boot解决方案

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

    细节补充

    1. 协议、端口
    provider基于dubbo协议 默认的端⼝是20880
    
    但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置
    端⼝
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    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.sjdwzgroupId>
        <artifactId>dubbo-01-apiartifactId>
        <version>1.0-SNAPSHOTversion>
    dependency>
    <dependency>
        <groupId>org.apache.dubbogroupId>
        <artifactId>dubbo-spring-boot-starterartifactId>
        <version>3.2.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    applicaion.yml

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

    DubboService注解

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

    启动类

    启动日志

    consumer模块

    consumer模块

    再引入api模块和dubbo-starter

    <dependency>
        <groupId>com.sjdwzgroupId>
        <artifactId>dubbo-01-apiartifactId>
        <version>1.0-SNAPSHOTversion>
    dependency>
    <dependency>
        <groupId>org.apache.dubbogroupId>
        <artifactId>dubbo-spring-boot-starterartifactId>
        <version>3.2.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    创建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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输出

    @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协议基础
    python工具-解析wireshark的rtp抓包
    基于ssm的在线法律咨询平台的设计与实现
    残差resnet复现,源代码理解
    【接口测试】代码篇Python+Requests+UnitTest
    redis中数据模糊查找-scan用法
    阿里云弹性计算资源
    Map接口
  • 原文地址:https://blog.csdn.net/qq_41243472/article/details/133048259