springMVC + Dubbo + zooKeeper超详细 步骤
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.5mkdir data
第五步:
进入到conf目录,把zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper在启动时会找这个文件作为默认配置文件
cd /usr/local/zookeeper/zookeeper-3.4.5/confmv 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 {@Autowiredprivate 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://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.xsdhttp://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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://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
项目下载地址:https://github.com/liuhaiquan/dubbo
springMVC + Dubbo + zooKeeper超详细 步骤相关推荐
- Zookeeper超详细的面试题
转载自 Zookeeper超详细的面试题 1.ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管 ...
- 四、Hive数据仓库应用之Hive数据查询语言(一)(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)
Hive远程模式部署参考: 一.Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7) Hive数据定义语言 ...
- 大数据基础学习三:Ubuntu下安装VMware Tools超详细步骤及需要注意的问题(以ubuntu-18.04.3、Mware Workstation 15.1.0 Pro为例)
大数据基础学习三:Ubuntu下安装VMware Tools超详细步骤及需要注意的问题 (以ubuntu-18.04.3.Mware Workstation 15.1.0 Pro for Window ...
- mysql连接idea详细教程_idea配置连接数据库的超详细步骤
学习时,使用IDEA的时候,需要连接Database,连接时遇到了一些小问题,下面记录一下操作流程以及遇到的问题的解决方法. 一. 连接操作 简介:介绍如何创建连接,具体连接某个数据库的操作流程. 1 ...
- 苹果手机mov文件如何复制到电脑_如何在手机上访问电脑上的文件(超详细步骤) iPhone版...
之前分享了如何在两台电脑上共享文件,如需访问可点击如下链接: Town-Tree:如何在两台电脑之间共享文件(超详细步骤)zhuanlan.zhihu.com 如何在安卓手机上访问电脑上的文件,可点 ...
- 三、Hive数据仓库应用之Hive数据操作语言(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)
Hive远程模式部署参考: 一.Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7) Hive数据定义语言 ...
- 如何发布自己的npm包(超详细步骤,博主都在用)
发布自己的npm超详细步骤 前沿: 从去年毕业,vue掌握的还算熟练应用了,做过的vue项目也有十几个了吧,每次做项目的时候,有些组件老是使用,拷贝来拷贝去的使用.我就想把这些组件封装到一起,以后做项 ...
- python操作手机app超详细步骤
〝 古人学问遗无力,少壮功夫老始成 〞 python操作手机app超详细步骤,现在很多app的都要刷经验打怪升级啥的,这些枯燥千篇一律但是很耗费时间的玩法,可以使用app自动去操作,解放双手,释放时间 ...
- 最全自建蚂蚁(leanote)笔记超详细步骤
服务器(Windows系统)自建蚂蚁(leanote)笔记超详细步骤(包含数据备份和数据还原) 需要依赖(工具) 轻量服务器(云服务器)一台 -- 环境Windows Server 2019 Mong ...
最新文章
- SGS 客户端协议解析
- rfid2-micro2440,keil4裸机
- linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战
- github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...
- idea tomcat部署web项目_项目开发之部署帆软到Tomcat服务一
- c语言循环字符,字符串 非暴力for循环法(内附C语言代码)
- 论文浅尝 | 可建模语义分层的知识图谱补全方法
- Activiti 基础概念
- request.getParameter() 和request.getAttribute() 区别
- leetcode @python 130. Surrounded Regions
- 如何从JQuery中的each()函数中断/退出? [重复]
- Helm 3 完整教程(十二):Helm 函数讲解(6)字典函数
- TV直播app TV版 超级直播 空壳 可玩性强 带EPG 带回看 带自定义 定制可带自定义协议等
- 用python实现文件加密功能
- linux 域名劫持,域名被劫持处理方案
- 计算机应用基础在线3,《计算机应用基础》第3阶段在线作业3.docx
- 新刷的小米手机系统没有便签,刷系统清除数据怎么恢复
- 如何阅读《深入理解计算机系统》
- android 设备最大像素,最高2100万像素镜头 拍照强悍手机盘点
- [数据结构] UVa1471 Defense Lines 防线