centOS环境下搭建SpringBoot+Dubbo+ZooKeeper项目

本次搭建的项目涉及到以下几方面的内容:

JDK:ZooKeeper和Tomcat是用Java编写创建,它运行在JVM。所以需要使用JDK 6或更高版本,本次使用的是jdk1.8。

ZooKeeper:用来做Dubbo的注册中心(可选),推荐使用。

Tomcat:作为dubbo-admin(Dubbo提供的监控中心)的web容器。

Dubbo:RPC框架。实现服务的远程调用。(需将其中的dubbo-admin打成war包,单独部署)

接下来说说整个搭建的过程:

安装JDK1.8

将下载好的JDK压缩包上传到Linux服务器你指定的文件夹,我一般是放在/usr/java路径下,然后在当前路径下执行命令:

解压:tar -zxvf jdk-8u251-linux-x64.tar.gz

在当前目录下可以看到我们解压出来的文件

jdk安装好后需要配置环境变量,执行命令

vim /etc/profile

移动到文件的最后添加jdk的环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_251
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

注意:如果你的安装路径不同, 请把第一行换成你的实际安装路径。

执行以下命令检测环境变量是否配置成功。

java -version
安装ZooKeeper

安装ZooKeeper需要使用到root权限,请切换到root用户进行操作。

将下载好的ZooKeeper压缩包上传到Linux服务器你指定的文件夹,我是放在了/root/zkeeper路径下,执行解压命令:

tar -zxvf zookeeper-3.4.14.tar.gz

配置ZooKeeper。在zookeeper-3.4.14目录下创建data文件夹,进入conf目录,将zoo_sample.cfg重命名为zoo.cfg。执行命令:

vim zoo.cfg

修改文件中的以下内容:

dataDir=/root/zkeeper/zookeeper-3.4.14/data

进入bin目录,执行以下命令启动服务:

sh zkServer start
安装Tomcat

将下载好的Tomcat压缩包上传到Linux服务器你指定的文件夹,我是放在了/root/tomcat路径下,然后在当前路径下执行解压命令:

tar -zxvf apache-tomcat-8.5.56.tar.gz

进入bin目录,执行命令以下命令启动tomcat:

./startup.sh
部署dubbo-admin

在本地解压下载好的dubbo源码压缩包。进入dubbo-admin目录下,在当前路径打开命令行工具,输入:mvn clean install(需要本地提前安装好Maven,并配置好环境变量),然后会在其target目录生成一个war包

将生成的dubbo-admin-2.5.8.war上传到Linux服务器Tomcat的webapps目录下,然后到Tomcat的bin目录下执行以下命令启动:

./startup.sh

关闭Tomcat,进入/dubbo-admin-2.5.8/WEB-INF路径下,执行以下命令修改dubbo-admin配置:

vim dubbo.properties

如果ZooKeeper安装在同一台机器则不用修改,下面两行是提供的两个登录账号及密码:

重新启动Tomcat,在本地输入http://ip:8080/dubbo-admin-2.5.8(ip指服务器的IP地址),出现下面页面即启动成功

搭建项目

在Idea中先创建一个Maven项目dubbo-demo,然后在当前项目下新建三个module,分别是common-api,server-consumer,server-provider。具体结构如下:

在dubbo-demo的pom文件中引入下列依赖。(dubbo-demo相当于一个父模块,用来引入一些子模块公共的依赖,这样子模块就不必再单独引入依赖了。通常父模块还会定义一些以来的版本号,防止子模块引入依赖时因版本不兼容产生异常。)

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>

在common-api创建一个HelloServie接口。(common-api主要用来存放公共的Api接口,server-consumer,server-provider模块都需要依赖此模块)

package com.demo.common.api;

public interface HelloService {

    String sayHello(String msg);
}

在server-provider模块的pom文件中引入common-api

<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>common-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.demo.MainApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在server-provider模块中编写HelloServie接口的实现类

package com.demo.provider.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.demo.common.api.HelloService;
//注意此注解是用dubbo提供的,而不是spring提供的
@Service(interfaceClass = HelloService.class)
public class HelloServiceImpl implements HelloService {

    public String sayHello(String msg) {
        return msg;
    }
}

在server-provider模块resource路径下新建application.yml配置文件,配置如下

server:
  port: 9001
dubbo:
  application:
    # 服务名称(唯一)
    name: server-provider
    # 注册中心
  registry:
    # 采用zookeeper作注册中心
    protocal: zookeeper
    # zookeeper地址
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  # 扫描服务的路径
  scan: com.demo.provider.service

创建SpringBoot启动类,至此服务提供者编写完毕

package com.demo;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class MainApplication{

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

在server-consumer模块的pom文件中引入common-api

<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.dj.MainApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

在server-consumer模块中编写HelloController控制器

package com.demo.consumer.controller;

        import com.alibaba.dubbo.config.annotation.Reference;
        import com.demo.common.api.HelloService;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    //使用dubbo的Reference注解注入bean,功能与Autowired的类似;
    //区别是Reference是从其他服务器的IoC容器拿到bean,Autowired是从本机IoC容器中获取
    @Reference
    private HelloService helloService;

    @RequestMapping("sayHello")
    public String sayHello(String msg){
        return helloService.sayHello(msg);
    }
}

在server-consumer模块resource路径下新建application.yml配置文件,配置如下

server:
  port: 9002
dubbo:
  application:
    # 服务名称(唯一)
    name: server-consumer
    # 注册中心
  registry:
    # 采用zookeeper作注册中心
    protocal: zookeeper
    # zookeeper地址
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  scan:
    base-packages: com.demo.consumer

创建SpringBoot启动类,至此服务消费者编写完毕

package com.demo;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubboConfig
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}
部署项目

在父模块执行maven install,会在三个子module中生成对应的jar包

将server-consumer,server-provider模块target路径下的jar包通过ftp上传到Linux服务器的/root/consumer和/root/provider路径下

在provider和consumer路径下分别执行java -jar  server-provider-1.0-SNAPSHOT.jar和java -jar  server-consumer-1.0-SNAPSHOT.jar命令,启动服务提供者和消费者。

启动成功后,可以在dubbo的监控中心中看到提供者和消费者上线

在本机浏览器输入服务器的IP地址及Controller路径,进行测试

发表评论

邮箱地址不会被公开。 必填项已用*标注