SpringBoot+Dubbo+ZooKeeper+Maven入門實踐

原創:轉載需註明原創地址 http://www.javashuo.com/article/p-aehwoyho-g.html

 

注*** 本實例爲僅適合初學者,關於dubbo和springboot以及各類工具的功能介紹就免了,讀者能夠自行百度,這裏僅示範操做.
html

準備工具(本人所使用工具和版本):前端

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

----------------分割線-----------------------------------------mysql

開始!!!linux

1. 建立一個maven主項目oldhen, 目錄結構和pom.xml以下:web

<?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以後什麼都不用管,下一步.redis

2. 建立model子模塊, 目錄結構和pom.xml以下:spring

<?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實體類以下:sql

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.14\bin目錄下的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消息隊列 --> 通用支撐系統(推送等)
      (並列於服務層的下一級)--> 搜索服務集羣 --> 多個搜索服

 

有問題能夠在下方留言,能夠貼上錯誤代碼!

相關文章
相關標籤/搜索