IDEA搭建SpringBoot+Dubbo+Zookeeper

2019-07-10  本文已影响0人  crossyf

一、准备工作

1.安装zookeeper

dubbo项目官方建议使用zookeeper做为dubbo的服务注册与发现的注册中心,所以首先需要在服务器中安装zookeeper。我使用的是mac开发,在mac中,首先cd到你要安装的目录,然后使用brew命令brew install zookeeper,等待安装完成后,cd到Cellar,然后cd zookeeper/3.4.13/bin,

image.png image.png image.png
在bin中执行zkServer start,运行zookeeper image.png
brew安装好的zookeeper是配置好的,不用手动去配置zoo.cfg文件,如果要手动修改配置文件的话,可以在安装根目录中进入/etc/zookeeper目录修改zookeeper
image.png
image.png

2.部署dubbo后台管理

打开dubboGithub链接,下载zip文件,然后使用maven进行打包,然后在dubbo-admin-servertarget中得到dubbo-admin-server-0.1.jar,

image.png
拷贝jar包到其他目录中,这里我拷贝到本地tomcatwebapps中,使用命令java -jar dubbo-admin-server-0.1.jar运行项目,然后就可以本地通过localhost:8080访问dubbo管理后台了。
image.png
这里可以看到注册到后台的接口等其他信息,暂时还没有详细研究。

二、正式创建项目

1.创建多模块项目

使用idea新建一个Spring Initializr项目

image.png
配置Group``Artifact
image.png
一直next到项目创建

在打开的dubbo项目中右击新建module

image.png
image.png
依次创建dubbo-apidubbo-serverdubbo-web 三个模块,其中api是提供接口,server是接口的实现类。

2.配置项目

创建好项目后要分别配置一下项目的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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.crossyf.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo</name>
    <description>Demo project for Spring Boot</description>
    <packaging>pom</packaging>
    <modules>
        <module>dubbo-api</module>
        <module>dubbo-service</module>
        <module>dubbo-web</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>
        <boot.version>2.1.6.RELEASE</boot.version>
        <tomcat.version>8.5.42</tomcat.version>
        <dubbo.version>2.0.0</dubbo.version>
        <zookeeper.version>3.4.10</zookeeper.version>
        <zkclient.version>0.5</zkclient.version>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- alibaba dubbo-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!-- ZooKeeper client -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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


</project>

apipom

<?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>
    <parent>
        <groupId>com.crossyf.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>jar</packaging>
    <artifactId>dubbo-api</artifactId>
    <groupId>com.crossyf.dubbo</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-api</name>
    <url>http://maven.apache.org</url>

    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <start-class>com.crossyf.dubbo.web.DubboWebApplication</start-class>
    </properties>

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



</project>

注意 这里pom里的build标签内的内容,如果不加上这个,sevice运行是没有问题的,但是使用maven构建项目的时候,所有引用到api module里的包名都会报错找不到包名。这里我在这里耽误了很久,找不到问题,最后在这个帖子里找到了答案
https://hbxflihua.iteye.com/blog/2431537

servicepom

<?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>
    <parent>
        <groupId>com.crossyf.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <version>0.0.1-SNAPSHOT</version>
    <url>http://maven.apache.org</url>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <groupId>com.crossyf.dubbo</groupId>
    <artifactId>dubbo-service</artifactId>
    <name>dubbo-service</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>com.crossyf.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>



    <build>
        <finalName>dubbo-service</finalName>

        <resources>
            <resource>
                <targetPath>${project.build.directory}/classes</targetPath>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                </includes>
            </resource>
        </resources>

        <pluginManagement>
            <plugins>
                <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.apache.maven.plugins</groupId>
                                        <artifactId>maven-dependency-plugin</artifactId>
                                        <versionRange>[2.0,)</versionRange>
                                        <goals>
                                            <goal>copy-dependencies</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore />
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <classesDirectory>target/classes/</classesDirectory>
                    <archive>
                        <manifest>
                            <mainClass>com.crossyf.dubbo.service.DubboServiceApplication</mainClass>
                            <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <includeTypes>jar</includeTypes>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

webpom

<?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>
    <parent>
        <groupId>com.crossyf.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.crossyf.dubbo</groupId>
    <artifactId>dubbo-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-web</name>
    <description>Demo project for Spring Boot</description>
    <packaging>war</packaging>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>${project.version}</version>
        </dependency>


        <!-- beetl -->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl-framework-starter</artifactId>
            <version>1.1.22.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>dubbo-web</finalName>
    </build>

</project>

3.配置application.yml文件

serviceapplication.yml如下

  port: 8094
  servlet:
    context-path: /dubbo-service

spring:
  http:
    encoding:
      charset: UTF-8
      force: true
      enabled: true


dubbo:
  application:            #应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
    name: Provide
  registry:                 #注册中心配置,用于配置连接注册中心相关信息。
    address: zookeeper://192.168.3.38:2181
  protocol:     #协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
    name: dubbo
    port: 20880
  scan: com.crossyf.dubbo.service.impl  #服务暴露与发现消费所在的package

webapplication.yml

server:
  port: 8092
  servlet:
    context-path: /dubbo-web
spring:
  http:
    encoding:
      charset: UTF-8
      force: true
      enabled: true
    multipart:


dubbo:
  application:            #应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
    name: Customer
    id: Customer
  registry:                 #注册中心配置,用于配置连接注册中心相关信息。
    address: zookeeper://192.168.3.38:2181
  protocol:
    name: dubbo
    port: 20880

4.编写测试代码

api模块中创建一个接口DemoApi,定义一个方法

 * @author Created by YangFan.
 * @date 2019/7/8
 * 功能:
 */
public interface DemoApi {
    /**
     * 打招呼
     * @param name 名称
     * @return 结果
     */
    String sayHello(String name);
}

然后在service中创建接口的实现类DemoApiImpl

/**
 * @author Created by YangFan.
 * @date 2019/7/8
 * 功能:
 */
@Service
public class DemoApiImpl implements DemoApi {

    @Override
    public String sayHello(String name) {
        return "Hello," + name + " from dubbo Demo2222";
    }
}

web中创建测试控制器DemoController

/**
 * @author Created by YangFan.
 * @date 2019/7/8
 * 功能:
 */
@RequestMapping(value = "/demo")
@RestController
public class DemoController {

    @Reference
    private DemoApi demoApi;

    @RequestMapping(value = "/index")
    public String index(){
        return demoApi.sayHello("dubbo");
    }
}

这里需要注意点地方是,注解@Service是引入的com.alibaba.dubbo.config.annotation.Service的包名。

5.运行测试项目

运行DubboWebApplicationDubboServiceApplication
可以在dubbo后台中发现api已经注册到后台

image.png
然后访问http://localhost:8092/dubbo-web/demo/index,可以返回相关内容
image.png
把项目进行maven打包,service中得到dubbo-service.jar包,将得到的 jar包放在另一台机器中运行,我这里在虚拟机中运行的(拟机环境是centos7),运行后我们在进入dubbo-admin后台中,可以看到DemoAPi就有两个提供者了。
image.png

现在修改当前项目的DemoApiImpl打印的信息,然后重新运行项目,在地址栏输入http://localhost:8092/dubbo-web/demo/index,不断的刷新,可以看到返回的结果是随机的展现出来的,基本完成了dubbozookeeper的项目。

上一篇下一篇

猜你喜欢

热点阅读