springMVC + Dubbo + zooKeeper超详细 步骤
项目目录结构如下图:maven 聚合工程搭建工程创建父工程选择 Maven Project---------> NextNext填写相应信息,打包方式选择pom。点击Finsh 。完成工程创建打开父工程的POM。添加以下依赖<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://...
linux 安装 zookeeper
在linux上安装ZooKeeper
第一步
安装jdk
第二步:
将Zookeeper 压缩包上传到linux 系统
第三步:
新建zookeeper目录
mkdir /usr/local/zookeeper
回到zookeeper 压缩包所在路径,解压文件到指定目录
tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/zookeeper/
第四步:
进入到zookeeper-3.4.5目录,创建data文件夹
cd /usr/local/zookeeper/zookeeper-3.4.5
mkdir data
第五步:
进入到conf目录,把zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper在启动时会找这个文件作为默认配置文件
cd /usr/local/zookeeper/zookeeper-3.4.5/conf
mv zoo_sample.cfg zoo.cfg
第六步:
配置zookeeper
vim zoo.cfg
配置文件中的dataDir对应的路径为上面创建data文件夹 的路径
•tickTime:这个时间是作为Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
•dataDir:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
•dataLogDir:顾名思义就是Zookeeper 保存日志文件的目录
•clientPort:这个端口就是客户端连接Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
第七部:
启动ZooKeeper
cd /usr/local/zookeeper/zookeeper-3.4.5/bin
./zkServer.sh start
查看ZooKeeper 状态
./zkServer.sh status
关闭 Zookeeper
./zkServer.sh stop
项目目录结构如下图:maven 聚合工程
搭建工程
创建父工程
选择 Maven Project ---------> Next
Next
填写相应信息,打包方式选择pom。点击Finsh 。完成工程创建
打开父工程的POM。添加以下依赖
<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.kavin</groupId>
<artifactId>dubbo-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging
<!-- jar 包版本管理 -->
<properties>
<dubbo.version>2.6.2</dubbo.version>
<spring.version>4.3.16.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<junit.version>4.11</junit.version>
<logback.version>1.0.13</logback.version>
<jcl-over-slf4j.version>1.7.5</jcl-over-slf4j.version>
<jdk.version>1.8</jdk.version>
<encoding>UTF-8</encoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-config-spring</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- zookeeper注册中心 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-remoting-netty</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--spring core-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcl-over-slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<finalName>dubbo-parent</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
创建 dubbo-api 子模块
勾选 Create a simple project。填写Moudle Name ,然后点击 Next
选择打包方式为 jar 。点击finsh 完成
创建 dubbo-provider 和 dubbo-consumer WEB工程
选择Maven Moudle ,点击Next
不勾选Create a Simple project, 点击Next
选择最后一版本,然后点击 Next
点击Next
dubbo-provider 同 dubbo-consumer 一样创建工程。
至此 整个聚合工程搭建完成
创建需要的JAVA 类
在 dubbo-api 中创建提供的服务接口
package com.kavin.api;
import java.util.List;
/**
* dubbo 对外提供的服务接口
* @author Kavin
*
*/
public interface UserService {
public String sayHello(String name);
}
在dubbo-provider 创建 接口的实现类。在该实现类上加上dubbo提供的@Service注解,注册暴露服务,在dubbo的配置文件中扫描带有此注解的服务,注册到zookeeper
package com.kavin.provider.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.kavin.api.UserService;
import com.kavin.pojo.User;
import java.util.ArrayList;
import java.util.List;
@Service //使用dubbo提供的service注解,注册暴露服务
public class UserServiceImpl implements UserService{
public String sayHello(String name) {
return "Hello " + name;
}
}
在dubbo-consumer 项目中编写 LoginService 调用dubbo暴露的接口
package com.kavin.consumer.service;
import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.kavin.api.UserService;
@Service
public class LoginService {
@Reference //使用dubbo提供的reference注解引用远程服务
private UserService userService;
public String getMsg() {
return userService.sayHello("张三");
}
}
controller调用LoginService
package com.kavin.consumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.kavin.consumer.service.LoginService;
@Controller
public class commonController {
@Autowired
private LoginService loginService;
@RequestMapping("/")
public String getUser() {
System.out.println(loginService.getMsg());
return "index";
}
}
编写配置文件
配置服务提供者端(dubbo-provider项目)的dubbo配置文件 spring-dubbo
<?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:application name="hello-world-app1"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20881" />
<dubbo:service interface="com.yangs.test.service.DemoServer" ref="demoService" />
<bean id="demoService" class="com.yangs.test.service.impl.DemoServerImpl" /> -->
<!-- 以上是配置实现,下面使用注解实现 -->
<dubbo:application name="dubbo-provider"/>
<dubbo:registry protocol="zookeeper" address="192.168.140.132:2181" />
<dubbo:protocol name="dubbo" port="20881" />
<!-- 在配置文件中加上<dubbo:annotation>,是dubbo的扫描标签,它除了会扫描带有
'@Component'、'@Service'、'@Controller'注解的类,把它们注册成SpringBean之外,
它还会扫描带有”@Service” (dubbo的service标签)的接口实现类发布服务(必须有实现接口,不然或抛出BeanCreationException异常)
。同时在要发布服务的接口实现类上加上”@Service” (dubbo的service标签)。启动服务器,服务就发布成功了。 -->
<dubbo:annotation package="com.kavin.provider"/>
</beans>
配置服务提供者端(dubbo-consumer项目)的dubbo配置文件 root-dubbo
<?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:application name="hello-world-app"/>
<
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.yangs.test.service.DemoServer" ref="demoService" />
<bean id="demoService" class="com.yangs.test.service.impl.DemoServerImpl" /> -->
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样
192.9.145.19:2181,192.9.145.19:2182,192.9.145.19:2183-->
<dubbo:application name="dubbo-consumer" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.140.132:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService 通过配置实现
<dubbo:reference id="demoService" interface="com.yangs.test.service.DemoServer" />
-->
<!-- 再配置文件中加上<dubbo:annotation>,它会扫描所有注册bean的java类,发现带”@Reference”标签的属性,
它会去寻找发布的provider是否有匹配的接口,有就自动注入。 -->
<dubbo:annotation package="com.kavin.consumer"/>
</beans>
配置dubbo-consumer 的spring 包扫描配置文件,把扫描路径下的包的javaBean加载到spring容器中
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 开启注解扫描 扫描spring注解注册到spring容器中 -->
<context:component-scan base-package="com.kavin.consumer.service" />
</beans>
配置dubbo-consumer 和 dubbo-provider 配成SpringMVC 架构
编写spring-mvc 配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解扫描 扫描spring注解注册到spring容器中 -->
<context:component-scan base-package="com.kavin.consumer" />
<!-- 配置视图解析器,并指定视图所在的文件夹 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/html/" />
<property name="suffix" value=".html" />
</bean>
<!-- 添加注解驱动 -->
<!-- 注册 HandlerMapping(实现为 DefaultAnnotationHandlerMapping)
和 HandlerAdapter(实现为 AnnotationMethodHandlerAdapter) 两个类型的 Bean,
这两个 Bean 为 @Controllers(所有控制器) 提供转发请求的功能。还有一些其他的为 MVC 提供的功能: -->
<mvc:annotation-driven/>
<!--
通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器
设置不过滤内容,比如:css,js,img 等资源文件
location指的是本地的真实路径,mapping指的是映射到的虚拟路径。
不设置此处否则请求静态资源的请求 会被DispatcherServlet处理 ,从而找不到对应的mapping
-->
<mvc:resources mapping="/html/**" location="/html/"/>
</beans>
配置web.xml 文件
注意:在此处遇到一个坑,就是使用@注解方式调用服务出现空指针异常。
解决方法参考我的另一篇博文https://blog.csdn.net/liuhaiquan123521/article/details/94062904
dubbo-provider 的web.xml 文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>dubbo-consumer</display-name>
<!-- 配置springMVC中央处理器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!-- 加载配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 指定需要过滤的请求 Mapping 【/】 表示所有请求 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
dubbo-consumer 的web.xml配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"context
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>dubbo-consumer</display-name>
<!-- 根上下文加载配置文件【root-dubbo.xml 和 root- context.xml】 dubbo的文件加载到spring容器中, spring容器才能解析dubbo的注解。而下面的springMVC则无法识别dubbo注解 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/root-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置springMVC中央处理器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!-- 加载配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 指定需要过滤的请求 Mapping 【/】 表示所有请求 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
至此.整个工程已经构建完毕了。
mvn 打包测试
右键 dubbo-parent -----> run as -----maven build
在弹出框中找到Goals 输入 命令 clean package ,点击 run 进行打包
控制台出现 xxxxxx …success 说明打包成功
打包之后如果项目出现红叉。可以 dubbo-parent 右键 maven ----update project
运行
添加Tomcat 。运行打包好的war 包
点击要运行的项目 右键 properties
选择要添加的tomcat 版本,点击Next
配置Tomcat
选择配置好的tomcat
在server 视图下添加 server
选择刚才添加好的tomcat 添加到server,点击finish 完成
右键tomcat ----->Add and Remove
点击Add All,点击Finish完成部署
右键tomcat ------open 修改 tomcat 的部署地址为 当前tomcat的webapps路径
运行
测试
在浏览器输入localhost:${端口号}/dubbo-consumer
访问的controller 返回index页面,然后看控制台发现接口已经成功调用了
总结:在搭建过程中遇到两个头疼的问题
1:jar包冲突问题:详情参考我的博客https://blog.csdn.net/liuhaiquan123521/article/details/93895944
2.使用注dubbo解方式调用服务出现空指针异常。参考我的博文https://blog.csdn.net/liuhaiquan123521/article/details/94062904
更多推荐
所有评论(0)