• Dubbo实战


    专栏目录:*
    Dubbo基础: https://blog.csdn.net/qq_38310244/article/details/125891802
    Dubbo实战: https://blog.csdn.net/qq_38310244/article/details/125892120
    手写一套简单的dubbo(含注册中心)之编程思想: https://blog.csdn.net/qq_38310244/article/details/125892641
    手写一套简单的dubbo(含注册中心)之核心代码: https://blog.csdn.net/qq_38310244/article/details/125892849

    上一篇:Dubbo基础已经介绍了Dubbo的一些理论知识,现在开始代码实战。

    代码实现

    定义一个公共接口的模块dubbo-api

    在这里插入图片描述

    User类

    package com.mywork.dubboapi.bean;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 16:52
     * @Version 1.0
     */
    @Data
    public class User implements Serializable {
    
        private Integer id;
        private String name;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    公共接口UserService类,相当于服务提供者和服务消费者之间的桥梁

    package com.mywork.dubboapi.service;
    
    import com.mywork.dubboapi.bean.User;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 16:53
     * @Version 1.0
     */
    public interface UserService {
    
        User getUser();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    基于Springboot注解配置实现

    服务提供者

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zktRiQBi-1658299535301)(E:\study\dubbo\image\image-20220707173804843.png)]

    pom.xml文件引用主要依赖

    
            <dependency>
                <groupId>com.alibaba.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>0.1.0version>
            dependency>
            
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
            dependency>
    
            
            <dependency>
                <groupId>com.myworkgroupId>
                <artifactId>dubbo-apiartifactId>
                <version>0.0.1-SNAPSHOTversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    定义dubbo的配置信息,DubboConfiguration类

    package com.mywork.dubboprovider.config;
    
    import com.alibaba.dubbo.config.ApplicationConfig;
    import com.alibaba.dubbo.config.ProtocolConfig;
    import com.alibaba.dubbo.config.RegistryConfig;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Author: huangjun
     * @Date: 2022/7/7 15:20
     * @Version 1.0
     */
    @Configuration
    public class DubboConfiguration {
    
        /**
         * 定义应用名称
         */
        @Bean
        public ApplicationConfig applicationConfig(){
            return new ApplicationConfig("mywork-provider");
        }
    
        /**
         * 注册中心地址
         */
        @Bean
        public RegistryConfig registryConfig(){
            return new RegistryConfig("zookeeper://127.0.0.1:2181");
        }
    
        /**
         * 定义dubbo协议和监听端口
         */
        @Bean
        public ProtocolConfig protocolConfig(){
            return new ProtocolConfig("dubbo",20888);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    实现公共接口

    package com.mywork.dubboprovider.serviceImpl;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.mywork.dubboapi.bean.User;
    import com.mywork.dubboapi.service.UserService;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 17:03
     * @Version 1.0
     */
    //*******注意,这里的service注解用的不是spring的注解,而是com.alibaba.dubbo.config.annotation.Service;****
    @Service
    @org.springframework.stereotype.Service("userServer")
    public class UserServiceImpl implements UserService {
        @Override
        public User getUser() {
            User user = new User();
            user.setId(1);
            user.setName("基于【注解】文件");
            return user;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    启动类添加dubbo需要扫描的包

    package com.mywork.dubboprovider;
    
    import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    
    
    @SpringBootApplication
    @DubboComponentScan(basePackages = "com.mywork.dubboprovider.serviceImpl") //扫描接口实现类
    public class DubboProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboProviderApplication.class, args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    至此,完成服务提供者的开发。

    服务消费者

    在这里插入图片描述

    pom.xml主要依赖

    !-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
            <dependency>
                <groupId>com.alibaba.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>0.1.0version>
            dependency>
            
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
            dependency>
            
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>fastjsonartifactId>
                <version>1.2.47version>
            dependency>
            
            <dependency>
                <groupId>com.myworkgroupId>
                <artifactId>dubbo-apiartifactId>
                <version>0.0.1-SNAPSHOTversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    定义dubbo配置信息

    package com.mywork.dubboconsumer.config;
    
    import com.alibaba.dubbo.config.ApplicationConfig;
    import com.alibaba.dubbo.config.ConsumerConfig;
    import com.alibaba.dubbo.config.RegistryConfig;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Author: huangjun
     * @Date: 2022/7/7 15:27
     * @Version 1.0
     */
    @Configuration
    public class DubboConfiguration {
    
        /**
         * 定义应用名称
         */
        @Bean
        public ApplicationConfig applicationConfig(){
            return new ApplicationConfig("mywork-consumer");
        }
    
        /**
         * 设置消费者超时时间
         */
        @Bean
        public ConsumerConfig consumerConfig(){
            ConsumerConfig consumerConfig = new ConsumerConfig();
            consumerConfig.setTimeout(3000);
            return consumerConfig;
        }
    
        /**
         * 注册中心地址
         */
        @Bean
        public RegistryConfig registryConfig(){
            return new RegistryConfig("zookeeper://127.0.0.1:2181");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    引用代理类实现业务

    package com.mywork.dubboconsumer.controller;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.mywork.dubboapi.bean.User;
    import com.mywork.dubboapi.service.UserService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 17:08
     * @Version 1.0
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Reference
        private UserService userService;
    
        @GetMapping("/getUser")
        public User getUser(){
            return userService.getUser();
       
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    启动类添加dubbo注解

    package com.mywork.dubboconsumer;
    
    import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    
    @SpringBootApplication
    @EnableDubbo //开启dubbo
    public class DubboConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboConsumerApplication.class, args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    测试

    启动zookeeper,启动服务提供者,启动服务消费者

    管理界面查看

    dubbo-admin管理界面:

    在这里插入图片描述

    在这里插入图片描述

    可以看到我们的服务已经在注册中心进行了发布和订阅

    接口测试

    在这里插入图片描述

    调用成功

    基于Springboot配置文件实现

    服务提供者

    在这里插入图片描述

    pom.xml核心依赖

     
            <dependency>
                <groupId>com.alibaba.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>0.1.0version>
            dependency>
            
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
            dependency>
    
            
            <dependency>
                <groupId>com.myworkgroupId>
                <artifactId>dubbo-apiartifactId>
                <version>0.0.1-SNAPSHOTversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在resource目录下新建dubbo-provider.xml配置文件进行dubbo信息的配置

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        
        <dubbo:application name="mywork-file-provide"/>
    
        
        <dubbo:registry id="local" address="zookeeper://127.0.0.1:2181"/>
    
        
        <dubbo:protocol name="dubbo" port="20881"/>
    
        
        
        
        <dubbo:service registry="local" interface="com.mywork.dubboapi.service.UserService" ref="userServer"/>
    beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    定义公共接口的实现

    package com.mywork.dubbofileprovider.serverImpl;
    
    import com.mywork.dubboapi.bean.User;
    import com.mywork.dubboapi.service.UserService;
    import org.springframework.stereotype.Service;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 17:03
     * @Version 1.0
     */
    @Service("userServer")
    public class UserServiceImpl implements UserService {
        @Override
        public User getUser() {
            User user = new User();
            user.setId(1);
            user.setName("基于【配置】文件");
            return user;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    启动类引入dubbo依赖

    package com.mywork.dubbofileprovider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ImportResource;
    
    @SpringBootApplication
    @ImportResource("classpath:dubbo-provider.xml") //引入dubbo的配置
    public class DubboFileProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboFileProviderApplication.class, args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    至此,完成服务提供者的开发。

    服务消费者

    在这里插入图片描述

    pom.xml核心依赖

    
            <dependency>
                <groupId>com.alibaba.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>0.1.0version>
            dependency>
            
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
            dependency>
            
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>fastjsonartifactId>
                <version>1.2.47version>
            dependency>
            
            <dependency>
                <groupId>com.myworkgroupId>
                <artifactId>dubbo-apiartifactId>
                <version>0.0.1-SNAPSHOTversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在resource下新建dubbo-consumer.xml进行dubbo信息的配置

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
        <dubbo:application name="mywork-file-consumer"/>
        <dubbo:registry id="local" address="zookeeper://127.0.0.1:2181"/>
        <dubbo:protocol name="dubbo"/>
        
        
        <dubbo:reference registry="local" id="userService" interface="com.mywork.dubboapi.service.UserService"/>
    
    beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    引用公共接口实现业务

    package com.mywork.dubbofileconsumer.controller;
    
    import com.mywork.dubboapi.bean.User;
    import com.mywork.dubboapi.service.UserService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    /**
     * @Author: huangjun
     * @Date: 2022/6/22 17:08
     * @Version 1.0
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        /**
         * 跟springboot一样,正常引用容器里的对象即可
         */
        @Resource
        private UserService userService;
    
        @GetMapping("/getUser")
        public User getUser(){
            return userService.getUser();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    启动类引入dubbo配置

    package com.mywork.dubbofileconsumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ImportResource;
    
    @SpringBootApplication
    @ImportResource("classpath:dubbo-consumer.xml")
    public class DubboFileConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboFileConsumerApplication.class, args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    至此,完成服务消费者的开发

    测试

    启动zookeeper,启动服务提供者,启动服务消费者

    管理界面查看

    dubbo-admin管理界面:

    在这里插入图片描述

    在这里插入图片描述

    可以看到我们的服务已经在注册中心进行了发布和订阅

    接口测试

    在这里插入图片描述

    调用成功

    基于jdk的配置文件实现

    服务消费者

    在这里插入图片描述

    为了方便引入jar和对jar包的管理,这里使用Maven来管理依赖

    pom.xml核心依赖

     
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>fastjsonartifactId>
                <version>1.2.47version>
            dependency>
    
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>5.3.5version>
            dependency>
    
            
            <dependency>
                <groupId>com.myworkgroupId>
                <artifactId>dubbo-apiartifactId>
                <version>0.0.1-SNAPSHOTversion>
            dependency>
    
            
            <dependency>
                <groupId>com.alibaba.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>0.1.0version>
            dependency>
            
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在resource下新建dubbo-consumer.xml进行dubbo信息的配置

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
        <dubbo:application name="mywork-jdk-consumer"/>
        <dubbo:registry id="register" address="zookeeper://127.0.0.1:2181"/>
        <dubbo:protocol name="dubbo"/>
        
        
        <dubbo:reference registry="register" id="userService" interface="com.mywork.dubboapi.service.UserService"/>
    
    beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    主方法调用服务提供者接口

    package com.mywork;
    
    import com.alibaba.fastjson.JSON;
    import com.mywork.dubboapi.bean.User;
    import com.mywork.dubboapi.service.UserService;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @Author: huangjun
     * @Date: 2022/7/7 18:32
     * @Version 1.0
     */
    public class Main {
    
        public static void main(String[] args) {
            //获取配置文件
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
            //装载配置文件
            context.start();
            System.out.println("consumer start");
            //从配置文件中获取到bean
            UserService userService = context.getBean(UserService.class);
            //调用服务生产者的代理的接口
            User user = userService.getUser();
            System.out.println("执行结果===>" + JSON.toJSONString(user));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    测试

    启动zookeeper,启动服务提供者,启动主方法

    调用结果:

    在这里插入图片描述
    下一篇:手写一套简单的dubbo(含注册中心)之编程思想

  • 相关阅读:
    Vue 开发必须知道的 36 个技巧【近1W字】
    文件IO(IO编程)
    1000 + Java 面试题,26,Javaweb基础知识点
    分频流水灯
    Redis入门到通关之数据结构解析-QuickList
    使用 kind 搭建 Kubernetes学习环境
    技术分享 | 白盒测试方法论
    基于VMware从零搭建Linux系统
    尚硅谷-云尚办公-项目复盘
    Shell编程之免交互
  • 原文地址:https://blog.csdn.net/qq_38310244/article/details/125892120