Spring Boot集成Dubbo 并且使用使用zookeeper作為注冊中心

Spring Boot集成Dubbo 并且使用使用zookeeper作為注冊中心

前言

本文全程在Windos下操作,大致操作與Linux相差無異辱志,具體細(xì)節(jié)請百度蝠筑,有條件的可以谷歌!

需要了解的知識點(diǎn)

  • Dubbo 和 zookeeper 環(huán)境以及了解這兩個是個什么東東
  • Spring Boot 知識點(diǎn)揩懒,僅限于包結(jié)構(gòu) pom依賴 繼承等
  • Maven 聚合工程
  • JDK 和 tomcat 環(huán)境配置等

首先環(huán)境配置

JDK 8
Maven 3.x
Spring Boot 1.5.22
tomcat 8.x
Mysql 5.5
dubbo 2.5.4
zookeeper 3.5.8

關(guān)于Dubbo 什乙、zookeeper 以及微服務(wù)是什么東西,請百度已球,如不知道就不要往下看了臣镣。

首選需要了解和安裝Dubbo 和 zookeeper 環(huán)境 可以查看 Windows下搭建dubbo和zookeeper環(huán)境

搭建Maven聚合項(xiàng)目

先新建父級工程

在這里插入圖片描述

輸入項(xiàng)目名和groupid 和 ArtifactId

在這里插入圖片描述

然后在父級包上右鍵新建Module


在這里插入圖片描述

如下圖,點(diǎn)擊完成即可退疫。

在這里插入圖片描述

等等新建結(jié)束后點(diǎn)擊父級pom
可以看到子maven模塊


在這里插入圖片描述

項(xiàng)目結(jié)構(gòu)

在這里插入圖片描述

新建后的pom文件

<?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.gamll</groupId>
    <artifactId>gamll-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <description>父級maven</description>

    <modules>
        <module>gmall-api</module>
<!--        <module>gmall_user</module>-->
        <module>gmall-common-util</module>
        <module>service-util</module>

        <module>gmall-user-service-dir/gmall-user-service</module>
        <module>gmall-user-service-dir/gmall-user-web</module>

    </modules>


</project>

引入Spring Boot 依賴后 和 部分依賴后,依賴維護(hù)

<?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.gamll</groupId>
    <artifactId>gamll-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <description>父級maven</description>


    <modules>
        <module>gmall-api</module>
<!--        <module>gmall_user</module>-->
        <module>gmall-common-util</module>
        <module>service-util</module>

        <module>gmall-user-service-dir/gmall-user-service</module>
        <module>gmall-user-service-dir/gmall-user-web</module>

    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.22.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>pom</packaging>


    <!-- 定義依賴版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <fastjson.version>1.2.46</fastjson.version>
        <dubbo-starter.version>1.0.10</dubbo-starter.version>
        <dubbo.version>2.6.0</dubbo.version>
        <zkclient.version>0.10</zkclient.version>
        <mybatis.version>1.3.1</mybatis.version>
        <nekohtml.version>1.9.20</nekohtml.version>
        <xml-apis.version>1.4.01</xml-apis.version>
        <batik-ext.version>1.9.1</batik-ext.version>
        <jsoup.version>1.11.2</jsoup.version>
        <httpclient.version>4.5.5</httpclient.version>
        <commons-lang3.version>3.7</commons-lang3.version>
        <mapper-starter.version>1.2.3</mapper-starter.version>
        <jedis.version>2.9.0</jedis.version>
        <jest.version>5.3.2</jest.version>
        <jna.version>4.5.1</jna.version>
        <beanUtils.version>1.9.3</beanUtils.version>
    </properties>



    <!--依賴維護(hù)-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>

            <dependency>
                <groupId>com.gitee.reger</groupId>
                <artifactId>spring-boot-starter-dubbo</artifactId>
                <version>${dubbo-starter.version}</version>
            </dependency>

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>


            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
                <version>${nekohtml.version}</version>
            </dependency>

            <dependency>
                <groupId>xml-apis</groupId>
                <artifactId>xml-apis</artifactId>
                <version>${xml-apis.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.xmlgraphics</groupId>
                <artifactId>batik-ext</artifactId>
                <version>${batik-ext.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>${jsoup.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${httpclient.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>


            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>${mapper-starter.version}</version>
            </dependency>

            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>${jedis.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
            <dependency>
                <groupId>io.searchbox</groupId>
                <artifactId>jest</artifactId>
                <version>${jest.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
            <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>${jna.version}</version>
            </dependency>

            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>${beanUtils.version}</version>
            </dependency>

        </dependencies>


    </dependencyManagement>


</project>

gmall-api

存放實(shí)體類,和定義service接口

在這里插入圖片描述

gmall-common-util

存放一些通用的工具方法以及service和controller都通用的依賴


在這里插入圖片描述

service-util

存放service需要的一些依賴 比如數(shù)據(jù)庫驅(qū)動 redis等测暗。


在這里插入圖片描述

然后gmall-user-service-dir 文件夾存放 dubbo 服務(wù)提供者和消費(fèi)者

新建如上所示

gmall-user-service 服務(wù)提供者
gmall-user-web 消費(fèi)者

在這里插入圖片描述

以上每個子模塊 中繼承父級的pom依賴

 <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

這里只貼gmall-common-util的pom文件稳摄,其他子模塊結(jié)構(gòu)的都一樣

<?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">
   
   <!-- 繼承父級的maven依賴-- >
    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gmall-common-util</artifactId>

 
</project>

各模塊引入自己的依賴jar

gmall-common-util

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gmall-common-util</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

        <!--dubbo框架依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <!--排除log4g12日志-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--與sb整合 dubbo-->
        <dependency>
            <groupId>com.gitee.reger</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
        </dependency>


    </dependencies>

</project>

gmall-api

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gmall-api</artifactId>
    <description>用戶實(shí)體類服務(wù)</description>


    <dependencies>

        <!--通用mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>
</project>

gmall-user-service

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.gmall</groupId>
    <artifactId>gmall-user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gmall-user-service</name>
    <description>用戶服務(wù)生產(chǎn)者 , 也就是dubbo 提供端</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.gamll</groupId>
            <artifactId>gmall-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.gamll</groupId>
            <artifactId>service-util</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


        <dependency>
            <groupId>com.gmalluser</groupId>
            <artifactId>gmall_user</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

gmall-user-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.gmall</groupId>
    <artifactId>gmall-user-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gmall-user-web</name>
    <description>用戶服務(wù)消費(fèi)者  也就是dubbo 消費(fèi)端 對外的接口</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.gamll</groupId>
            <artifactId>gmall-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.gamll</groupId>
            <artifactId>service-util</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
     <!--   Description:

        Cannot determine embedded database driver class for database type NONE-->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

service-util

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>gamll-parent</artifactId>
        <groupId>com.gamll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-util</artifactId>

    <dependencies>

        <dependency>
            <groupId>com.gamll</groupId>
            <artifactId>gmall-common-util</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>


        <!--通用mapper -->
        <!-- <dependency>
             <groupId>tk.mybatis</groupId>
             <artifactId>mapper-spring-boot-starter</artifactId>
             <version>1.2.3</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-jdbc</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
 -->

    </dependencies>


</project>

搭建dobbo提供者和消費(fèi)者

maven子模塊服務(wù)提供者gmall-user-service和消費(fèi)者 gmall-user-web

服務(wù)提供者

這里面新建 數(shù)據(jù)庫訪問 和 和 service實(shí)現(xiàn)類 同時在yml里配置將服務(wù)注冊到 中

在這里插入圖片描述

UmsMemberMapper

這里面提供dao查詢接口 繼承通用mapper接口

實(shí)體類依賴在gmall-api模塊中
Mapper依賴在service-util模塊中

@Mapper
public interface UmsMemberMapper extends tk.mybatis.mapper.common.Mapper<UmsMember> {

    /**
     * 查詢所有
     * @return
     */
    List<UmsMember> selectAllUmsMebers();
}

UmsMemberMapper.xml

<?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.gmall.gmall.user.service.dao.UmsMemberMapper">
    <resultMap id="BaseResultMap" type="com.gamll.api.bean.UmsMember">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="member_level_id" property="memberLevelId" jdbcType="BIGINT"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="password" property="password" jdbcType="VARCHAR"/>
        <result column="nickname" property="nickname" jdbcType="VARCHAR"/>
        <result column="phone" property="phone" jdbcType="VARCHAR"/>
        <result column="status" property="status" jdbcType="INTEGER"/>
        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
        <result column="icon" property="icon" jdbcType="VARCHAR"/>
        <result column="gender" property="gender" jdbcType="INTEGER"/>
        <result column="birthday" property="birthday" jdbcType="DATE"/>
        <result column="city" property="city" jdbcType="VARCHAR"/>
        <result column="job" property="job" jdbcType="VARCHAR"/>
        <result column="personalized_signature" property="personalizedSignature" jdbcType="VARCHAR"/>
        <result column="source_type" property="sourceType" jdbcType="INTEGER"/>
        <result column="integration" property="integration" jdbcType="INTEGER"/>
        <result column="growth" property="growth" jdbcType="INTEGER"/>
        <result column="luckey_count" property="luckeyCount" jdbcType="INTEGER"/>
        <result column="history_integration" property="historyIntegration" jdbcType="INTEGER"/>
    </resultMap>
    <sql id="Base_Column_List">
    id, member_level_id, username, password, nickname, phone, status, create_time, icon, 
    gender, birthday, city, job, personalized_signature, source_type, integration, growth, 
    luckey_count, history_integration
  </sql>

    <!--  查詢所有-->
    <select id="selectAllUmsMebers" resultType="com.gamll.api.bean.UmsMember">
        select
        <include refid="Base_Column_List"/>
        from ums_member
    </select>

</mapper>

ums_member sql語句

CREATE TABLE `ums_member` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `member_level_id` bigint(20) DEFAULT NULL,
  `username` varchar(64) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(64) DEFAULT NULL COMMENT '密碼',
  `nickname` varchar(64) DEFAULT NULL COMMENT '昵稱',
  `phone` varchar(64) DEFAULT NULL COMMENT '手機(jī)號碼',
  `status` int(1) DEFAULT NULL COMMENT '帳號啟用狀態(tài):0->禁用;1->啟用',
  `create_time` datetime DEFAULT NULL COMMENT '注冊時間',
  `icon` varchar(500) DEFAULT NULL COMMENT '頭像',
  `gender` int(1) DEFAULT NULL COMMENT '性別:0->未知目尖;1->男;2->女',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `city` varchar(64) DEFAULT NULL COMMENT '所做城市',
  `job` varchar(100) DEFAULT NULL COMMENT '職業(yè)',
  `personalized_signature` varchar(200) DEFAULT NULL COMMENT '個性簽名',
  `source_type` int(1) DEFAULT NULL COMMENT '用戶來源',
  `integration` int(11) DEFAULT NULL COMMENT '積分',
  `growth` int(11) DEFAULT NULL COMMENT '成長值',
  `luckey_count` int(11) DEFAULT NULL COMMENT '剩余抽獎次數(shù)',
  `history_integration` int(11) DEFAULT NULL COMMENT '歷史積分?jǐn)?shù)量',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`),
  UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='會員表';

服務(wù)提供者類

UmsMemberServiceImpl

需要注意的是以前我們在單體服務(wù)中 service實(shí)現(xiàn)類采用Spring 提供的@service注解將bean注入到IOC容器中
但現(xiàn)在我們是用dubbo實(shí)現(xiàn)微服務(wù)洞拨,需要使用dubbo的@service注解將該服務(wù)注冊到zookeeper中烦衣,讓消費(fèi)者從容器中獲取進(jìn)行消費(fèi)秸歧。

顧名思義就是提供服務(wù)供別人調(diào)用的键菱,相當(dāng)于spring中的Service的實(shí)現(xiàn)類。 使用也很簡單侵蒙,就是一個注解加一份配置 提供端在實(shí)現(xiàn)類上增加注解 @Service蘑志,和spring的是一樣的但是引的包是不一樣的。

package com.gmall.gmall.user.service.impl;


import com.alibaba.dubbo.config.annotation.Service;
import com.gamll.api.bean.UmsMember;
import com.gamll.api.service.UmsMemberService;
import com.gmall.gmall.user.service.dao.UmsMemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service //這里@Service 注解需要使用dubbo 的注解
public class UmsMemberServiceImpl implements UmsMemberService {


    @Autowired
    private UmsMemberMapper umsMemberMapper;

    @Override
    public List<UmsMember> getUmsMemberList() {

        return umsMemberMapper.selectAllUmsMebers();
    }

    @Override
    public UmsMember findUmsMemberById(long id) {

        return umsMemberMapper.selectByPrimaryKey(id);
    }

    @Override
    @Transactional(rollbackFor = {Exception.class,RuntimeException.class})
    public int addUmsMember(UmsMember umb) {
        return umsMemberMapper.insert(umb);
    }


    @Override
    @Transactional(rollbackFor = {Exception.class,RuntimeException.class})
    public int updateUmsMember(UmsMember umb) {

        return umsMemberMapper.updateByPrimaryKey(umb);
    }


}

main方法
需要開啟Mapper掃描 這里使用了通用Mapper 必須用到通用mapper的@MapperScan注解掃描mapper
以及開啟事務(wù)

@SpringBootApplication
@tk.mybatis.spring.annotation.MapperScan("com.gmall.gmall.user.service.dao")
@EnableTransactionManagement
public class GmallUserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GmallUserServiceApplication.class, args);
    }

}

最后yml中配置注冊中心以及dubbo中的服務(wù)信息以及mybatis的配置


server:
  port: 10002

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/gmall0105?useunicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name:  com.mysql.jdbc.Driver

  dubbo:
    # dubbo中的服務(wù)名稱
    application:
      name: user-service-server
    protocol:
      # dubbo中的通信協(xié)議名稱
      name:  dubbo
    registry:
      # zookeeper注冊中心的地址加端口號
      address: 127.0.0.1:2181
      # zookeeper注冊中心協(xié)議
      protocol: zookeeper
    # dubbo的服務(wù)掃描路徑
    base-package: com.gmall



#mybatis 映射 xml和pojo映射
mybatis:
  type-aliases-package: com.gmalluser.pojo
  mapper-locations: classpath:mapper/*.xml


logging:
  level: debug

最后啟動一下Spring Boot
別忘了啟動dubbo和zookeeper

在這里插入圖片描述

可以看到已經(jīng)將服務(wù)注冊到zookeeper中了

打開dubbo服務(wù)監(jiān)控頁面

在這里插入圖片描述

可以看到服務(wù)提供者

服務(wù)消費(fèi)者

上面已經(jīng)將服務(wù)注冊到zookeeper中了请敦,這里我們將服務(wù)拿出來進(jìn)行消費(fèi)

在這里插入圖片描述

首先配置Yml

配置注冊地址端口等協(xié)議

server:
  port: 10003



spring:
  dubbo:
    # dubbo中的服務(wù)名稱
    application:
      name: user-web
    protocol:
      # dubbo中的通信協(xié)議名稱
      name:  dubbo
    registry:
      # zookeeper注冊中心的地址加端口號
      address: 127.0.0.1:2181
      # zookeeper注冊中心協(xié)議
      protocol: zookeeper
    # dubbo的服務(wù)掃描路徑
    base-package: com.gmall
    consumer:
      # 訪問提供端服務(wù)的超時時間,默認(rèn)是1000毫秒
      timeout: 30000
      # 是啟動消費(fèi)端時匣椰,是否檢查服務(wù)端能否正常訪問禽笑。如果選擇true佳镜,那啟動消費(fèi)端時蟀伸,必須保證提供端服務(wù)正常唤崭,否則接口無法注入
      check: false


UmsMemberController

新建controller 消費(fèi)服務(wù)查詢數(shù)據(jù)

以前在單體中我們是從IOC容器中將bean拿出來然后調(diào)用方法進(jìn)行查詢,但在dubbo分布式項(xiàng)目中是用dubbo 的service 也就是用@Reference 將服務(wù)從zookeeper拿出來芦疏,注入到controller中 然后調(diào)用指定方法進(jìn)行查詢

@RequestMapping("/api/umb")
@RestController
public class UmsMemberController {

    //dubbo 的service
    @Reference
    private UmsMemberService umsMemberService;

    @RequestMapping("/findAll")
    public List<UmsMember> all() {
        return umsMemberService.getUmsMemberList();
    }


    @RequestMapping("/findById")
    public UmsMember all(long id) {
        return umsMemberService.findUmsMemberById(id);
    }


}

然后啟動消費(fèi)者

如果啟動報錯

java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
    at com.alibaba.dubbo.config.AbstractConfig.toString(AbstractConfig.java:474) ~[dubbo-2.6.2.jar:2.6.2]
    at java.lang.String.valueOf(String.java:2994) [na:1.8.0_181]
    at java.lang.StringBuilder.append(StringBuilder.java:131) [na:1.8.0_181]
    at com.alibaba.dubbo.config.spring.beans.factory.annotation.AbstractAnnotationConfigBeanBuilder.build(AbstractAnnotationConfigBeanBuilder.java:79) [dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildReferenceBean(ReferenceAnnotationBeanPostProcessor.java:385) [dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.access$100(ReferenceAnnotationBeanPostProcessor.java:65) [dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor$ReferenceFieldElement.inject(ReferenceAnnotationBeanPostProcessor.java:363) [dubbo-2.6.2.jar:2.6.2]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.postProcessPropertyValues(ReferenceAnnotationBeanPostProcessor.java:92) [dubbo-2.6.2.jar:2.6.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1400) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1247) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1395) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at com.springboot.dubbo.DubboApplication.main(DubboApplication.java:12) ~[classes/:na]
Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.spring.boot.service.UserService. No provider available for the service com.spring.boot.service.UserService from the url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=spring-boot-dubbo-consumer&dubbo=2.6.2&interface=com.spring.boot.service.UserService&methods=getUser&pid=40168&register.ip=192.168.1.5&side=consumer&timestamp=1553586960033 to the consumer 192.168.1.5 use dubbo version 2.6.2
    at com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:422) ~[dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:333) ~[dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:163) ~[dubbo-2.6.2.jar:2.6.2]
    at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:66) ~[dubbo-2.6.2.jar:2.6.2]
    ... 43 common frames omitted

是因?yàn)?main方法上服務(wù)提供者的主類上沒有配置注解

@SpringBootApplication
@EnableDubbo
public class GmallUserWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(GmallUserWebApplication.class, args);
    }

}

然后啟動即可

可以發(fā)現(xiàn)成功注冊


在這里插入圖片描述

調(diào)用查詢接口測試

發(fā)現(xiàn)成功查詢出數(shù)據(jù)


在這里插入圖片描述

分布式就可以基于這種方式實(shí)現(xiàn)不同模塊間的調(diào)用。每一個實(shí)現(xiàn)服務(wù)的消費(fèi)端和提供端分離被济。

dubbo和zookeeper分布式架構(gòu)


在這里插入圖片描述

執(zhí)行流程:

  • Provider:服務(wù)的提供者只磷,負(fù)責(zé)對外提供服務(wù)钮追,提供者在啟動的時候元媚,需要向Registry注冊自己能夠提供
    的服務(wù)
  • Consumer:服務(wù)的消費(fèi)者,消費(fèi)者在啟動的時候鞠绰,需要向Registry訂閱自己需要的服務(wù)
  • Registry:注冊中心飒焦,授受注冊和訂閱,會異步的通知訂閱者驴一,向消費(fèi)者提供服務(wù)列表
    當(dāng)消費(fèi)者需要執(zhí)行遠(yuǎn)程過程調(diào)用時肝断,會從Registry獲取到服務(wù)地址列表(基于負(fù)載均衡算法)進(jìn)行調(diào)用胸懈,
    如果調(diào)用失敗會重新選擇新的提供者再次調(diào)用
  • Monitor:監(jiān)控中心趣钱,統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時間,服務(wù)消費(fèi)者和提供者會在內(nèi)存中累計(jì)調(diào)用次數(shù)和
    調(diào)用時間枢劝,定時每分鐘向監(jiān)控中心發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)

代碼地址 分支 gmall0105

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末低矮,一起剝皮案震驚了整個濱河市被冒,隨后出現(xiàn)的幾起案子昨悼,更是在濱河造成了極大的恐慌率触,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细燎,死亡現(xiàn)場離奇詭異悼凑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渐夸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桃纯,“玉大人态坦,你說我怎么就攤上這事伞梯∶战耄” “怎么了喻旷?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锋谐。 經(jīng)常有香客問我截酷,道長三热,這世上最難降的妖魔是什么三幻? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任从藤,我火速辦了婚禮夷野,結(jié)果婚禮上悯搔,老公的妹妹穿的比我還像新娘通危。我一直安慰自己灌曙,他們只是感情好逆害,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布魄幕。 她就那樣靜靜地躺著纯陨,像睡著了一般翼抠。 火紅的嫁衣襯著肌膚如雪机久。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天尤误,我揣著相機(jī)與錄音损晤,去河邊找鬼尤勋。 笑死最冰,一個胖子當(dāng)著我的面吹牛赌朋,可吹牛的內(nèi)容都是我干的沛慢。 我是一名探鬼主播团甲,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圾另!你這毒婦竟也來了集乔?” 一聲冷哼從身側(cè)響起扰路,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤汗唱,失蹤者是張志新(化名)和其女友劉穎哩罪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框弛,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗搞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溅呢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐旧。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伊约,靈堂內(nèi)的尸體忽然破棺而出屡律,到底是詐尸還是另有隱情降淮,我是刑警寧澤超埋,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站佳鳖,受9級特大地震影響霍殴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜系吩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一来庭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穿挨,春花似錦尊搬、人聲如沸冀泻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苗傅。三九已至趣竣,卻和暖如春单匣,著一層夾襖步出監(jiān)牢的瞬間转砖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工蝌焚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖食,地道東北人蔑穴。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓纵朋,卻偏偏與公主長得像聂薪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腻要,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353