美文网首页
从零搭建Spring boot +dubbo+zookeeper

从零搭建Spring boot +dubbo+zookeeper

作者: y丶M1ng | 来源:发表于2018-06-20 15:52 被阅读0次

    这章会利用maven进行分模块,并且引入dubbo和spring-boot,废话不多说,就开始一步步的搭建。

    分模块

    首先新建一个maven项目(其实目前好像更流行用gradle,虽然在android中我使用过,但仅仅是用gradle模块管理,以及引入一些包文件,具体的大作用还是没仔细了解,有兴趣的小伙伴可以去了解使用)项目目录如下图所示。因为我这个是作为一个父模块,并不需要src。我们这边可以直接删掉src,保留也可以,问题不大。


    新的maven项目.png

    然后我们将子模块添加到父模块下,我们分别需要一个提供者,一个消费者和一个基础模块。创建完成后文件目录如图显示


    项目目录.png
    我们在项目的pom.xml文件中添加需要的jar包。使用dependencyManagement标签,子项目pom不会自动使用父pom中的jar包,如果需要使用,就要给出groupId和artifactId,无需给出version
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zym.test</groupId>
        <artifactId>SpringBoot_Dubbo_Demo</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>SpringBoot_Dubbo_Consumer</module>
            <module>SpringBoot_Dubbo_Provider</module>
            <module>SpringBoot_Dubbo_Common</module>
        </modules>
        <!-- 设置我们项目的一些版本属性 -->
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.7</java.version>
            <dubbo.version>2.5.5</dubbo.version>
            <zkclient.version>0.10</zkclient.version>
            <lombok.version>1.16.18</lombok.version>
            <spring-boot.version>1.5.7.RELEASE</spring-boot.version>
        </properties>
        <!-- 声明一些项目依赖管理,方便我们的依赖版本管理 -->
        <dependencyManagement>
            <dependencies>
                <!-- Springboot依赖 -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                    <version>${spring-boot.version}</version>
                </dependency>
    
                <!-- Springboot-web依赖 -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <version>${spring-boot.version}</version>
                </dependency>
    
                <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成  -->
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                    <scope>provided</scope>
                </dependency>
    
                <!-- Dubbo依赖 -->
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>dubbo</artifactId>
                    <version>${dubbo.version}</version>
                </dependency>
    
                <!-- zookeeper的客户端依赖 -->
                <dependency>
                    <groupId>com.101tec</groupId>
                    <artifactId>zkclient</artifactId>
                    <version>${zkclient.version}</version>
                </dependency>
    
            </dependencies>
        </dependencyManagement>
    
    </project>
    

    接着基础模块都要被消费者和提供者模块引用。我们对基础模块的pom.xml导入需要的jar文件。以及创建基础模块存放的文件夹。现在我们仅仅将domin和service接口作为基础提供给消费者和提供者使用。在基础模块中引用lombok,一个非常好用减少get set 的编写,并且不影响速度。给出common项目的目录结构以及pom.xml。

    Common项目的.pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>SpringBoot_Dubbo_Demo</artifactId>
            <groupId>com.zym.test</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>SpringBoot_Dubbo_Common</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </project>
    
    Common项目的目录结构.png

    然后我们分别在两个模块中的pom.xml文件中引用基础模块,并且引入需要的jar包。

    SpringBoot_Dubbo_Consumer pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>SpringBoot_Dubbo_Demo</artifactId>
            <groupId>com.zym.test</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>SpringBoot_Dubbo_Consumer</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.zym.test</groupId>
                <artifactId>SpringBoot_Dubbo_Common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    SpringBoot_Dubbo_Provider 的pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>SpringBoot_Dubbo_Demo</artifactId>
            <groupId>com.zym.test</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>SpringBoot_Dubbo_Provider</artifactId>
        <dependencies>
            <dependency>
                <groupId>com.zym.test</groupId>
                <artifactId>SpringBoot_Dubbo_Common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.35</version>
            </dependency>
            <!-- alibaba的druid数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.11</version>
            </dependency>
        </dependencies>
    </project>
    

    这样我们就将需要的Jar包以及各个模块之间的关系搭建完了,接着就是各个子项目中搭建配置文件了,比如提供者肯定需要去实现service然后去数据库查询数据返回给消费者所以提供者肯定需要配置mybatis以及dubbo的文件配置。我们这边使用springboot,因为基本上都封装好了,配置就很简单了。我们先新增一个application.yml,具体配置如下,这边直接将mybatis的配置写在配置文件里了,就不需要像ssm一样需要xml文件配置了。
    application.yml:

    server:
      port: 8082
      context-path: /
    spring:
     datasource:
            name: test
            url: jdbc:mysql://127.0.0.1:3306/test
            username: root
            password: 123456
            # 使用druid数据源
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.jdbc.Driver
            filters: stat
            maxActive: 20
            initialSize: 1
            maxWait: 60000
            minIdle: 1
            timeBetweenEvictionRunsMillis: 60000
            minEvictableIdleTimeMillis: 300000
            validationQuery: select 'x'
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            poolPreparedStatements: true
            maxOpenPreparedStatements: 20
            mybatis:
              type-aliases-package:  domain
    

    同时,我们需要在项目中配置dubbo,让该项目成为提供者。
    SpringBoot_Dubbo_Provider 的 spring-dubbo.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <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="provider"/>
        <!-- 注册中心的ip地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
        <dubbo:annotation package="service.mpl"/>
    </beans>
    

    Springboot是使用类来作为启动器的,所以我们启动添加一个启动器ProviderApplication.java,在启动器中将dubbo的配置文件引用,并且去扫描mapper包。

    SpringBoot_Dubbo_Provider ProviderApplication.java:

    @SpringBootApplication
    @ImportResource({"classpath:config/spring-dubbo.xml"})
    @MapperScan("mapper")
    public class ProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
            try {
                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    这样SpringBoot_Dubbo_Provider这个项目就完成配置了。这是SpringBoot_Dubbo_Provider的项目结构

    SpringBoot_Dubbo_Provider项目结构.png

    接下来完成SpringBoot_Dubbo_Consumer 需要的项目配置。消费者需要实现的是将返回的数据显示给前端.(这里涉及到如果你的项目是前后端分离的话,那你的项目就应该直接返回json格式数据就好,可以直接使用springboot的@RestController。但是如果你使用的模板引擎或者是jsp那就要根据自己选择方式去做,具体的话就不展现了.自行百度). 下面为该项目的项目结构以及dubbo的配置XML.


    SpringBoot_Dubbo_Consumer 项目结构.png

    SpringBoot_Dubbo_Consumer 的 spring-dubbo.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <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="consumer"/>
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <dubbo:annotation package="controller"/>
    </beans>
    

    同样我们也要为这个项目写一个启动器。在启动器中加载dubbo配置文件 。这里提供者和消费者两个项目不能使用相同的端口号,所以消费者这边端口我使用的是8081 提供者为8082。因为消费者这边只是配置了一个端口号所以就不给出配置代码了。

    SpringBoot_Dubbo_Consumer 的ConsumerApplication .java:

    @SpringBootApplication
    @ImportResource({"classpath:config/spring-dubbo.xml"})
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }
    

    这样,所有的配置我们都完成了,接着就是添加我们要的业务逻辑以及相关代码了。这里,我就简单的从数据库根据ID查一个user信息为例子。

    首先根据下面脚本创建user表

    CREATE TABLE t_user(
      user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      user_name VARCHAR(255) NOT NULL ,
      password VARCHAR(255) NOT NULL ,
      phone VARCHAR(255) NOT NULL
    ) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;
    

    然后将表的映射java类,放在SpringBoot_Dubbo_Common的domin中,并且在service的包中添加一个userService接口。
    User.java:

    @Data
    public class User implements Serializable {
        private Integer userId;
    
        private String userName;
    
        private String password;
    
        private String phone;
    }
    

    userService.java

    
    /**
     * 用户接口
     *
     * @author zym
     * @create 2018-06-19 14:10
     **/
    public interface UserService {
        User findUser();
    }
    
    

    在SpringBoot_Dubbo_Provider的mapper包中添加UserMapper.java。(本来应该有mapper.xml文件,我这边不知道什么原因,总是说找不到我的xml文件,我这边就写成了注解形式)
    UserMapper.java:

    public interface UserMapper {
        @Results(id = "userMap", value = {
                @Result(column = "user_id", property = "userId"),
                @Result(column = "phone", property = "phone"),
                @Result(column = "user_name", property = "userName"),
                @Result(column = "password", property = "password")})
        @Select("SELECT * FROM t_user")
        List<User> getAll();
    
        @Select("SELECT * FROM t_user WHERE user_id = #{id}")
        @ResultMap("userMap")
        User getOne(Long id);
    
    }
    

    并且在SpringBoot_Dubbo_Provider的impl中实现UserService接口
    UserServiceImpl.java:

    @Service(version = "1.0.0")
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserMapper userMapper;
        
        @Override
        public User findUser() {
    
            return  userMapper.getOne(1L);
        }
    
    }
    

    SpringBoot_Dubbo_Consumer中添加UserController,像普通的springmvc一样,只是在RPC调用的时候需要带上注解。这样就完成了所有的代码

    @RestController
    @RequestMapping("/user")
    public class UserController {
        @Reference(version = "1.0.0")
        private UserService userService;
    
    
    
        @GetMapping("getUser")
        public User user() {
            return userService.findUser();
        }
    }
    

    执行程序发现运行失败,发现不能把启动类直接放在java文件下,新建了com.test包将之前的包都扔在了这下面,更改下配置中的包路径。先启动Provider再启动Consumer。

    返回结果.png
    成功读取到数据,我们再到dubbo-admin的web看下,发现一个消费者和一个提供者。分别点击提供者和消费者发现有我们代码中注册的userService了。这样就完成了整个dubbo项目的搭建。
    dubbo-admin的应用管理.png
    源码已经上传到了github上源码

    相关文章

      网友评论

          本文标题:从零搭建Spring boot +dubbo+zookeeper

          本文链接:https://www.haomeiwen.com/subject/gdzoeftx.html