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路径,进行测试
