zoukankan      html  css  js  c++  java
  • 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消息队列 --> 通用支撑系统(推送等)
          (并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服

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

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11798626.html
Copyright © 2011-2022 走看看