• SpringBoot+Dubbo+ZooKeeper+Maven入门实践


    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11798626.html

    注*** 本实例为仅适合初学者,关于dubbo和springboot以及各种工具的功能介绍就免了,读者可以自行百度,这里仅示范操作.

    准备工具(本人所使用工具和版本):

      JDK1.8 + tomcat8.5 + springboot 2.2.0.RELEASE + zookeeper-3.4.14 + dubbo-admin-2.5.8 + Lombok插件(idea中搜索) + maven3.6.1

    ----------------分割线-----------------------------------------

    开始!!!

    1. 创建一个maven主项目oldhen, 目录结构和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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>oldhen</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <name>Double Yolk</name>
        <description>A Springboot with Dubbo Project</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <modules>
            <module>model</module>
            <module>common</module>
            <module>provider</module>
            <module>consumer</module>
            <module>api</module>
        </modules>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <dubbo.version>2.5.5</dubbo.version>
            <zkclient.version>0.10</zkclient.version>
            <lombok.version>1.18.8</lombok.version>
            <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </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>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <!--zookeeper的客户端依赖-->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
    
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    oldhen-pom.xml

    创建完之后配置好pom.xml之后什么都不用管,下一步.

    2. 创建model子模块, 目录结构和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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>model</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>model</name>
        <description>Model module of oldhen</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <dubbo.version>2.5.5</dubbo.version>
            <zkclient.version>0.10</zkclient.version>
            <lombok.version>1.18.8</lombok.version>
            <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成  -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <scope>provided</scope>
            </dependency>
    
        </dependencies>
    
    </project>
    model-pom.xml

     Test实体类如下:

    package com.oldhen.model.test;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * TODO
     * TEST 实体
     * 使用lombok注解免去set/get,编译的时候会自动写进字节码文件
     */
    @Data
    public class Test implements Serializable {
        private String id;
        private String name;
    }
    Test.java

     配置文件可以不需要.

    3. 创建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">
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>common</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <modelVersion>4.0.0</modelVersion>
    
        <name>common</name>
        <description>Common module of oldhen</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <dubbo.version>2.5.5</dubbo.version>
            <zkclient.version>0.10</zkclient.version>
            <lombok.version>1.18.8</lombok.version>
            <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>model</artifactId>
                <version>1.0.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-test</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
    </project>
    common-pom.xml

    TestUtil工具类如下:

    package com.oldhen.common.test;
    
    import com.oldhen.model.test.Test;
    
    /**
     * 测试工具类
     */
    public class TestUtil {
    
        private TestUtil(){}
    
        public static void Test(){
            Test test = new Test();
        }
    }
    TestUtil.java

    4. 创建api子模块, 目录结构和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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>api</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>api</name>
        <description>Api module of oldhen</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <dubbo.version>2.5.5</dubbo.version>
            <zkclient.version>0.10</zkclient.version>
            <lombok.version>1.18.8</lombok.version>
            <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>model</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>common</artifactId>
                <version>1.0.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-test</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    api-pom.xml

    5. 创建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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>consumer</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>consumer</name>
        <description>Consumer module of oldhen</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <zkclient.version>0.10</zkclient.version>
            <dubbo.version>2.5.5</dubbo.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>api</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>model</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>common</artifactId>
                <version>1.0.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>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.14</version>
            </dependency>
    
            <!--zookeeper的客户端依赖-->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </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>8.0.16</version>
            </dependency>
            <!-- alibaba的druid数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    consumer-pom.xml

    TestConsumer类如下:

    package com.oldhen.consumer.test;
    
    import com.oldhen.api.test.TestApi;
    import com.oldhen.model.test.Test;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    /**
     * TODO
     * Test consumer 层
     */
    @RestController
    public class TestConsumer {
    
        @Resource
        TestApi testApi;
    
        @GetMapping("/test")
        public List<Test> findAllTest(HttpServletRequest request){
            String param = request.getParameter("param");
            System.out.println("********================****************");
            System.out.println("it's comming! ");
            List<Test> tests = testApi.findAll();
            System.out.println("********================****************");
            return tests;
        }
    }
    TestConsumer.java

    启动类如下:

    package com.oldhen.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ImportResource;
    
    /**
     * 启动类
     */
    @ImportResource({"classpath:spring-dubbo-consumer.xml"})
    @SpringBootApplication(scanBasePackages = "com.oldhen.consumer.test")
    public class ConsumerApplication {
    
        public static void main(String[] args) throws InterruptedException {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }

    配置文件application.yml和消费者dubbo配置文件如下:

    server:
      port: 9093
    
    spring:
      datasource:
        name: mysql
        url: jdbc:mysql://127.0.0.1:3306/oldhen
        username: root
        password: root
        # 使用druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.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
    application.yml
    <?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服务名称,需要唯一指定 -->
        <dubbo:application name="consumer"/>
    
        <!-- dubbo注册在zookeeper上,通过zookeeper实现服务的注册和发布以及订阅 -->
        <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    
        <!-- 使用dubbo协议和端口 -->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <!-- 此处的id要和提供者那边的一致,接口使用api提供的接口即可,避免与提供者代码耦合-->
        <dubbo:reference id="testApi" check="false" interface="com.oldhen.api.test.TestApi"/>
    
        <!-- dubbo注解扫描路径 -->
        <dubbo:annotation package="com.oldhen.consumer.test.**"/>
    
    </beans>
    spring-dubbo-consumer.xml

    6. 创建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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.doubleyolk</groupId>
        <artifactId>provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>provider</name>
        <description>Provider module of oldhen</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <zkclient.version>0.10</zkclient.version>
            <dubbo.version>2.5.5</dubbo.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>model</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>api</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.doubleyolk</groupId>
                <artifactId>common</artifactId>
                <version>1.0.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-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.14</version>
            </dependency>
    
            <!--zookeeper的客户端依赖-->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </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>8.0.16</version>
            </dependency>
            <!-- alibaba的druid数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    provider-pom.xml

    业务层代码:

    package com.oldhen.provider.test.biz;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.oldhen.api.test.TestApi;
    import com.oldhen.model.test.Test;
    import com.oldhen.provider.test.TestProvider;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * 业务层
     */
    @Service
    public class TestApiBiz implements TestApi {
    
        @Resource
        TestProvider testProvider;
    
        @Override
        public List<Test> findAll() {
            // do something
    
            return testProvider.findAll();
        }
    }
    TestApiBiz.java

    建库建表语句和dao层代码:

    CREATE DATABASE
    IF
        NOT EXISTS oldhen;
    
    CREATE TABLE oldhen_model_test ( id INT NOT NULL PRIMARY KEY, NAME VARCHAR ( 20 ) NOT NULL ) ENGINE = INNODB DEFAULT charset = utf8;
    
    INSERT INTO oldhen_model_test
    VALUES
        ( 1, "one" );
    INSERT INTO oldhen_model_test
    VALUES
        ( 2, "two" );
    INSERT INTO oldhen_model_test
    VALUES
        ( 3, "three" );
    INSERT INTO oldhen_model_test
    VALUES
        ( 4, "four" );
    data.sql
    package com.oldhen.provider.test.dao;
    
    import com.oldhen.model.test.Test;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    /**
     * TODO
     * Test dao数据访问层
     */
    @Component
    public interface TestDao {
        List<Test> findAllTest();
    }
    TestDao.java
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.oldhen.provider.test.dao.TestDao">
        <resultMap id="test" type="com.oldhen.model.test.Test" >
            <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
            <!-- property:主键在pojo中的属性名 -->
            <!-- column:主键在数据库中的列名 -->
            <id property="id" column="id" />
    
            <!-- 定义普通属性 -->
            <result property="name" column="name" />
        </resultMap>
        <select id="findAllTest" resultType="com.oldhen.model.test.Test">
            select mt.* from oldhen_model_test mt
        </select>
    </mapper>
    TestDao.xml

    service层代码:

    package com.oldhen.provider.test;
    
    import com.oldhen.model.test.Test;
    
    import java.util.List;
    
    /**
     * TODO
     * Test provider 服务层
     */
    public interface TestProvider {
        List<Test> findAll();
    }
    TestProvider.java
    package com.oldhen.provider.test.impl;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.oldhen.model.test.Test;
    import com.oldhen.provider.test.TestProvider;
    import com.oldhen.provider.test.dao.TestDao;
    
    import javax.annotation.Resource;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 服务实现类
     */
    @Service
    public class TestProviderImpl implements TestProvider {
    
        @Resource
        TestDao dao;
    
        @Override
        public List<Test> findAll() {
            Test test = new Test();
            test.setId("1");
            test.setName("hello");
            List<Test> tests = new ArrayList<>();
            tests.add(test);
            return dao.findAllTest();
        }
    }
    TestProviderImpl.java

    启动类和配置文件:

    package com.oldhen.provider;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ImportResource;
    
    /**
     * 启动类
     * MapperScan扫描mapperxml文件
     */
    @SpringBootApplication
    @MapperScan("com.oldhen.provider.test.dao")
    @ImportResource({"classpath:spring-dubbo-provider.xml"})
    public class ProviderApplication {
    
        public static void main(String[] args) throws InterruptedException {
            SpringApplication.run(ProviderApplication.class, args);
            /**
             * 防止提供者程序中断或停止导致消费者无法调用
             * 如果提供者主程序跑完了zookeeper也会中断(原因未知)
             */
            synchronized (ProviderApplication.class){
                while (true){
                    ProviderApplication.class.wait();
                }
            }
        }
    }
    server:
      port: 9099
    
    spring:
      datasource:
        name: mysql
        url: jdbc:mysql://127.0.0.1:3306/oldhen?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: root
        # 使用druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.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
      # 指定全局配置文件位置
      # config-location: classpath:mybatis/mybatis-config.xml
      # 指定sql映射文件位置
      mapper-locations: classpath:mapper/*.xml
    application.yml
    <?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服务名称,需要唯一指定 -->
        <dubbo:application name="provider"/>
    
        <!-- zookeeper注册中心的ip地址 -->
        <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    
        <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
        <dubbo:annotation package="com.oldhen.provider.test.impl.**" />
    
        <!-- 使用dubbo协议并且将服务发布在20880端口 -->
        <dubbo:protocol name="dubbo" port="20880" />
    
        <!-- 定义实际的api实现类, 具体的功能实现都在在这里,此处的id要和消费者那边的一致 -->
        <bean id="testProviderApiBiz" class="com.oldhen.provider.test.biz.TestApiBiz"/>
    
        <!-- 发布api接口服务, 实际引用的实现类时上面那个,消费者只要调用这个接口就能直接调用实现类的方法和功能 -->
        <dubbo:service interface="com.oldhen.api.test.TestApi" ref="testProviderApiBiz"/>
    </beans>
    spring-dubbo-provider.xml

    7. Zookeeper的配置文件:

    tickTime=2000
    initLimit=10
    syncLimit=5
    #文件存储路径,如果是linux则修改为/tmp或者对应的路径
    dataDir=D:/tmp/zookeeper
    #服务端口,和java中的配置一致即可
    clientPort=2181

     至此,准备工作已经完毕了!开始运行程序!

    a) 执行zookeeper-3.4.14in目录下的zkServer.cmd, 本人是win系统,linux运行zkServer.sh即可;将dubbo-admin源码下载下来之后,执行mvn compile, 再执行mvn package打包,然后将打出来的war包放入tomcat中运行即可,此处不作过多讲解.

    b) 数据库开起来, 执行sql文件创建数据库和数据表和插入数据;

    c) 首先运行提供者的启动类;

    d) 其次运行消费者的启动类;

    e) 通过访问浏览器 http://192.168.137.1:9093/test/ 来查看是否返回如下数据:

    [{"id":"1","name":"one"},{"id":"2","name":"two"},{"id":"3","name":"three"},{"id":"4","name":"four"}]

    f) 有的话代表成功了! 没有的话请检查上述工具的版本是否对应!以及是否启动成功!

    g) 具体的服务是否启动可以登录 http://127.0.0.1:9090/dubbo-admin-2.5.8 输入用户名root密码root进行登录查看

      

     查看相应的服务是否启动即可!没有启动的话请检查环境(jdk版本, Zookeeper版本, dubbo-admin版本)是否正确!缺一不可,请不要随意改动pom文件,否则也可能出现各种兼容性问题导致程序无法运行!

      总结: 整体的思路就是消费者通过实现api层提供的接口来访问接口里面的方法, 这其中消费者不需要关注其他事情,只需要将自己和Zookeeper绑定起来获取Zookeeper上发布的提供者服务即可, 提供者也是通过实现api层提供的接口来实现相应的对数据库访问操作,从而返回数据给消费者,这其中它也不需要关注其他事情,只需要将自己的服务注册发布到Zookeeper上由Zookeeper来给别的服务提供服务,提供者只需要关注自己的业务实现即可,当然model层和common层独立出来可以供消费者和提供者以及api层共同使用,无需重复写JavaBean.

    附上笔记图:

    - oldhen    主项目
    - model 实体层(提供一般的实体类编写,采用lombok来实现去set/get化)
    - common 通用层(用来提供工具类或者通用的一些组件等功能)
    - api 接口层(主要是用来解耦consumer和provider, 消费者和提供者同时实现api中的接口,提供者进行发布该服务给消费者获取使用)
    - consumer 消费层(调用provider, 可以理解为普通的controller层)
    - provider 最终提供服务层(为consumer提供服务, 主要是集成了service,mapper/dao 层以及biz(对service进行包装和业务处理的业务层))


    provider可以有多个例如 : 订单服务, 用户管理服务, 商品管理服务, 抢购服务, 购物车服务, 支付服务, 评论服务, 会员服务, 搜索服务, 秒杀服务等等模块
    consumer也可以针对不同的服务增加不同的消费者,例如: 订单服务消费者, 用户管理服务消费者, 商品管理服务消费者等等.

    整体架构示意如下:
      前端(网站/APP) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
          (并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
          (并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
          (并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
          (并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服务
      管理后台(网站) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
          (并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
          (并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
          (并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
          (并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服

    有问题可以在下方留言,可以贴上错误代码!

  • 相关阅读:
    Android 常见adb命令
    下载安装JDK,并且配置java环境变量
    安装黑苹果教程
    创建不死目录、不死文件
    win10下安装centos7双系统
    Hadoop 3.0完全分布式集群搭建方法(CentOS 7+Hadoop 3.2.0)
    Hadoop 2.0完全分布式集群搭建方法(CentOS7+Hadoop 2.7.7)
    启动HBase脚本start-hbase.sh时报Class path contains multiple SLF4J bindings.解决方法
    HQuorumPeer和QuorumPeerMain进程的区别
    Zookeeper集群安装与配置
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11798626.html
Copyright © 2020-2023  润新知