• SpringBoot项目集成Dubbo


    1.环境搭建

    为整合Dubbo之前,我们所写的项目都是单一应用架构,只需要一个应用,将所有功能都部署在一起,在应用内部是控制层调用业务层,业务层调用数据持久层;如今,整合Dubbo后,我们可以将应用程序的不同功能单元进行拆分(将控制层、业务层以及数据持久层拆分),各个服务之间通过RPC通信!
    下面,我们就开始在SpringBoot项目中集成Dubbo;首先我们需要创建一个空项目,在空项目中创建三个模块,分别定义工程。服务提供者以及服务消费者!
    接口工程:存放pojo实体和业务接口;
    服务提供者: 存放业务接口的实现类并将服务暴露到注册中心,并调用数据持久层
    服务消费者:处理浏览器客户端发送的请求,从注册中心调用服务提供者所提供的服务。

    1.创建一个空项目

    打开IDEA,单击文件,选择新建,点击项目,最后选择空项目,具体如下所示:
    在这里插入图片描述

    2.创建接口工程模块

    由于接口工程只需要存放一个pojo实体类和抽象的业务接口,因此创建一个普通的Maven项目即可!
    打开IDEA,单击文件,选择新建,点击新模块。具体如下所示:
    在这里插入图片描述
    紧接着按照自己的方式选择模块名称和位置,具体如下所示:最后点击完成!
    在这里插入图片描述

    3.创建服务提供者模块

    创建服务提供者需要依托一个SpringBoot项目,因此我们首先要创建一个SpringBoot项目。具体步骤如下,
    打开IDEA,单击文件,选择新建,点击新模块。具体如下所示:
    在这里插入图片描述

    点击下一步后选择Spring Web依赖即可完成创建!

    4.创建服务消费者模块

    服务消费者模块与服务提供者模块大同小异,按照创建服务提供者的方式创建即可,更换一下服务消费者的模块名称即可完成创建,具体如下所示:
    在这里插入图片描述

    2.接口工程中抽象接口的编写

    在dubbo-springboot-interfaces模块中创建一个UserService接口,具体如下所示:

    public interface UserService {
        int getCount();//获取当前网站在线人数
    }
    
    • 1
    • 2
    • 3

    3.服务提供者模块的编写

    1.导入服务提供者所需的依赖

    <dependency>
                <groupId>org.apache.curatorgroupId>
                <artifactId>curator-frameworkartifactId>
                <version>2.8.0version>
            dependency>
            <dependency>
                <groupId>org.apache.curatorgroupId>
                <artifactId>curator-recipesartifactId>
                <version>2.8.0version>
            dependency>
    
            <dependency>
                <groupId>com.alibaba.spring.bootgroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>2.0.0version>
    
            dependency>
            <dependency>
                <groupId>com.101tecgroupId>
                <artifactId>zkclientartifactId>
                <version>0.10version>
                <exclusions>
                    <exclusion>
                        <artifactId>slf4j-log4j12artifactId>
                        <groupId>org.slf4jgroupId>
                    exclusion>
                    <exclusion>
                        <artifactId>zookeeperartifactId>
                        <groupId>org.apache.zookeepergroupId>
                    exclusion>
                exclusions>
            dependency>
            
            <dependency>
                <groupId>com.xinggroupId>
                <artifactId>dubbo-springboot-interfacesartifactId>
                <version>1.0-SNAPSHOTversion>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    2.编写服务提供者配置文件

    这里需要注意,spring.dubbo.server=true代表该模块是服务的提供者,spring.dubbo.registry配置的是zookeeper的IP和端口,因此启动项目的前提是要在Linux系统中开启zookeeper!

    # 应用名称
    spring.application.name=dubbo-springboot-provider
    # 应用服务 WEB 访问端口
    server.port=8081
    # 设置上下文根
    server.servlet.context-path=/
    #dubbo配置
    spring.dubbo.server=true
    # 设置注册中心
    spring.dubbo.registry=zookeeper://IP:2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.实现接口工程中的抽象接口

    这里需要注意的是,我们需要导入的@Service是com.alibaba.dubbo.config.annotation包下的,同时需要使用@Component将此类装入spring容器中,这里并未调用真实的数据持久层,只是模拟调用!

    package com.xing.dubbospringbootprovider.service.impl;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.xing.dubbospringbootconsumer.service.UserService;
    import org.springframework.stereotype.Component;
    
    @Component
    @Service(interfaceClass = UserService.class,version = "2.6.0",timeout = 15000)
    public class UserServiceImpl implements UserService {
        @Override
        public int getCount() {
            //调用数据持久层
            return 1024;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.在服务提供者主启动类上开启Dubbo配置

    在模块主启动类上加上@EnableDubboConfiguration即可以开启开启dubbo配置!

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

    3.服务消费者模块的编写

    1.导入服务消费者所需的依赖

    这里所需要的依赖与服务提供者相同,这里就不过多展示了,有需要的可以拷贝服务提供者所展示的依赖。

    2.编写服务消费者配置文件

    这里配置文件中的IP需要更换为自己购买的阿里云服务器的IP;

    # 应用名称
    spring.application.name=dubbo-springboot-consumer
    # 应用服务 WEB 访问端口
    server.port=8083
    # 配置上下文根
    server.servlet.context-path=/
    # 配置注册中心
    spring.dubbo.registry=zookeeper://IP:2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.编写控制层代码

    消费者使用@Reference(interfaceClass = UserService.class,version = “2.6.0”,check = false)注解,从注册中心调用服务提供者所提供的服务。

    package com.xing.dubbospringbootconsumer.controller;
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.xing.dubbospringbootconsumer.service.UserService;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class UserController {
        @Reference(interfaceClass = UserService.class,version = "2.6.0",check = false)
        private UserService userService;
        
        @RequestMapping("/count")
        @ResponseBody
        public String getCount(){
            int count=userService.getCount();
            return "当前在线的人数为:"+count;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4.在服务消费者主启动类上开启Dubbo配置

    package com.xing.dubbospringbootconsumer;
    
    import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableDubboConfiguration //开启Dubbo配置
    public class DubboSpringbootConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(DubboSpringbootConsumerApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.开启zookeeper服务

    这里就不详细讲解如何安装zookeeper了,有需要的读者可以自己去网上下载并配置环境!

    cd /opt/zookeeper/apache-zookeeper-3.5.6-bin/bin/
    # 启动zookeeper
    ./zkServer.sh start
    
    • 1
    • 2
    • 3

    可以通过./zkServer.sh status查看是否启动成功,出现以下数据即启动成功!
    在这里插入图片描述

    5.修改IDEA的环境配置

    这里需要注意,我们创建的模块,默认的目标字节码版本是5,我们需要修改为8,否则可能会出现内部Java编译器错误;
    在这里插入图片描述
    同时,如果启动项目发现出现Class path contains multiple SLF4J bindings.的问题,可以参考我使用maven Helper解决问题的办法,解决问题的文档

    最后,如果需要同时启动多个SpringBoot实例,这里需要修改IDEA启动的配置,具体如下所示:
    点击编辑配置,勾选允许并运行的选项即可,同时,每个不同的模块需要设置不同的端口号,否则同样是不能同时运行的!
    在这里插入图片描述
    最后,解决所有问题后,运行的效果如下所示:
    在这里插入图片描述

  • 相关阅读:
    微信公众号支付/微信内置浏览器微信h5支付报错:当前页面的URL未注册:https:∥xxxxxx!解决方法一看就会
    漏洞复现--奇安信360天擎未授权访问
    java servlet 返回图片验证码
    Tmux 使用教程
    洛谷P5731 【深基5.习6】蛇形方阵java版题解
    前缀,中缀,后缀表达式规则 [数据结构][Java]
    【Computer Vision】基于卷积神经网络实现美食分类
    100天精通Python(可视化篇)——第108天:Pyecharts绘制多种炫酷词云图参数说明+代码实战
    苹果ipad触控笔哪个好?ipad手写笔推荐
    Node.js | express 中间件详解(应用级 | 路由级 | 内置(托管静态资源) | 第三方)
  • 原文地址:https://blog.csdn.net/qq_51447436/article/details/128071391