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.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

项目下载地址:https://github.com/liuhaiquan/dubbo

发布了25 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/liuhaiquan123521/article/details/94004695
今日推荐